在32位平臺下,進程的地址空間及fork()與vfork()

  1. 進程的地址空間

從下到上依次爲正文代碼,初始化數據,未初始化數據,堆,共享區,棧,命令行參數環境變量,內核空間1G。
由此可以看出,我們在寫程序時,數據它有它特定的位置。

  1. fork()函數做了些什麼?
    複製父進程的正文段,數據段,堆,棧這四個部分,併爲3個部分分配物理塊,除正文段和父進程共享外,其餘三個部分都會被分配物理空間。複製之後其內容是相同的。內核除了做這些,內核還會以父進程爲模板爲子進程創建pcb,用於管理進程。還有頁表,之後,會把子進程添加到系統進程列表當中。最後fork返回,開始調度器的調度。
  2. Linux下的寫時複製技術
    父進程創建子進程時,會創建pcb,頁表,但其餘的,會和父進程共享,只是在需要改變子進程段的內容時,纔會拷貝一份副本,不需要拷貝時,則和父進程共享同一塊虛擬地址空間。 .

  3. vfork()函數
    該函數和fork()函數一樣都是創建子進程,只不過該函數比fork函數做的少得多了,該函數採用的是共享。不爲子進程創建虛擬地址空間,其和父進程共享虛擬地址空間即也就共享了進程的物理空間。但它會創建pcb,(pcb是控制進程執行的)。之後該函數會返回,並把子進程添加到系統進程列表中,且其會保證子進程先運行。
    在Linux下,我們的線程也是通過vfork這個函數來實現的。
    在這裏我還想說一下,計算機真的太快了,快到我們以爲他是併發處理任務的,但實際他是一件一件處理的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章