一.復制進程 fork

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的位置發生變化,是故意的,在棧區,每運行一下,走一位,為了安全