一、會議室和物理內存的關係編程
和會議室同樣,內存都被分紅一塊塊兒的,都編號了號,例如3F-10就是三樓十號會議室、內存頁有這樣一個地址。這個地址是實實在在的地址,經過這個地址咱們就可以定位到物理內存地址數據結構
二、會產生什麼問題呢?dom
3F-10打開三個相同的程序,都執行到某一步,比方說,打開三個計算機器,用戶在這三個程序的界面、上分別輸入十、100、1000,若是內存中的這個位置只能保存一個數,函數
那應該保存那個呢?這不就衝突了嗎?spa
三、誰也不能直接訪問物理地址
操作系統
每一個項目的物理地址對於進程不可見,誰也不能直接訪問物理地址,操做系統會給進程分配一個虛擬地址。全部進程看到的這個地址都是同樣的,裏面的內存都是從0開始編號3d
四、在程序裏面,指令寫入的地址是虛擬地址blog
例如,位置我10M的內存區域,操做系統會提供一種機制,將不一樣的進程的虛擬地址和不一樣的物理地址映射起來進程
當程序要訪問虛擬地址的時候,由內核的數據結構轉換,轉換成不一樣的物理地址,這樣不一樣的進程運行的是時候,寫入的是不一樣的物理地址這樣就不會衝突了內存
因而,你看待了項目組的項目計劃是這樣一個程序
#include <stdio.h> #include <stdlib.h> int max_length = 128; char * generate(int length){ int i; char * buffer = (char*) malloc (length+1); if (buffer == NULL) return NULL; for (i=0; i<length; i++){ buffer[i]=rand()%26+'a'; } buffer[length]='\0'; return buffer; } int main(int argc, char *argv[]) { int num; char * buffer; printf ("Input the string length : "); scanf ("%d", &num); if(num > max_length){ num = max_length; } buffer = generate(num); printf ("Random string is: %s\n",buffer); free (buffer); return 0; }
這個程序比較簡單,就是根據用戶輸入的整數來生成字符串,最長是128,因爲字符串的長度不固定、於是不能提早知道,
須要動態地分配內存,是用malloc函數,固然用完了須要釋放內存,這就是要使用free函數
一、那些內存的幾種方式
二、內核部分還須要分配內存
三、上面的這些地址應該用虛擬地址訪問呢?仍是應該用物理地址訪問呢?
真正可以使用會議室物理地址的,只有會議室管理部門,
全部其餘部分的行爲涉及訪問會議室的,都須要通通使用虛擬地址、通通到會議室管理部門哪裏轉換一道,才能進行統一的控制
用戶態的進程的進程使用虛擬地址,這點毫無你問,內核態的頁基本都是使用虛擬地址,
一、一大片連續的內存
二、這個麼大的空間都存些什麼內容呀
雖然內核代碼權限很大,可是可以使用的虛擬地址範圍也只能在內核空間,也即內核代碼訪問內核數據結構,只能用30號到39號這些編程,不能用0-29號,
由於這些事被金額呈空間佔用的,並且、進程有不少個、你如今在內核,可是你不知道當前指的0號是那進程的0號
在內核裏面也會有內核的代碼,一樣有 Text Segment、Data Segment 和BSS Segment,別忘了我們講內核啓動的時候,內核代碼也是 ELF 格式的。
經過這一節,你應該知道,一個內存管理系統至少應該作三件事情:
第一,虛擬內存空間的管理,每一個進程看到的是獨立的、互不干擾的虛擬地址空間;
第二,物理內存的管理,物理內存地址只有內存管理模塊可以使用;
第三,內存映射,須要將虛擬內存和物理內存映射、關聯起來