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