程序表結構以及malloc和mmap的區別

2021-07-01 23:10:33 字數 972 閱讀 2056

一、程序表的結構:

程序表邏輯結構分為四個部分,邏輯位址從低到高依次是text段(**段)、data段(資料段)、空閒空間、stack段(棧空間)。

1)text段:包含了程序的執行**以及許多編譯資訊;

2)data段:包含了程序中的變數,堆在此段內,有預先分配的大小,可以存放程序執行過程中的變數;

3)空閒空間:可儲存某些靜態/全域性變數,也可被作為堆和棧的拓展空間使用,mmap()作用後得到的檔案對映也存放在此空間中;

4)stack段:存放資料,可作為程序之間的共享空間。

二、程序表的變化:

1)fork()和exec()

呼叫fork()時,產生的子程序是複製的程序表(pcb表),但是pid(程序號:區別程序的根本標誌)不同;

而exec()則是改變程序的程序位址空間(虛擬的),它的pid保持原來的pid,即exec()前後是同乙個程序(pid未改變),可以說,exec()實現了讓乙個程序執行多個可執行檔案。

==>補充:正是由於fork的特性,派生出了cow策略(copy-on-write),通俗的說就是延後fork的複製工作。原理就是:先不複製父程序的pcb表的內容,但將記憶體的許可權修改為唯讀(對父程序和子程序都一樣),這樣,當子程序和父程序未進行修改操作時,節約了cpu複製pcb表的時間,提高了工作效率;當父程序或者子程序嘗試修改記憶體中的資料時,由於許可權錯誤,產生exception,陷入核心,進行相應的系統呼叫改回許可權並完成pcb表的複製。

2)malloc()和mmap()

呼叫malloc()時,是在pcb表結構中的堆中申請空間,若申請空間失敗,即超過給定的堆最大空間時,將會呼叫brk()系統呼叫,將堆空間向未使用的區域擴充套件,brk()之後新增的堆空間不會自動清除,需使用相應的系統呼叫來清除;

呼叫mmap()系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read(),write()等操作。

malloc和new對比,Linux程序的五個段

1 如何在不知道陣列個數的情況下動態輸入陣列?答 c語言裡這樣是不行的,只能使用動態分配記憶體。c語言 int a a int malloc sizeof int n c int a newint n 2 c語言的malloc和c 的new有什麼區別?答 1 申請記憶體所在位置 new操作符從自由儲...

malloc 結構體 資料結構 鍊錶(思路)

1 寫在前面 去學習鍊錶,發現自己對c語言的指標和結構體的理解還是不夠透徹,現將今天學習所得分享給大家。涉及到的知識為無頭鍊錶,不涉及鍊錶的插入刪除等知識,只是將鍊錶的思想理解了一遍。2.鍊錶 1 概括 鍊錶 顧名思義,就像一條鍊子一樣,每乙個圈的頭連著上乙個圈的尾部。2 組成 鍊錶是由乙個乙個的節...

資料結構中關於 malloc以及free的問題

資料結構嚴蔚敏 佇列基本操作 dequeue函式 status dequeue linkqueue q,qelemtype e 該函式需要實現刪除元素的功能,作者使用了乙個輔助變數,並給該變數申請了記憶體空間 queueptr p queueptr malloc sizeof qnode 然後又給該...