C 語言開啟乙個檔案時,緩衝區在記憶體的什麼位置?

時間 2021-05-31 23:24:10

1樓:唐浩然

在使用者空間的棧的下方, 堆的上方的 mmap區。

對於系統來說,應用程式的mmap區的檔案可能在作業系統的 pache cache中

2樓:王飛

一般開啟並讀取乙個檔案,傳統方法就是兩個系統呼叫,對吧:

int open (const char '*path', int 'oflag', .../*,mode_t 'mode' */);

ssize_t read(int fd, void *buf, size_t count);

這裡 read 有乙個 buf 緩衝區,這個是由你的應用程式控制的,在你的應用程式虛擬記憶體位址空間中,究竟是堆,還是棧,這個看你宣告 buf 時候是怎麼做的。

不過,核心中,也會有乙個緩衝區,這個你的應用程式是看不見的,當你讀取時,核心會將資料放入自己的緩衝區,然後 copy 到使用者態你程式的緩衝區中。這個東西,在核心叫做 buffer cache,由IO 子系統管理,對於 Unix 系統來說,一般會預留最多 10% 作為 buffer cache 使用。

如果你使用的是 mmap 方法,則會有:

void * mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

這一套過程與上面的 open/read 不同,是由核心分頁子系統管理的,說白了,就是用虛擬記憶體調頁的方式,將檔案直接 map 到程式的位址空間中,這個 map 也是靠核心實現的,這東西叫做 page cache,你也知道虛擬記憶體限制少很多,可以 map 直到占用全部記憶體。

傳統 read/write buffer cache 有個問題,就是一旦固定後,大小沒法調節,這樣分配多了就是浪費,分配少了就會造成很多的上下文切換做 copy 而且這個東西與分頁系統割裂。所以後來就出現了 Unified Buffer Cache,統一用 Page Cache 解決以上問題。

所以你指的緩衝區,那是在核心裡的,不是棧,也不是堆,而是使用如 SLOB/SLAB/SLUB 分配器分配的 VMObjects

用c語言怎麼實現把乙個檔案中所有的字串進行篩選,重複的字串只留下乙個?

NoneType deffunction file,return join set file print function open file name luoxing123 C語言的微笑由我來守護,show you my bug include include include include ty...

C或者C 怎麼監控乙個,檔案改變了(比如txt)?

題主的問題 C或者C 怎麼監控乙個,檔案改變了 比如txt C或者C 怎麼監控乙個檔案改變了 比如txt 意思是 比如C語言執行到某一行,停止了,只有當txt檔案改變了 另外乙個程式向裡面新增了內容 它才讀取txt,然後執行下去。題外題 怎麼暫停程式,等待變化後,讀入資料呢?忘了說明了,Window...

為什麼開啟乙個字型原始檔 ,原始檔內出現的用於評估字型用途的句子大部分使用以下的三個全字母短句(見問題補充)? 它們有什麼來歷嗎?

厲向晨 呃,1 使用這些句子是因為它們既包括了全部的 26 個字母,同時比較簡短.2 這些句子是為了預覽字型的顯示效果,而非評估字型用途.3 這些句子是儲存在預覽程式中的,而不是在字型檔案中 字型檔案中的確也有一項資料是 示例文字 在少數程式比如 OS X 的預覽程式中可以被支援,但大部分字型都沒有...