fork


一.復制進程 fork

1.函數返回類型 pid_t 實質是 int 類型,
fork 函數會新生成一個進程,調用 fork 函數的進程為父進程,新生成的進程為子進程。
在父進程中返回子進程的 pid,在子進程中返回 0,失敗返回-1。
2.

   pcb穿起來會形成一個鏈表,整個進程中的運行數,則看有幾個pcb,(鏈表有多少個結點) 

   pcb可當做一個結構體,名字為struct task_struct,

   有多少進程,就有多少結點

3.父進程的返回值為它的id號,子進程則為0

4. 

    fork復制之后,子進程從fork之后的語句開始進行,子進程的fork不會再執行、

    父子進程並發進行(同時進行),兩者互不影響

5.例題1

 

 

1). i=0, 進入for循環,進入fork ,復制兩個進程,父進程打印一個A,子進程打印一個A,i=1時,父進程進入for循環,復制完父進程再打印一個A,復制的子進程打印一個A,子進程同樣。

 2). 四個進程,,6個A

 

例題2

 

沒有\n后,執行后,A沒有打出去,還在進程中,再次執行時,整體復制給子進程,子進程中也有一個A,往下執行時,還沒有打出A,A存放在緩沖區,子進程中也在存放一個A,另一個子進程方法同。

 6. 

 

         此時為邏輯地址,不是物理地址

 7.

 

    fork復制之后的子進程是從fork之后開始執行的,把內存空間復制一份,代碼從fork后執行,但fork前的值仍與父進程相同。

8.0到4G地址空間

  

9.寫時拷貝:在發生修改的時候,才會將父進程的內容復制給子進程,沒發生修改的不復制,

寫時拷貝使fork復制的更少,fork效率提高                 

在fork時候,原本需要將所有父進程復制給子進程,現在是將父子沒有進行修改的頁面先進共享,等到父和子要進行修改的時候在進行復制,

10.   

 

     程序進行編譯之后,邏輯地址已經有了,用nm去觀察,運行之后地址仍是原來的地址,所以這為邏輯地址, a,b的位置發生變化,是故意的,在棧區,每運行一下,走一位,為了安全

 

 

 

 

 

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM