亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    Linux下的進程和進程間的狀態(tài)轉(zhuǎn)換

    Linux下的進程和進程間的狀態(tài)轉(zhuǎn)換。在我們的計算機層次結(jié)構(gòu)中,操作系統(tǒng)是處于一個承上啟下的層次。如下圖~Linux下的進程和進程間的狀態(tài)轉(zhuǎn)換

    在計算機中,操作系統(tǒng)的定位是一個管理者,對上管理在系統(tǒng)中運行的進程,對下通過驅(qū)動程序管理各種硬件。

    說到進程,首先得稍微解釋一下,什么叫做程序。

    程序:程序是以某種語言編寫,為完成某個特定任務(wù)的一系列指令和數(shù)據(jù)的有序集被稱之為程序。

    那么什么是進程?

    從用戶的角度來解讀,進程就是程序的一次動態(tài)的執(zhí)行過程。

    但是想要深入理解進程的概念,一定要知道操作系統(tǒng)是怎么解讀進程的。

    首先要了解進程控制塊(Process Control Block),簡稱PCB。進程屬性的集合全部被放在PCB之中,在Linux下,PCB是一個叫做task_struct的結(jié)構(gòu)體之中。

    學過C數(shù)據(jù)結(jié)構(gòu)的同學應該都知道,結(jié)構(gòu)體用來描述一個結(jié)構(gòu)的信息,通過指針我們把這些結(jié)構(gòu)組織起來,形成不同的數(shù)據(jù)結(jié)構(gòu)。比如鏈表,二叉樹,堆等等。

    而操作系統(tǒng)也是通過這樣的方式對我們的PCB來進行管理的。

    那么操作系統(tǒng)通過PCB來對進程進行管理,那么PCB中大概有什么關(guān)鍵信息呢?

    進程標識符,進程狀態(tài),進程優(yōu)先級,程序入口地址,各種計時信息,文件系統(tǒng)的相關(guān)信息,現(xiàn)場保護信息等等一系列的信息。

    在Linux下,進程標識符就是pid,這個可以通過命令來獲取,也可以通過一些系統(tǒng)調(diào)用接口來獲取,如ps命令,getpid()接口。pid是在操作系統(tǒng)下唯一標識一個進程存在的標識符,用于區(qū)別其他進程,同樣的道理,一個PCB也只唯一標識一個進程。

    在Linux下,一個進程可以有七種不同的狀態(tài)。

    R運行狀態(tài)(running):并不意味著進程一定在運行中,它表明進程要么是在運行要么是在運行隊列里。

    S睡眠狀態(tài)(sleeping):意味著進程在等待事件完成(可中斷睡眠)。

    D磁盤休眠狀態(tài)(Disk sleep):也叫不可中斷睡眠狀態(tài),在這個狀態(tài)進程通常會等待IO的結(jié)束。

    T停止狀態(tài)(stopped):可以通過發(fā)送SIGSTOP信號給進程來停止(T)進程。這個暫停的進程可以通過發(fā)送SIGCONT信號讓進程繼續(xù)運行(關(guān)于信號后面還會繼續(xù)更新到相關(guān)內(nèi)容)。

    X死亡狀態(tài)(dead):這個狀態(tài)只是一個返回狀態(tài),你不會在任務(wù)列表里看到這個狀態(tài)。

    還有t(tracing stop)跟蹤狀態(tài)和Z(zombie)僵尸狀態(tài)。

    僵尸狀態(tài)是進程已經(jīng)終止,但是還占用這系統(tǒng)中的資源沒有釋放,這種狀態(tài)對系統(tǒng)是有害的。

    僵尸進程這種狀態(tài)比較特殊。當進程退出并且父進程沒有讀取到子進程退出的返回代碼就會產(chǎn)生僵尸進程。
    所以,只要子進程推遲,父進程還在運行,但父進程沒有讀取子進程的狀態(tài),子進程進入Z狀態(tài)。

    用這段小程序在Linux系統(tǒng)下運行,然后用查看進程狀態(tài)的命令查看就可以看到進程變成了Z狀態(tài)。

      #include  #include  #include    int main()  {      pid_t id = fork();      if(id == -1){          perror("fork");          return 1;      }      else if(id == 0){          printf("child pid: %dn",getpid());          sleep(3);          exit(0);      }else{          printf("parents pid:%dn",getpid());          sleep(30);          exit(EXIT_SUCCESS);      }      return 0;  }

    狀態(tài)之間的轉(zhuǎn)換關(guān)系如下:Linux下的進程和進程間的狀態(tài)轉(zhuǎn)換

    孤兒進程:父進程先退出,子進程就被稱為孤兒進程。父進程如果提前退出,那么子進程后退出,進入Z之后,該怎么辦呢?這個時候會產(chǎn)生對系統(tǒng)資源的浪費的僵尸進程。操作系統(tǒng)當然不會眼睜睜的看著這種事情發(fā)生,所以當系統(tǒng)中產(chǎn)生孤兒進程,就會被1號init進程領(lǐng)養(yǎng),當然會被init進程回收,這里的init進程可以先理解為操作系統(tǒng)的進程。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號