<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你的進(jìn)程,為啥掛了?

          共 3927字,需瀏覽 8分鐘

           ·

          2021-04-17 18:24

          前言

          你的進(jìn)程,為啥掛了?進(jìn)程掛了,這個問題大家并不陌生。學(xué)完這篇,你會對進(jìn)程有一定了解。后面碰到進(jìn)程掛的情況,你很快能找到對應(yīng)解決思路。

          進(jìn)程在操作系統(tǒng)中,是一個很重要的概念。你熟悉操作系統(tǒng),能避免一些,寫出高質(zhì)量的代碼。

          windows界面設(shè)置真炫酷,不多說。下面用動畫加文字的方式,給大家講述。

          為什么需要進(jìn)程

          通常程序不能并發(fā)執(zhí)行,因?yàn)槌绦虿l(fā)執(zhí)行的結(jié)果,是不可再現(xiàn)的。為了使程序,可以并發(fā)執(zhí)行,且能對其加以描述和控制,引入了進(jìn)程的概念。



          上面把小人比作程序,操作系統(tǒng)中一次只能跑一個程序,除非引入進(jìn)程。

          進(jìn)程的特征和定義

          進(jìn)程是程序的一次執(zhí)行,是系統(tǒng)進(jìn)行資源分配調(diào)度的獨(dú)立單位。

          結(jié)構(gòu)特征:為了使程序能夠獨(dú)立運(yùn)行,應(yīng)配置一個進(jìn)程控制塊PCB。進(jìn)程是由程序段,相關(guān)的數(shù)據(jù)段PCB(進(jìn)程控制塊)三部分構(gòu)成的。

          動態(tài)性:進(jìn)程是程序的一次執(zhí)行,由創(chuàng)建而產(chǎn)生,由調(diào)度而執(zhí)行,由撤銷而消亡,進(jìn)程存在一定的生命周期。

          并發(fā)性:多個進(jìn)程實(shí)體,同存在于內(nèi)存中,且能在一段時間內(nèi)同時運(yùn)行。

          獨(dú)立性:進(jìn)程實(shí)體,是一個能獨(dú)立運(yùn)行,獨(dú)立分配資源,獨(dú)立接收調(diào)度的基本單位。

          異步性:
          進(jìn)程按自己獨(dú)立的不可預(yù)知的速度推進(jìn)。

          下面動畫,把小人比作進(jìn)程,展示的進(jìn)程的創(chuàng)建,銷毀,動態(tài)性,并發(fā),獨(dú)立,異步。


          進(jìn)程的狀態(tài)及轉(zhuǎn)換

          創(chuàng)建:保證進(jìn)程的調(diào)度,必須在創(chuàng)建工作完成以后,再進(jìn)行。確保,對進(jìn)程控制塊PCB操作的完整性。

          就緒:進(jìn)程已分配到除CPU外的所有必要資源。

          執(zhí)行:進(jìn)程已獲得CPU,其指令集正在執(zhí)行。

          阻塞/掛起
          正在執(zhí)行的進(jìn)程由于發(fā)生某事件導(dǎo)致暫時無法繼續(xù)執(zhí)行。

          終止:等待其他進(jìn)程收集完信息后,將刪除該進(jìn)程,清空PCB并返還給系統(tǒng)。

          下面是進(jìn)程狀態(tài)圖:



          PCB進(jìn)程控制塊

          獨(dú)立運(yùn)行基本單位的標(biāo)志:創(chuàng)建進(jìn)程時創(chuàng)建PCB,進(jìn)程結(jié)束時回PCB,進(jìn)程隨之消亡。系統(tǒng)是通過PCB,感知進(jìn)程的存在。PCB已成為,進(jìn)程存在于系統(tǒng)中的唯一標(biāo)志。

          實(shí)現(xiàn)間斷性運(yùn)行方式:進(jìn)程暫停運(yùn)行時,必須保留,運(yùn)行時的CPU等相關(guān)信息。進(jìn)程被再次運(yùn)行時,需恢復(fù)CPU等相關(guān)信息。

          提供進(jìn)程管理需要的信息:當(dāng)進(jìn)程開始運(yùn)行時,根據(jù)該進(jìn)程PCB中,記錄的程序和數(shù)據(jù),在內(nèi)存或外存中起始地址指針,找到相應(yīng)的程序和數(shù)據(jù)。

          提供進(jìn)程調(diào)度需要的信息:只有處于就緒狀態(tài)的進(jìn)程,才能被調(diào)度。而進(jìn)程的狀態(tài)就記錄在PCB中、以及優(yōu)先級、等待時間、已執(zhí)行時間等其他信息。

          實(shí)現(xiàn)與其他進(jìn)程的同步與通信:進(jìn)程同步機(jī)制,用于實(shí)現(xiàn)多進(jìn)程協(xié)調(diào)運(yùn)行。在PCB中,具有實(shí)現(xiàn)進(jìn)程通信的區(qū)域通信隊列指針等。

          PCB進(jìn)程控制塊中的信息:PCB中的信息大致上可分為4類,分別是:進(jìn)程標(biāo)識符、CPU狀態(tài)、調(diào)度信息、控制信息。

          進(jìn)程標(biāo)識符:分外部標(biāo)識符和內(nèi)部標(biāo)識符,外部標(biāo)識符即進(jìn)程名稱,可由父進(jìn)程指定,通常包括字符和數(shù)字的組成。內(nèi)部標(biāo)識符,由操作系統(tǒng)提供的,具有唯一性的進(jìn)程ID。

          CPU狀態(tài):主要由各種寄存器中內(nèi)容組成,如通用寄存器、指令計數(shù)器(下一條指令的地址)、程序狀態(tài)(狀態(tài)信息、條件碼、執(zhí)行方式、屏蔽中斷等標(biāo)志)和棧指針(指向用于存放過程和系統(tǒng)調(diào)用參數(shù)及調(diào)用地址的系統(tǒng)棧的棧頂)構(gòu)成。

          調(diào)度信息:包含進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級、其他信息、事件(阻塞原因)。
          進(jìn)程狀態(tài),是進(jìn)程調(diào)度和對換時的依據(jù),優(yōu)先級高的進(jìn)程,應(yīng)優(yōu)先獲得CPU執(zhí)行。

          控制進(jìn)程所必須的信息,包括程序和數(shù)據(jù)的存儲地址,以便調(diào)度該進(jìn)程執(zhí)行時,能從PCB中找到其程序和數(shù)據(jù),進(jìn)程同步和通信機(jī)制,如消息隊列、信號量等。

          進(jìn)程的創(chuàng)建和終止過程

          創(chuàng)建進(jìn)程過程:向操作系統(tǒng)申請空白PCB及進(jìn)程ID、分配運(yùn)行所需的資源、初始化PCB、等待插入進(jìn)程調(diào)度就緒隊列。

          相關(guān)資源或從操作系統(tǒng)或從父進(jìn)程獲得,資源需求需提前告知,操作系統(tǒng)或父進(jìn)程好為其分配資源。

          PCB至少有2種信息需要初始化
              1.標(biāo)識信息,即將本進(jìn)程ID和父進(jìn)程ID填入PCB控制塊中
             
          2.狀態(tài)信息,指令計數(shù)器指向程序的入口地址、棧指針指向棧頂控制信息。

          進(jìn)程的終止分為讀取進(jìn)程狀態(tài)、終止進(jìn)程、終止子孫進(jìn)程、釋放資源、移出PCB隊列。
          操作系統(tǒng)通過進(jìn)程ID從PCB集合中檢索出該進(jìn)程的PCB,從中讀出該進(jìn)程的狀態(tài)。

          如果該進(jìn)程狀態(tài)為執(zhí)行態(tài),則終止進(jìn)程的執(zhí)行,并重置調(diào)度標(biāo)志位真。
          如果該進(jìn)程擁有子孫進(jìn)程,則一并將所有子孫進(jìn)程終止,防止子孫進(jìn)程成為僵尸進(jìn)程等不可控的進(jìn)程。

          接著釋放資源,將資源歸還給操作系統(tǒng)或父進(jìn)程。最后就是移出PCB隊列了,等待其他進(jìn)程搜集信息。

          進(jìn)程阻塞和喚醒的事件
              1.請求系統(tǒng)服務(wù)而得不到滿足時,如問系統(tǒng)請求打印。

              2.啟動的操作需同步時:如該操作和請求該操作的進(jìn)程需同步運(yùn)行。

              3.新數(shù)據(jù)尚未到達(dá):如進(jìn)程A寫,進(jìn)程B讀,則A未寫,完B不能讀。

              4.無新工作可做。

          進(jìn)程的掛起和激活
               1.進(jìn)程的掛起過程,由進(jìn)程自己,或其父進(jìn)程suspend原語完成。將該進(jìn)程PCB移到指定區(qū)域,注意狀態(tài)的改變,有可能要重新調(diào)度。

               2.進(jìn)程的激活過程,激活active原語激活進(jìn)程。激活原語將進(jìn)程從外存調(diào)入內(nèi)存,檢查該進(jìn)程的現(xiàn)行狀態(tài)并進(jìn)行相應(yīng)操作。

          進(jìn)程同步

          動畫展示,臨界區(qū)的資源,在某個時刻,只能有一個進(jìn)程在使用。

          臨界資源

          一旦有對資源的共享,就必然涉及競爭限制。
          臨界資源用來表示一種,公共資源或者說是共享數(shù)據(jù),可以被多個線程使用。
          但是每一次,只能有一個線程使用它。一旦臨界資源被占用,其他線程,要想使用這個資源,就必須等待。

          進(jìn)程同步的主要任務(wù)是,對多個相關(guān)進(jìn)程,在執(zhí)行次序上進(jìn)行協(xié)調(diào),以使并發(fā)執(zhí)行的諸進(jìn)程之間,能有效地共享資源和相互合作,從而使程序的執(zhí)行,具有可再現(xiàn)性

          臨界區(qū)
          有了臨界資源的概念,就很容易理解臨界區(qū)的概念。在程序中,所有的操作,都是通過代碼執(zhí)行的,訪問臨界資源的那段代碼就是臨界區(qū)

          處理競爭或者合作依賴導(dǎo)致的制約
          空閑讓進(jìn)對于臨界資源,如果空閑沒有被使用,誰來了之后都可以使用

          忙則等待如果臨界資源正在被使用,那么其他后來者就需要進(jìn)行等待。

          有限等待要求訪問臨界資源的進(jìn)程,應(yīng)保證有限時間內(nèi),能進(jìn)入自己的臨界區(qū),自己不能傻傻的等

          讓權(quán)等待如果無法進(jìn)入自己的臨界區(qū)時,應(yīng)立即釋放處理機(jī),而不能占著CPU死等,你死等就算了,別人卻也不能用了。



          鎖就是對資源施加控制,鎖指的是一種控制權(quán)
          當(dāng)進(jìn)入臨界區(qū)時,我們稱之為獲得鎖,獲得鎖之后就可以訪問臨界資源。

          其他線程想要進(jìn)入臨界區(qū),也需要先獲得鎖。
          當(dāng)前線程結(jié)束后,將會釋放鎖,別
          線程就可以獲取這個資源的鎖。

          死鎖
          鎖表示一種控制權(quán),對臨界資源的訪問權(quán)限

          下面動畫展示,兩個小人,都要使用資源1和資源2,才能達(dá)到對面。左邊小人戰(zhàn)友資源1,右邊小人占有資源2。他們占有當(dāng)前資源,再去獲取對方的資源時,就會產(chǎn)生死鎖的情況。

          如果臨界資源不止一個,就可能出現(xiàn):需要先后訪問兩種臨界資源A和B,thread1獲得了A線程的鎖之后,等待獲得B的鎖,但是thread2獲得了資源B的鎖,在等待A資源的鎖,這就出現(xiàn)了互相等待的情況。

          解決方案
          AND型信號量機(jī)制就是用于解決這種多共享資源下的同步問題的。
          將進(jìn)程在整個運(yùn)行過程中,需要的所有資源,一次性全部地分配給進(jìn)程,待進(jìn)程使用完后再一起釋放。

          只要尚有一個資源未能分配給進(jìn)程,其它所有可能為之分配的資源,也不分配給它。
          也就是對,若干個臨界資源的分配,采取原子操作方式:要么把它所請求的資源全部分配到進(jìn)程,要么一個也不分配。

          進(jìn)程間通信



          如果兩個進(jìn)程,
          想要知道對方在干嘛,或者進(jìn)行協(xié)調(diào)運(yùn)行,就需要進(jìn)程間通信。下面介紹一下常見的進(jìn)程間通信方式。

          無名管道:管道是一種半雙工的通信方式。數(shù)據(jù)只能單向流動,而且只能在,具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程間的親緣關(guān)系,通常指父子進(jìn)程關(guān)系。

          有名管道:有名管道也是,半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。

          消息隊列:
          消息隊列是有消息的鏈表,存放在內(nèi)核中,并由消息隊列標(biāo)識符標(biāo)識。它克服了信號傳遞信息少,管道只能承載無格式字符流以及緩沖區(qū)大小受限等特點(diǎn)。

          信號量:是一個計數(shù)器,可以用來控制多個進(jìn)程對共享內(nèi)存的訪問。它作為一種鎖機(jī)制,防止某個進(jìn)程,正在訪問共享資源的時候,其他進(jìn)程也訪問該資源,造成資源搶占。

          信號:一種較復(fù)雜的通信方式,用于通知和接收進(jìn)程某個事件的發(fā)生。

          共享內(nèi)存:是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但多個進(jìn)程都可以訪問。

          套接字:是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于 不同機(jī)器間的進(jìn)程通信

          絮叨

          上面介紹了一些進(jìn)程相關(guān)的基礎(chǔ)知識,希望能幫到大家。
          進(jìn)程,作為操作系統(tǒng)中的重要概念,不管在工作還是面試中,都會涉及到。

          祝大家學(xué)習(xí)愉快!



               作者:良知猶存,白天努力工作,晚上原創(chuàng)公號號主。公眾號內(nèi)容除了技術(shù)還有些人生感悟,一個認(rèn)真輸出內(nèi)容的職場老司機(jī),也是一個技術(shù)之外豐富生活的人,攝影、音樂 and 籃球 關(guān)注我,與我一起同行。


          ????????????????  END  ????????????????


          瀏覽 30
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产蜜臀在线观看 | 国产做受 91电影 | 俺也来俺也去 | 91精品婷婷国产综合久久韩漫 | 69人妻人人澡人人爽人人精品 |