linux下的進程

        +--------------------------------------+ 
        |             ......                   |  ... 省略了一些我們不需要關心的區 
        +--------------------------------------+ 
        |  env strings (環境變量字串)          | \ 
        +--------------------------------------+  \ 
        |  argv strings (命令行字串)           |   \ 
        +--------------------------------------+    \ 
        |  env pointers (環境變量指針)         |    SHELL的環境變量和命令行參數保存區 
        +--------------------------------------+    / 
        |  argv pointers (命令行參數指針)      |   / 
        +--------------------------------------+  / 
        |  argc (命令行參數個數)               | / 
        +--------------------------------------+ 
        |            main 函數的棧幀           | \ 
        +--------------------------------------+  \ 
        |            func_1 函數的棧幀         |   \ 
        +--------------------------------------+    \ 
        |            func_2 函數的棧幀         |     \ 
        +--------------------------------------+      \ 
        |            func_3 函數的棧幀         |      Stack (棧) 
        +......................................+      / 
        |                                      |     / 
                      ......                        / 
        |                                      |   / 
        +......................................+  / 
        |            Heap (堆)                 | / 
        +--------------------------------------+ 
        |        Uninitialised (BSS) data      |  非初始化數據(BSS)區 
        +--------------------------------------+ 
        |        Initialised data              |  初始化數據區 
        +--------------------------------------+ 
        |        Text                          |  文本區 
        +--------------------------------------+ 

上圖爲進程數據內存分配圖,底端爲內存低地址,文本區存放只讀程序代碼,由fork創建的子進程共享該段代碼,而其他數據區則從新開闢。Data段(初始化數據區)爲數據分配空間,BSS段只記錄數據所需內存大小,不爲其分配空間。

進程:進程是一個運行程序併爲其提供執行環境的實體,它包括一個地址空間和至少一個控制點,進程在這個地址空間上執行單一指令序列。進程地址空間包括可以訪問或引用的內存單元的集合,進程控制點通過一個一般稱爲程序計數器(program counter,PC)的硬件寄存器控制和跟蹤進程指令序列。進程作爲分配資源的基本單位,而線程作爲獨立運行和獨立調度的基本單位。
一旦操作系統發現了要求創建新進程的事件後,便調用進程創建原語Creat()按下述步驟創建一個新進程。
1) 申請空白PCB。爲新進程申請獲得唯一的數字標識符,並從PCB集合中索取一個空白PCB。
2) 爲新進程分配資源。爲新進程的程序和數據以及用戶棧分配必要的內存空間。顯然,此時操作系統必須知道新進程所需要的內存大小。
3) 初始化進程控制塊。PCB的初始化包括:
①初始化標識信息,將系統分配的標識符和父進程標識符,填入新的PCB中。
②初始化處理機狀態信息,使程序計數器指向程序的入口地址,使棧指針指向棧頂。
③初始化處理機控制信息,將進程的狀態設置爲就緒狀態或靜止就緒狀態,對於優先級,通常是將它設置爲最低優先級,除非用戶以顯式的方式提出高優先級要求。
4) 將新進程插入就緒隊列,如果進程就緒隊列能夠接納新進程,便將新進程插入到就緒隊列中。
在android系統中發生段錯誤時可通過PC地址查詢段錯誤發生所對應的源碼。

線程中都應具有一個用於控制線程運行的線程控制塊TCB,用於指示被執行指令序列的程序計數器、保留局部變量、少數狀態參數和返回地址等的一組寄存器堆棧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章