Linux系統編程(一)
- 一、進程和程序
- 二、內存布局
- 內核空間
- 用戶空間
- 三、進程狀態
- 四、環境變量
- 五、進程共享
一、進程和程序
程序:是指編譯好的二進制文件,存儲在磁盤中,不占用系統資源。
進程:是系統進行資源分配的基本單位,進程是活躍的程序,占用系統資源。在內存中執行。
兩者關系:程序運行的時候,會產生進程。
二、內存布局
內存分為兩個區域,一個是內核空間,另一個就是用戶空間。
內核空間
進程陷入內核態后才能夠訪問的空間。內核中有一塊PCB進程控制塊,主要負責維護進程相關的信息。棧內存的申請和釋放都由編譯器自動完成,并且棧容量由系統預先定義的。棧從高地址到低地址增長。
用戶空間
棧:棧用來存放臨時創建的局部變量,如函數的參數、內部變量等。每調用一次函數,就會將參數壓入進程調用棧中,調用結束后也會被返回棧中。同時,每調用一個函數就會創建一個新的棧,所以遞歸函數的時候會導致棧溢出
文件映射段:也叫共享區,文件映射段主要包括共享內存、動態鏈接庫等共享資源,從低地址向高地址增長。
堆:堆用來存放動態分配的內存。堆內存由用戶申請分配和釋放,從低地址向高地址增長。
BSS:BSS段用來存放程序中未初始化的全局變量和靜態變量。
數據段:數據段用來存放程序中已初始化全局變量與靜態變量。
代碼段:代碼段用來存放程序執行代碼,也可能包含一些只讀的常量。這塊區域的大小在程序運行時就已經確定,并且為了防止代碼和常量遭到修改,代碼段被設置為只讀。
三、進程狀態
進程基本的狀態有5種。分別為初始態,就緒態,運行態,掛起態與終止態。其中初始態為進程準備階段,常與就緒態結合來看。
四、環境變量
環境變量,是指在操作系統中用來指定操作系統運行環境的一些參數
例如:ls實際上也是一個程序,但是為什么我們不需要加入完整的路徑名/bin/ls呢?當我們執行的ls的時候,操作系統會現在環境變量中查找ls命令所在的目錄/bin,然后執行該目錄下的程序。
五、進程共享
fork函數
父子之間的共享遵循讀時共享寫時復制的原則,使用全局變量并不能進行父子進程間的數據共享。全局變量是存在data段的,父進程修改全局變量和子進程修改全局變量是在data段的不同內存空間修改的。