系統(tǒng)調(diào)用。也稱為 System Call,是說用戶態(tài)進程主動要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進程使用操作系統(tǒng)提供的服務(wù)程序完成工作,比如上面示例代碼中的寫文件調(diào)用,還有像 fork() 函數(shù)實際上就是執(zhí)行了一個創(chuàng)建新進程的系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用的機制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實現(xiàn)。
異常。當CPU在用戶空間執(zhí)行程序代碼時發(fā)生了不可預(yù)期的異常,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關(guān)程序中,切換到內(nèi)核態(tài),比如缺頁異常。
外圍設(shè)備的中斷。 當外圍設(shè)備完成用戶請求的某些操作后,會向CPU發(fā)送相應(yīng)的中斷信號,這時CPU會暫停執(zhí)行下一條即將執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應(yīng)的處理程序,如果當前正在運行用戶態(tài)下的程序指令,自然就發(fā)了由用戶態(tài)到內(nèi)核態(tài)的切換。比如硬盤數(shù)據(jù)讀寫完成,系統(tǒng)會切換到中斷處理程序中執(zhí)行后續(xù)操作等。
以上3種方式,除了系統(tǒng)調(diào)用是進程主動發(fā)起切換,異常和外圍設(shè)備中斷是被動切換的。
查看 CPU 時間在 User Space 與 Kernel Space 之間的分配情況,可以使用top命令。它的三行輸出就是 CPU 時間分配統(tǒng)計。
用戶進程通過read等系統(tǒng)調(diào)用接口向操作系統(tǒng)(即CPU)發(fā)出IO請求,請求讀取數(shù)據(jù)到自己的用戶內(nèi)存緩沖區(qū)中,然后該進程進入阻塞狀態(tài)。
操作系統(tǒng)收到用戶進程的請求后,進一步將IO請求發(fā)送給磁盤。
磁盤驅(qū)動器收到內(nèi)核的IO請求后,把數(shù)據(jù)讀取到自己的緩沖區(qū)中,此時不占用CPU。當磁盤的緩沖區(qū)被讀滿之后,向內(nèi)核發(fā)起中斷信號告知自己緩沖區(qū)已滿。
內(nèi)核收到磁盤發(fā)來的中斷信號,使用CPU將磁盤緩沖區(qū)中的數(shù)據(jù)copy到內(nèi)核緩沖區(qū)中。
如果內(nèi)核緩沖區(qū)的數(shù)據(jù)少于用戶申請讀的數(shù)據(jù),則重復(fù)步驟2、3、4,直到內(nèi)核緩沖區(qū)的數(shù)據(jù)符合用戶的要求為止。
內(nèi)核緩沖區(qū)的數(shù)據(jù)已經(jīng)符合用戶的要求,CPU停止向磁盤IO請求。
CPU將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶緩沖區(qū),同時從系統(tǒng)調(diào)用中返回。
用戶進程讀取到數(shù)據(jù)后繼續(xù)執(zhí)行原來的任務(wù)。
PIO缺點:每次IO請求都需要CPU多次參與,效率
6AV6645-0AC01-0AX0配件
6AV6648-0CC11-3AX0
6AV6648-0CE11-3AX0
6AV7260-1GM30-0BX0
6AV7722-1BC10-0AD0
6AV7723-1AC10-0AD0
6AV7894-0AD30-1AB0
6DD1600-0BA1
6DD1607-0CA1
6DD1640-0AH0
6DD1661-0AD1
6DD1688-0AE2
6DP1232-7AA
6ED1052-1FB00-0BA6
6ED1052-2FB00-0BA6
6ED1057-1AA01-0BA0
6EP1331-1SA02
6EP1331-2BA00
6EP1333-2AA00
6EP1333-2AA01
6EP1333-2BA20
6EP1334-2BA00
6EP1334-2BA01
6EP1334-2BA20
6EP1334-3BA00
6EP1334-3BA10
6EP1336-3BA00
6EP1336-3BA00-8AA0
6EP1336-3BA10
6EP1337-3BA00
6EP1437-2BA00
6EP1437-2BA10
6EP1437-3BA10
6EP1457-3BA00
6EP1931-2EC21
6EP1961-2BA00
6EP3464-8SB00-0AY0
6EP7194-4CB00-0AA0
6EP8091-1BC60-0CR0
6ES5095-8MA23
6ES5095-8MB02
6ES5095-8MC03
6ES5300-5CA11
6ES5304-3UB11
6ES5373-0AA61
6ES5377-0AB41
6ES5432-4UA12
6ES5465-4UA13