fork-----通過複製呼叫程序建立乙個新的子程序 複製pcb(**共享資料獨有)---程式計數器(執行的位置都一樣)
父程序返回子程序的pid,子程序返回0;
寫時複製技術
vfork-----建立子程序,共用同乙個虛擬位址空間 共用乙個呼叫棧,會發生呼叫棧混亂
為了防止呼叫棧混亂,因此父程序呼叫vfork會阻塞,阻塞到子程序exit退出---(不可以使用return退出)
或者子程序程式替換,開闢記憶體建立自己的位址空間
return退出會釋放所有資源,包括虛擬位址空間
fork/vfork在核心中建立程序都是呼叫clone函式實現pcb建立並拷貝資料
程序退出場景: 正常退出(結果符合預期、結果不符合預期)、異常退出(常見的程式奔潰)如何退出:
main函式中的return 退出前重新整理緩衝區 函式中呼叫只是退出函式
exit: 三號手冊---庫函式手冊 退出前重新整理緩衝區 任意位置呼叫都是退出程序
_exit: 二號手冊---系統呼叫手冊 不會重新整理緩衝區,緩衝區的資料被丟棄
ateit傳的是函式指標
等待子程序的狀態改變(等待子程序退出-----獲取子程序的退出返回值(退出原因)
q:為什麼要等待子程序的退出?
a:因為子程序退出時為了儲存退出原因,因此作業系統不能釋放子程序的全部資源,因此通知父程序獲取子程序
程的返回值,允許釋放資源,但是這個通知是靜音的,導致父程序沒有關注到子程序退出,因此導致殭屍程序,
若父程序獲取了子程序的返回值,殭屍子程序將沒有存在的意義了,殭屍子程序會被釋放掉資源,因為不知道子
程序何時退出,所以只能建立之後一直等著子程序的退出
q:如何等待?
a:wait介面的功能是一直等待任意乙個子程序退出,子程序退出後,就獲取到返回值,放到傳入的引數staus中,
如果一直沒有子程序退出,wait函式將一直阻塞
q:阻塞?非阻塞?
a:為了完成乙個功能發起呼叫,當前若不具備完成條件,等待直到條件具備,完成功能後返回
為了完成乙個功能發起呼叫,當前若不具備完成條件,立即報錯返回
errno是乙個全域性變數,儲存每次系統呼叫出現錯誤原因編號
strerror,通過錯誤編號獲取字串錯誤原因
peeor直接列印上一次系統呼叫錯誤原因
高16位不使用,低16位的高8位,放的是返回值,exit code 低8位中的高1位,儲存core dump標誌
程式異常退出的時候儲存程式的執行資訊,便於事後除錯(包含各種敏感資訊),所以預設關閉剩餘的低7位是異常退出訊號值 作業系統檢測到某種異常,把訊號發給程序,程序自己退出
低7位如果是0,表示沒有異常退出訊號,正常退出;否則表示程式異常退出,返回值將不具有意義
獲取低7位: statu & 0x7f
獲取低16位中的高8位: (statu >>8) & 0xff
exit code最大值255
作業系統知識整理 程序控制
所謂程序控制,就是系統使用一些具有特定功能的程式段來建立 撤銷程序以及完成程序各狀態間的轉換,從而達到多程序高效率併發執行和協調 實現資源共享的目的。在作業系統中,這些用於程序控制的程式段被做成原語。原語又分為建立原語 撤銷原語 阻塞原語 喚醒原語 掛起原語和啟用原語等。建立程序有兩種方式 由系統程...
作業系統 知識點整理
首先 cpu 在訪問記憶體的時候都需要通過 mmu 把虛擬位址轉化為實體地址,然後通過匯流排訪問記憶體。mmu 開啟後 cpu 看到的所有位址都是虛擬位址,cpu 把這個虛擬位址發給 mmu 後,mmu 會通過頁表在頁表裡查出這個虛擬位址對應的實體地址是什麼,從而去訪問外面的 ddr 記憶體條 參考...
作業系統知識整理 程序控制塊
系統中需要有描述程序存在和能夠反映其變化的物理實體,即程序的靜態描述。程序的靜態描述由3部分組成 程序控制塊 process control block,pcb 有關程式段和該程式段操作的資料結構集。pcb是系統感知程序的唯一實體,用於描述程序的當前情況以及管理程序執行的全部資訊,是作業系統中最重要...