【系统架构师修炼之道】(13):操作系统基础知识——进程基础知识
進程分類(性質)
系統進程
windows常見的有
dllhost.exe(DCOM DLL Host進程支持基于COM對象支持DLL以運行Windows程序)
kernel32.dll(Windows殼進程用于管理多線程、內存和資源)
mprexe.exe(Windows路由進程包括向適當的網絡部分發出網絡請求)
snmp.exe(Windows簡單的網絡協議代理(SNMP)用于監聽和發送請求到適當的網絡部分)
system(Microsoft Windows系統進程)
tcpsvcs.exe(TCP/IP Services Application支持透過TCP/IP連接局域網和Internet)
用戶進程
父進程
已創建一個或多個子進程的進程(Linux 中調用fork創建新進程的進程即為父進程)
子進程
另一進程所創建的進程,子進程繼承了對應的父進程的大部分屬性,如文件描述符。在Unix中,子進程通常為系統調用fork的產物。在此情況下,子進程一開始就是父進程的副本,某一進程沒有父進程,則可知該進程很可能由內核直接生成,進程ID為1的進程(即init進程)是在系統引導階段由內核直接創建的。無父進程的進程,在對應的父進程結束執行后,進程就會變成孤兒進程,但之后會立即由init進程“收養”為其子進程。當某一子進程結束、中斷或恢復執行時,內核會發送SIGCHLD信號予其父進程。在默認情況下,父進程會以SIG_IGN函數忽略之
進程的狀態
三態模型
就緒,運行,阻塞
就緒狀態:當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機便可立即執行
運行狀態:進程已獲得處理機,其程序正在處理機上執行
阻塞狀態:由于等待某個事件發生而無法執行時,便放棄處理機而處于阻塞狀態(等待I/O完成、申請緩沖區不能滿足、等待信件)
調度:時間片已經用完,讓出處理器
五態模型
進程狀態轉化
進程的控制機構是由操作系統內核實現,具體是通過控制原語。
原語
若干條指令組成的,用于完成一定功能的一個過程,不可分割性.即原語的執行必須是連續的。
原語必須在管態下(cpu的特權態,執行指令系統的全集)執行,指令可以在目態(cpu的用戶態,不能使用特權指令,不能直接取用系統資源與改變機器狀態,并且只允許用戶程序訪問自己的存儲區域)執行
包含
創建原語
實際系統中創建一個進程有兩種方法:一是由操作系統建立,0#進程就是由操作系統建立的;二是由其他進程創建一個新的進程,創建進程原語總是先為新建進程申請一空白PCB,并為之分配唯一的數字表示符,使之獲得PCB的內部名稱,若該進程所對應的程序不在內存中,則應將它從外存儲器調入內存,并將該進程有關信息填入PCB中,然后置該進程為就緒狀態,并將它排入就緒隊列和進程家族隊列中,具體過程:1.從PCB集合種索取一個空白PCB,并獲得該PCB的內部標識符i 2.把調用者提供的參數,以及從執行過程EP中獲得的調用者內部標識j ,填入該PCB,設置記帳數據,置新進程為“靜止就緒”狀態 3.PCB分別插入就緒隊列RQ和進程家族中
Procedure Create(n,S0,k0,M0,R0,acc) begin i:=get Internal Name(n);//獲得內部名 i.id:=n; //填外部名 i.Priority:=k0; //填優先表 i.cpu state:=S0; //填cpu初始狀態 i.mainstore:=M0; //填寫主存區域 i.resource:=R0; //填寫資源清單 i.status:='Readys'; //填寫進程狀態 j:=EP; //獲取調用者內部標識 i.Parent:=j; //填入i進程的父進程j i.progeny:=null; //i的家庭指針為空 j.progeny:=i; //把i填入其父進程pcb中的家庭指針處 i.state:=RQ; //i所在狀態隊列首指針 Insert(RQ,i); //把i進程插入RQ隊尾 continue; end撤銷原語
撤消進程的實質是撤消進程存在標志——進程控制塊PCB。一旦PCB被撤消,進程就消亡了,撤消進程的實質是撤消進程存在標志——進程控制塊PCB。一旦PCB被撤消,進程就消亡了。撤消原語的操作過程大致如下:以調用者提供的標志符n為索引,從該進程所在的隊列,將它從該隊列中消去,并撤消屬于該進程的一切“子孫進程”,若有父進程則從父進程PCB中刪除指向該進程的指針,并釋放撤消進程所占用的全部資源,或則將其歸還給其父進程,或則歸還給系統。若被撤消的進程處于執行狀態,應立即中斷該進程的執行,并設置調度標志為真,以指示該進程被撤消后系統應重新調度,撤銷原語在撤銷指定進程的同時也應該撤銷所指示的子孫進程, 所以用kill()遞歸算法撤銷子孫進程。引起進程終止事件可分三類:正常結束、異常結束、外界干預。
Procedure destroy(n) Begin Sched:=false; i:=getinternal name(n);//獲取n進程的內部名 kill(i); if sched then scheduler else continue;//假如Schde為真,則轉調度程序,否則繼續 end procedure kill(i) begin if i.stata(i)=”executing” then begin stop(i); sched:=true end; remove (i.stata,i); //將被撤消進程從i.state所指示的隊列中除去 for all S∈i.progeny do kill(s); for all r∈(i.main store ∪i.resources) do if owned(r) then insert (r.semaphore,r.date);//屬于父進程的資源歸還且插入父進程資源清單 for all ∈created resources(i) do remove descriptor (R);//撤消自己的資源清單歸還系統 remove process control block (i); end阻塞原語
阻塞原語的大致工作過程如下:開始時,進程正處于執行狀態,因此首先應中斷CPU執行,并保存該進程的CPU現場,然后把阻塞狀態賦予該進程,并將它插入到具有相同實體的阻塞隊列中,引起阻塞和喚醒的事件可分四類:一、請求系統服務。二、啟動某種操作(同步由int將該進程喚醒)三、新數據尚未到達時。四、無新工作可做。
Procedure block Begin i:=EP; //從執行進程EP獲得調用者內部標識符 stop(i); i.status:=”blockda”; i.stata=WQ(r);//填寫阻塞隊列指針 insert(WQ(r),i); //把i插入WQ隊尾 scheduler //轉調度程序 end喚醒原語
進程因為等待事件的發生而處于阻塞狀態,當等待的事件完成后,進程又具有了繼續執行的條件,這時就要把該進程從阻塞狀態轉變為就緒狀態。這個工作由喚醒原語來完成。喚醒原語執行的操作有:先把被喚醒進程從阻塞隊列中移出,設置該進程當前狀態為就緒狀態,然后再將該進程插入到就緒隊列中。
Procedure wakeup(n) Begin i :=getinternal name(n); remove (WQ(r),i); //把i進程從等待r而受阻塞隊列中摘除 i.status:=”ready”; //置i進程為“就緒”狀態 i.sdata:=RQ; //把i進程插入到就緒隊列 insert(RQ,i); continue end掛起原語
讓某些進程暫時不參與資源競爭,掛起的方式有三類:一、把掛起原語調用者本身掛起,即自己掛起自己。二、掛起某個標識符的進程。三、將某個指定的標志符及其全部或部分子孫掛起用的保存n進程的pcb副本的內存區。
Procedure suspend(n,a) Begin i:=getinternal name(n); s:=i.status; if s=”executing” then stop(i); a:=copy PCB(i); i.status:=if s=”blockeda” then “blockeds” else readys; if s=”executing” then scheduler else continue; end激活原語
激活指定標志符的進程或激活某進程及其子孫進程
Procedure active(n) Begin i:=getinternal name(n) i.status:=if i.status=”readys” then “readya” else blockeda; if i.status=”readys” then scheduler;//當激活后的進程處于“readys”狀態針,將引起重新調度 else continue end分類
請求(Req)型
高層向低層請求某種業務
證實(Cfm)型
提供業務的層證實某個動作已經完成
指示(Ind)型
提供業務的層向高層報告一個與特定業務相關的動作
響應(Res)型
用于應答,表示來自高層的指示原語已收到
感謝您的耐心閱讀,如果您發現文章中有一些沒表述清楚的,或者是不對的地方,請給我留言,你的鼓勵是作者寫作最大的動力,
如果您認為本文質量不錯,讀后覺得收獲很大,不妨小額贊助我一下,讓我更有動力繼續寫出高質量的文章。
支付寶
微信
作 者 : @mousycoder
原文出處 : http://mousycoder.com/2015/10/14/the-pragmatic-sa-13/
創作時間:2015-9-1
更新時間:2015-10-16
總結
以上是生活随笔為你收集整理的【系统架构师修炼之道】(13):操作系统基础知识——进程基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 5011(博弈)
- 下一篇: java向MySQL插入当前时间的四种方