異臣停控制流
如果程序計(jì)數(shù)器一直按照內(nèi)存相鄰的地址來(lái)執(zhí)行指令,那么執(zhí)行過(guò)的指令序列是平滑的兆览。但是這種平滑的過(guò)程通常不會(huì)長(zhǎng)久,因?yàn)闀?huì)有程序調(diào)用,返回奠支,跳轉(zhuǎn)等指令,使得平滑流突變抚芦。
還有一些突變是由于其他原因引起的倍谜,如硬件定時(shí)器定期產(chǎn)生信號(hào),事件必須得到處理叉抡《蓿或網(wǎng)絡(luò)適配器收到了一個(gè)包,必須存放在內(nèi)存中等褥民。這種突變稱為異臣敬海控制流(Exceptional Controal Flow,ECF)。
異常
異常就是控制流中的突變消返,用來(lái)相應(yīng)處理器狀態(tài)中的某些變化载弄。
在任何情況下,處理器檢測(cè)到有事件發(fā)生時(shí)侦副,就會(huì)通過(guò)一張叫異常表的跳轉(zhuǎn)表侦锯,進(jìn)行一個(gè)間接過(guò)程調(diào)用,運(yùn)行專門處理此類事件的操作系統(tǒng)子程序(異常處理程序)秦驯。處理完成后根據(jù)引起異常的事件類型尺碰,回到事件發(fā)生時(shí)的指令,或發(fā)生時(shí)的下一條指令译隘,或終止被中斷的程序亲桥。
異常處理
異常表的結(jié)構(gòu):
在系統(tǒng)啟動(dòng)時(shí),由操作系統(tǒng)分配和初始化固耘。表的起始地址放在異常表基址寄存器中题篷。
通過(guò)異常號(hào)與基址,獲取異常程序處理地址:
異常的類別
1. 中斷
中斷是異步發(fā)生的厅目,即是來(lái)自處理器外部I/O設(shè)備的信號(hào)的結(jié)果番枚。而不是處理器內(nèi)部指令產(chǎn)生的法严,所以說(shuō)是異步的。
外部通過(guò)向處理器芯片上的一個(gè)引腳發(fā)信號(hào)葫笼,并將異常號(hào)放到系統(tǒng)總線上深啤,來(lái)出發(fā)中斷,這個(gè)異常好號(hào)標(biāo)識(shí)了引起中斷的設(shè)備路星。
CPU執(zhí)行完當(dāng)前指令會(huì)去執(zhí)行中斷程序溯街,然后回到下一條指令繼續(xù)執(zhí)行。
2. 陷阱
陷阱是有意的異常洋丐,主要用途是在用戶程序和內(nèi)核之間提供一個(gè)像過(guò)程調(diào)用一樣的接口呈昔,叫系統(tǒng)調(diào)用。
比如讀文件友绝,創(chuàng)建新進(jìn)程堤尾,加載新程序,終止當(dāng)前程序九榔,都需要向內(nèi)核請(qǐng)求服務(wù)哀峻。處理器提供了一條特殊的 syscall n 指令涡相,來(lái)調(diào)用服務(wù)n哲泊。
普通的函數(shù)運(yùn)行在用戶模式中,限制了函數(shù)可以執(zhí)行的指令類型催蝗,且只能訪問(wèn)與調(diào)用函數(shù)相同的棧切威。系統(tǒng)調(diào)用運(yùn)行在內(nèi)核模式中,內(nèi)核模式運(yùn)行系統(tǒng)調(diào)用執(zhí)行特權(quán)指令丙号,并訪問(wèn)定義在內(nèi)核匯中的棧先朦。
3. 故障
故障由錯(cuò)誤情況引起,可以被故障處理程序修正犬缨。
如果被修復(fù)了喳魏,會(huì)返回時(shí)重新執(zhí)行當(dāng)前指令。否則怀薛,返回到內(nèi)核的abort例程刺彩,會(huì)終止引起故障的應(yīng)用程序。
缺頁(yè)是一個(gè)經(jīng)典的異常枝恋。
4. 終止
終止時(shí)不可恢復(fù)的致命錯(cuò)誤造成的結(jié)果创倔,通常是硬件錯(cuò)誤。
進(jìn)程
現(xiàn)代的操作系統(tǒng)會(huì)提供給程序一個(gè)假象焚碌,即程序似乎是獨(dú)占處理器和內(nèi)存的畦攘。
系統(tǒng)中的每個(gè)程序都運(yùn)行在某個(gè)進(jìn)程上下文中,上下文是由程序正確運(yùn)行所需的狀態(tài)組成的十电,狀態(tài)包括存放在內(nèi)存中的程序的代碼和數(shù)據(jù)知押,棧叹螟、通用寄存器內(nèi)容、程序計(jì)數(shù)器台盯、變量環(huán)境以及打開(kāi)問(wèn)阿金描述符集合首妖。
1. 邏輯控制流
一個(gè)程序?qū)?yīng)的程序計(jì)數(shù)器的值構(gòu)成的序列,交邏輯控制流爷恳,簡(jiǎn)稱邏輯流有缆。
2. 并發(fā)流
一個(gè)邏輯流的執(zhí)行在時(shí)間上與另一個(gè)流重疊,稱為并發(fā)流温亲,這兩個(gè)流被稱為并發(fā)地執(zhí)行棚壁。
多個(gè)流并發(fā)地執(zhí)行一般現(xiàn)象稱為并發(fā)(concurrency)。一個(gè)進(jìn)程和其他進(jìn)程輪流運(yùn)行的概念稱為多任務(wù)栈虚。一個(gè)程序執(zhí)行它的控制流的一部分的每一時(shí)間段叫時(shí)間片袖外。因此多任務(wù)也叫時(shí)間分片。
如果兩個(gè)流并發(fā)運(yùn)行在不同的處理器核或計(jì)算機(jī)上魂务,則稱為并行流(parallel flow)曼验,并發(fā)地運(yùn)行,且并行地執(zhí)行粘姜。
3. 用戶模式和內(nèi)核模式
處理器通常用某個(gè)控制寄存器中的一個(gè)模式位來(lái)提歐共這種功能鬓照,寄存器描述了進(jìn)程當(dāng)前享有的特權(quán)。在內(nèi)核模式的進(jìn)程可以執(zhí)行任何指令孤紧,且能訪問(wèn)系統(tǒng)中的任何內(nèi)存位置豺裆。
4. 上下文切換
上下文切換是由內(nèi)核完成的。
在進(jìn)程執(zhí)行的某些時(shí)刻号显,內(nèi)核可以決定搶占當(dāng)前進(jìn)程臭猜,并重新開(kāi)始一個(gè)先前被搶占了的進(jìn)程。這種決策叫調(diào)度押蚤,由內(nèi)核中的調(diào)度器的代碼處理的蔑歌。
上下文切換:
保存當(dāng)前進(jìn)程上下文
恢復(fù)先前某個(gè)被搶占的進(jìn)程被保存的上下文
將控制傳遞給這個(gè)新恢復(fù)的進(jìn)程
進(jìn)程控制
獲取PID的方法:
進(jìn)程的創(chuàng)建:
子進(jìn)程是父進(jìn)程的一分拷貝,除了PID不同揽碘,其他基本相同次屠。(即在不同的地址空間中,有相同的拷貝)
fork之后钾菊,子進(jìn)程會(huì)沿著fork之后的那條語(yǔ)句繼續(xù)執(zhí)行下去帅矗。
僵死進(jìn)程(僵尸進(jìn)程)
子進(jìn)程已經(jīng)執(zhí)行完畢,但是內(nèi)核并不會(huì)清除掉子進(jìn)程煞烫,直到被父進(jìn)程回收浑此。父進(jìn)程回收子進(jìn)程時(shí),內(nèi)核會(huì)將子進(jìn)程的退出狀態(tài)傳遞給父進(jìn)程滞详,然后再拋棄已終止的進(jìn)程凛俱。一個(gè)終止了還未被回收的進(jìn)程稱為僵死進(jìn)程紊馏。
pid>0表示進(jìn)程ID等于PID的子進(jìn)程。-1表示所有子進(jìn)程組成的集合蒲犬。其中一個(gè)終止就會(huì)返回PID朱监。
信號(hào)
一個(gè)信號(hào)就是一條小消息,通知進(jìn)程系統(tǒng)中發(fā)生了一個(gè)某種類型的事件原叮。
通常異常都是由內(nèi)核異常處理程序進(jìn)行處理的赫编,正常情況下,對(duì)用戶進(jìn)程是不可見(jiàn)的奋隶。信號(hào)提供了一種機(jī)制擂送,通知用戶進(jìn)程發(fā)生了這些異常。
傳送一個(gè)信號(hào)到目的進(jìn)程的步驟: