論‘進程’相關操作

★進程相關概念

        (1)進程:是一個能夠分配處理器並由處理器執行的,能夠攜帶資源的活動實體。

        (2)進程控制塊(PCB):每一個進程中都有唯一的一個進程控制塊來保存進程的相關信息,實際PCB就是一個task_struct的結構體。具體的見http://10740590.blog.51cto.com/10730590/1785457

        (3)進程狀態:進程是一個活動實體,並不代表進程是一直處於運行狀態,一個進程可以有很多種狀態。

            △R(running)表示運行狀態

             △S(sleeping)表示可喚醒睡眠狀態

             △D(disk sleep)表示不可喚醒的睡眠狀態

             △T(stopped)表示暫停狀態

             △t(tracing stop)表示終止狀態

             △X(dead)表示死亡狀態

             △Z(zombie)表示殭屍狀態


★進程創建執行

        進程的創建有兩種方法:fork()和execve()。兩者都是創建的進程都是運行進程的子進程,創建後的子進程會得到父進程中的數據段、棧段、堆區域的一份拷貝,這些子進程都是可以對其進行更改的,但是文本段是兩者共享的,不能被子進程進行修改。


      下面是fork的使用方法:

wKiom1eVgOjA0MHWAAB1SP7g2ro560.png


        運行結果:

wKiom1eVganyzrMKAAAR-BtYeMg291.png


★進程終止

      進程終止有以下幾種方式:

             (1)從main函數返回

              (2)調用exit函數

              (3)調用_exit或_Exit;

              (4)最後一個線程從啓動例程返回

              (5)最後一個線程調用pthread_exit;

              (6)調用abort函數

              (7)接到一個信號並終止

              (8)最後一個線程對取消請求做出相應


      前5種爲正常終止,後三種爲異常終止。從main函數中return退出爲進程退出,因爲沒有在繼續執行的代碼,但是在程序中間的任何位置return,不算是進程退出,只能算是程序調用結束。

      exit返回:

                 exit()還讓return系統會強制刷新緩衝區,文件描述符

                _exit()強制直接結束,不需要管其餘的東西

                _Exit()和_exit是相同的 


★exit函數與atexit函數

(1)exit、atexit函數定義

       頭文件:#include <stdlib.h>                  頭文件:#include <stdlib.h>

                     void exit(int status);                                int atexit(void (*fun)(void));


     一個進程可以登記若干個函數,這些函數由exit自動調用,這些函數被稱爲終止處理函數,atexit函數就可以登記這些函數。exit調用終止處理函數的順序和atexit登記的順序是相反的,如果一個函數可以被多次的登記,也可以被多次的調用。

    

wKioL1eVjNeyY5DEAABjm3-k2jg697.png

     運行結果:

wKioL1eVjWKAk_mcAAAryMshYj8146.png


★棧幀

1.堆棧

      堆棧是C語言以及其他語言運行時必須使用的一塊空間,它的主要作用是函數調用、傳遞參數、保存返回地址、提供局部變量空間的。

      ①堆需要程序員自己申請,並且需要顯示的進行釋放,申請和釋放必須是成對出現的,要不然就會出現內存泄漏,因爲堆上的空間生命週期都是一直存在,直到手動進行釋放。而棧是系統自動進行分配的,回收也是進程運行結束時系統自動回收。

      ②堆的空間較大,棧的空間小,一般申請大的內存都在堆上。


2.棧幀的詳細解釋:http://blog.csdn.net/yxysdcl/article/details/5569351




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章