




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第8章Linux進程內容提要Linux進程概述進程地址空間進程控制進程優先級和調度策略守護近程8.1Linux進程概述進程概述
進程是程序的一次運行,是運行中的程序,它是處理器調度的基本單位,Linux支持多種調度策略,例如,完全公平調度和實時調度等。從進程所處的層次,進程可分為用戶進程和內核線程,內核線程屬于內核的一部分,用戶進程最初源自加載的可執行程序。進程也是資源的擁有者和管理者,其管理的內容包括地址空間、打開的文件和身份憑證等,它們均存儲于每個進程的進程控制塊。進程管理的資源textdata文件描述符表stack
可執行文件實際用戶ID實際用戶組ID有效用戶ID有效用戶組ID用戶標識進程與會話標識虛擬地址空間打開的文件工作目錄信號開始地址結束地址缺頁操作開始地址結束地址缺頁操作內存區域1內存區域2用戶地址空間目錄項當前偏移量文件操作集文件描述進程ID父進程ID進程組ID會話ID進程標識用戶身份進程控制塊信號06301應用編程接口分類API功能描述用戶地址空間malloc/free申請/釋放動態內存brk設置堆區域的大小進程控制fork/_exit創建/終止子進程execve加載可執行二進制映像文件system執行Shell命令wait/waitpid等待子進程狀態的改變進程優先給與調度策略sched_getscheduler/sched_setscheduler獲取/設置進程/線程所屬的調度策略sched_getparam/sched_setparam獲取/設置調度參數getpriority/setpriority獲取/設置進程的優先級sched_yield釋放CPU的控制權sched_getaffinity/sched_setaffinity獲取/設置進程的CPU親和力openlog/closelog打開/關閉與日志系統的鏈接syslog記錄一條日志信息8.2進程地址空間進程地址空間的劃分
進程地址空間被劃分為內核空間和用戶空間,內核空間為內核映射,它們共享內核;用戶空間源自加載的可執行程序,它們通常彼此獨立。為了便于管理,用戶空間被劃分為若干區域,其中包括,代碼區、數據區、堆、棧和mmap映射區,不同區域的功能也不相同。進程地址空間結構未初始化數據(.bss)Linux內核棧(stack)初始化數據(.data)代碼(.text)0xc0000000用戶虛擬地址空間堆(heap)mmap內存映射etextedataendbrk輔助信息環境變量命令行參數0x000000000x08048000文本段
代碼區源自可執行文件的文本段,為程序加載時生成的內存映射,其內容為源碼編譯生成的指令序列和只讀數據。進程運行期間,代碼區內容保持不變,因此,多個運行實例可共享代碼區,代碼區僅需保留一份副本。數據段
數據區源自可執行文件的數據段,為程序加載時生成的內存映射,其內容為全局變量和靜態變量,它被進一步分為未初始化數據區和初始化數據區。未初始化的全局變量和靜態變量存儲于未初始化數據區,已初始化的全局變量和靜態變量存儲于初始化數據區,有些編譯器允許將未初始化數據和初始化數據合并成一個數據段。進程執行期間,數據區的內容可能發生改變,因此,程序的多個運行實例有各自獨立的數據區。4堆(heap)堆是內核為程序運行所構建環境的一部分,它位于數據區與棧之間,用于進程的動態內存管理。例如,C/C++中的malloc/new和free/delete函數。
Linux系統中,用戶進程所使用的堆由glibc實現,在可執行文件加載至用戶空間時完成初始化。棧(stack)
棧同樣是內核為程序運行所構建環境的一部分,它位于用戶空間的底部,它是一種先進后出的數據結構,用于存放臨時數據,例如,函數內的局部變量、函數參數和返回地址等。在加載程序時,會將輔助信息、環境變量和命令行參數壓入棧底。其中,輔助信息以向量表的形式存儲,實現信息向進程的傳遞。棧幀結構字符串argcargv[0]...argv[n]0environ[0]...environ[n]0...AT_NULL字符串命令行參數數量命令行參數起始地址環境變量起始地址...輔助信息向量表mmap內存映射區
mmap內存映射區位于堆和棧之間,可利用mmap函數創建,主要用于共享庫的加載、共享內存和文件I/O映射等。實例分析externchar**environ;int
main(int
argc,char*argv[]){ for(intj=0;j<argc;j++)
printf("argv[%d]:%s\n",j,argv[j]); for(intj=0;environ[j];j++)
printf("environ[%d]:%s\n",j,environ[j]);exit(0);}8.3進程控制內容提要子進程的創建與終止加載可執行文件程序的啟動與結束執行Shell命令監控進程狀態的改變子進程的創建
子進程被創建時,內核將調用者進程擁有的資源復制給子進程,資源包括進程的用戶空間和打開的文件等。為了使它們有各自的執行邏輯,內核在父進程的棧中壓入子進程ID,在子進程的棧中壓入0,當它們再次運行時,按各自軌跡執行。進程執行期間,可能只有少數數據被修改,為了節省資源,Linux內核采用了寫時復制算法(COW)。寫時復制COWstacktask_struct
datastackcodetask_struct
父進程子進程datastackcodedatacodetask_struct
task_struct
父進程子進程代碼區數據區棧區代碼區數據區棧區代碼區數據區棧區物理頁映射映射創建子進程時,父子進程共享用戶地址空間父子進程的一方在修改數據前,各自生成一個拷貝創建子進程fork頭文件
#include<unistd.h>函數原型
pid_tfork();功能 創建子進程。參數 無。返回值 父進程成功返回新建子進程ID, 子進程成功返回0,失敗返回-1。
實例分析int glob=10;int
main(void){
intlocal;
pid_t
pid; local=8; if((pid=fork())==0){ sleep(2); }else{ glob++; local--; sleep(10); }
printf("pid=%d,glob=%d,localar=%d\n",getpid(),glob,local); exit(0);}結束進程
終止的進程進入僵尸狀態,釋放除返回值外的其他所有資源,等待父進程確認,父進程獲得返回值后,釋放其產六信息,根據返回值作相應處理。
_exit和exot函數軍可用于結束進程,_exit屬于核心函數,而exit屬于庫函數,exit建立在_exit函數基礎之上,此外,還負責進程前的善后處理工作。_exit函數頭文件
#include<unistd.h>函數原型
void_exit(intstatus);功能 結束進程。參數
Status:結束狀態。返回值 不返回。exit函數頭文件
#include<stdlib.h>函數原型
voidexit(intstatus);功能 終止進程。參數
status:返回值。返回值 無。ELF格式ELF(ExcutableandLinkableFormat)是一種可執行和可鏈接的格式,它源自SystemV系統,與其他格式相比,具有較強的靈活性,根據用途,可進一步分為四種類型。1.可執行文件該格式的文件可直接加載執行,由可重定位目標文件經靜態鏈接產生。2.可重定位文件(.o文件)該格式的文件由源碼經編譯后生成,是一種包含重定位信息的中間代碼,供鏈接器使用。ELF格式(續)3.共享庫(.so文件)該格式的文件為源碼經編譯后生成地址無關的目標文件,供動態鏈接器在程序加載時使用。4.核心轉儲文件該格式的文件在信號處理時生成,為信號發生時進程的內存映像,用于程序調試。elf文件格式程序頭表節頭表ELF頭可鏈接視圖可執行視圖段節ELF文件通常包含程序頭和節頭兩種類型的頭部結構,可從可執行和可鏈接兩個角度描述ELF文件的內容,加載可執行文件頭文件
#include<unistd.h>函數原型
int
execve(constchar*filename,char*constargv[],char*constenvp[]);功能 加載可執行文件。參數
filename:文件的路徑名。
argv[]:命令行參數。
envp[]:環境變量。返回值 成功不返回,失敗返回-1。加載可執行程序task_struct
文件頭堆棧段數據段文本段ELF映像磁盤代碼區數據區棧區棧區數據區代碼區實例分析int
main(int
argc,char*argv[]){ char*newargv[]={NULL,"hello","world",NULL}; char*newenviron[]={"var1=123","var2=hello","helloUnix",NULL}; if(argc!=2){
fprintf(stderr,"Usage:%s<file-to-exec>\n",argv[0]); exit(1); } newargv[0]=argv[1]; execve(argv[1],newargv,newenviron);
perror("execve"); exit(0);}程序的啟動與結束
出于編寫程序的便捷性,glibc對C程序進行了封裝,從程序員的角度,C程序從main函數開始運行,但事實上程序自start-up開始啟動,start-up在鏈接生成可執行文件時引入,目的是完成一系列初始化,例如,動態內存管理的初始化,待start-up執行完成后轉入main函數,最后通過exit函數結束進程,程序的運行exit庫函數標準I/O文件流清理exec終止處理函數1終止處理函數n…..Linux內核exitexitexit_exit用戶進程_exit_exitmain函數用戶自定義函數start-up函數監控子進程狀態的改變
進程運行期間狀態可能會發生變化,例如,收到SIGSTOP/SIGCONT信號使進程暫停/恢復運行,因調用exit函數、從main函數返回或收到SIGTERM信號導致進程終止。為了監控子進程狀態的改變,內核提供了同步和異步兩種方式,若采用同步方式;進程可通過調用wait/waitpid函數,以阻塞方式等待,直至目標進程狀態發生改變;若采用異步方式,當進程狀態改變時,父進程會收到來自子進程的SIGCHLD信號。等待子進程狀態改變頭文件
#include<sys/types.h> #include<sys/wait.h>函數原型
pid_t
wait(int*wstatus);
pid_t
waitpid(pid_t
pid,int*wstatus,intoptions);功能 等待子進程狀態發生改變。參數
pid:指定監控的子進程。
wstatus:返回狀態。
options:操作選項。返回值
wait/waitpid成功返回狀態改變的進程ID,失敗返回-1。waitpid函數參數status的宏含義WIFEXITED(wstatus)若為真,子進程正常結束,調用_exit/exit函數或從main函數返回WIFSIGNALED(wstatus)若為真,子進程因信號而終止WIFSTOPPED(wstatus)若為真,子進程因信號而暫停WIFCONTINUED(wstatus)若為真,子進程因SIGCONT信號繼續運行,自內核2.6.10起生效參數pid含義<?1任意進程組為-pid的子進程?1任意子進程0任意與調用者同組的子進程>0進程ID為pid的任意子進程waitpid函數中參數pid的定義waitpid函數中wstatus的宏定義8.4進程優先級和調度策略內容提要調度策略概述調度策略完全公平調度CFS實時調度策略進程的CPU親和力調度策略概述Linux繼承了Unix基于時間片的進程調度策略,但隨著Linux的不斷演化,進程調度策略也在不斷完善,自Linux內核2.6,開始支持實時調度策略。對于多處理器環境,每個CPU有各自的就緒隊列,隊列可能包含多種類型的進程,與普通進程相比,實時進程擁有更高的優先級,具有優先獲得CPU的權力。優先級對于不同類型的進程具有不同的含義,其定義取決于調度策略。獲取/設置進程調度策略頭文件
#include<sched.h>函數原型
int
sched_getscheduler(pid_t
pid);
int
sched_setscheduler(pid_t
pid,int
policy,const
struct
sched_param*param);功能 獲取/設置進程的調度策略。參數
Pid:進程ID。
policy:調度策略。
param:調度參數地址。返回值
sched_getscheduler函數成功返回調度策略,失敗返回-1。參數policy含義SCHED_OTHER標準時間片循環算法(CFS)SCHED_BATCH與SCHED_OTHER類似,但用于批量執行SCHED_IDLE與SCHED_OTHER類似,但優先級最低SCHED_FIFO基于先進先出的實時調度算法SCHED_RR基于時間片輪循的實時調度算法SCHED_RESET_ON_FORK創建的子進程不繼承父進程的調度策略獲取/設置進程調度策略頭文件
#include<sched.h>函數原型
int
sched_getparam(pid_t
pid,struct
sched_param*param);
int
sched_setparam(pid_t
pid,conststruct
sched_param*param);功能 獲取/設置進程的調度參數。參數
pid:進程ID。
param:調度參數的地址。返回值 成功,返回0,失敗,返回-1。完全公平調度CFS
CFS(CompletelyFairScheduler)完全公平調度算法自Linux內核2.6引入,通常作為系統的默認調度算法;對于每一次輪循,每個進程均有獲得處理器的機會,僅時間片大小不同,時間片的大小取決于進程的優先級。內核為每個CFS進程定義一個nice值作為優先級,其值從-20至19,默認情況下,其值為0,nice值表示進程獲得時間的權重,nice值越小,每次輪循獲得時間的權重越大。
CFS通常適用于交互式的個人電腦和服務器。獲取/設置nice值頭文件
#include<sys/resource.h>函數原型
int
getpriority(intwhich,id_twho);
int
setpriority(intwhich,id_twho,int
prio);功能 獲取/設置進程的優先級級。參數
which:進程的目標類型。
who:進程身份。
prio:優先級。返回值 成功返回0,失敗返回-1。實時調度策略
自內核2.6起引入了兩種類型的實時調度策略。,它們均基于優先級。內核為每個實時進程賦予一個優先級,其值從1(低)至99(高),調度器按優先級從高到低依次獲得CPU,高優先級進程優先獲得CPU,一旦有更高優先級進程就緒,運行中的進程將立即被更高優先級進程搶占。實時調度策略(續)1.基于時間片輪循的實時調度算法該算法在優先級的基礎上,對于相同優先級的進程,按時間片輪循。2.基于先進先出的實時調度算法該算法在優先級的基礎上,對于相同優先級的進程,按到達的先后順序依次執行。獲取/設置實時進程優先級范圍sched_get_priority_min/sched_get_priority_max函數頭文件
#include<sched.h>函數原型
int
sched_get_priority_min(intpolicy);
int
sched_get_priority_max(intpolicy);功能 獲取實時進程優先級的最小/最大值。參數
policy:調度策略。返回值 成功返回優先級,失敗返回-1。放棄CPU的控制權sched_yield函數頭文件
#include<sched.h>函數原型
int
sched_yield(void);功能 放棄CPU的控制權參數 無參數。返回值 成功,返回0,失敗,返回-1。進程的CPU親和力
在多處理器系統中,每個處理器有各自獨立的調度隊列,為了保持不同隊列在運行期間的負載均衡,從而發揮多處理器效率,必要時,進程可在不同隊列間遷移。
對于時間敏感的進程,可將其綁定至某個特定處理器,以免因遷移而造成的延期。配置進程的親和力
sched_getaffinity/sched_setaffinity函數頭文件
#include<sched.h>函數原型
int
sched_getaffinity(pid_t
pid,size_t
cpusetsize,cpu_set_t*mask)
int
sched_setaffinity(pid_t
pid,size_t
cpusetsize,const
cpu_set_t*mask);功能 獲取/設置進程與CPU的綁定關系。參數
pid:進程ID。
cpusetsize:掩碼字節數。
mask:綁定的CPU集合。返回值 成功返回0,失敗返回-1。8.5守護近程守護進程概述
守護進程是指如同守護者一般持續在系統中運行的進程,守護進程通常具有一下特征。不手控制終端的影響。2.最多存在一個運行實例。3.必要時產生日志信息。4.修改配置后無需重啟系統。守護進程的啟動方式1.在系統啟動時啟動。2.在登錄shell上啟動。該方式啟動的進程會繼承shell的某些資源,在守護進程初始化階段需作相應處理。創建守護進程1.切斷與控制終端的聯系。創建一個子進程,父進程終止,在子進程中調用setsid函數建立一個新的會話,新建會話未關聯控制終端。2.關閉所有打開的文件關閉繼承自父進程的所有已打開文件。3.設置根目錄、工作目錄和權限掩碼重新設置繼承自父進程的根目錄、工作目錄和權限掩碼。完善守護進程1.處理SIGTERM信號進程結束前會收到SIGTERM信號,提醒進程作相應的善后處理。2.處理SIGHUP信號利用SIGHUP信號,重新讀取修改后的配置文件。3.僅保留一個運行實例用文件鎖實現僅保留一個運行實例。4.處理產生的日志利用系統提供的日志服務,保存產生的日志信息。處理SIGTERM信號
在系統關機時,所有守護進程會收到初始化進程發送的SIGTERM信號,通知守護進程在結束前做好善后處置工作
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國智能水龍頭市場發展前景及投資建議研究研究報告
- 2025至2030有機原料奶行業競爭態勢分析及前景可持續發展規劃報告
- 2025至2030全球及中國掃地機器人行業供需前景探討及競爭格局研究報告
- 2025至2030中國黑硅行業發展現狀及未來趨勢研究報告
- 2025至2030中國隱形牙套市場經營現狀與投資趨勢研究報告
- 系統架構設計師考試計算題目及答案
- 理論與實踐結合的文化產業試題及答案
- 2025至2030中國觸頭材料產銷需求預測與營銷策略規劃報告
- 2025至2030中國磨刀器行業競爭策略與投資戰略規劃報告
- 2025至2030中國石墨烯市場發展潛力評估及趨勢前景研究報告
- 錘擊樁打樁作業安全培訓
- 網絡安全法律法規與倫理測試卷
- 幼兒園健康課程:保護心臟小課堂
- 2025年事業單位考試時事政治試100題及答案
- 電商平臺服務協議、交易規則
- 2025年服務器行業市場規模及主要企業市占率分析報告(智研咨詢發布)
- 2025年中國甲魚行業市場全景評估及發展戰略規劃報告
- 2025年中國汽車道路救援行業發展潛力分析及投資方向研究報告
- 防艾教育課件下載
- 2025年由民政局策劃的離婚協議官方文本模板
- 《人工智能發展史》課件
評論
0/150
提交評論