第 8 章 Linux進程電子課件_第1頁
第 8 章 Linux進程電子課件_第2頁
第 8 章 Linux進程電子課件_第3頁
第 8 章 Linux進程電子課件_第4頁
第 8 章 Linux進程電子課件_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章Linux進程內容提要Linux進程概述進程地址空間進程控制進程優(yōu)先級和調度策略守護近程8.1Linux進程概述進程概述

進程是程序的一次運行,是運行中的程序,它是處理器調度的基本單位,Linux支持多種調度策略,例如,完全公平調度和實時調度等。從進程所處的層次,進程可分為用戶進程和內核線程,內核線程屬于內核的一部分,用戶進程最初源自加載的可執(zhí)行程序。進程也是資源的擁有者和管理者,其管理的內容包括地址空間、打開的文件和身份憑證等,它們均存儲于每個進程的進程控制塊。進程管理的資源textdata文件描述符表stack

可執(zhí)行文件實際用戶ID實際用戶組ID有效用戶ID有效用戶組ID用戶標識進程與會話標識虛擬地址空間打開的文件工作目錄信號開始地址結束地址缺頁操作開始地址結束地址缺頁操作內存區(qū)域1內存區(qū)域2用戶地址空間目錄項當前偏移量文件操作集文件描述進程ID父進程ID進程組ID會話ID進程標識用戶身份進程控制塊信號06301應用編程接口分類API功能描述用戶地址空間malloc/free申請/釋放動態(tài)內存brk設置堆區(qū)域的大小進程控制fork/_exit創(chuàng)建/終止子進程execve加載可執(zhí)行二進制映像文件system執(zhí)行Shell命令wait/waitpid等待子進程狀態(tài)的改變進程優(yōu)先給與調度策略sched_getscheduler/sched_setscheduler獲取/設置進程/線程所屬的調度策略sched_getparam/sched_setparam獲取/設置調度參數getpriority/setpriority獲取/設置進程的優(yōu)先級sched_yield釋放CPU的控制權sched_getaffinity/sched_setaffinity獲取/設置進程的CPU親和力openlog/closelog打開/關閉與日志系統的鏈接syslog記錄一條日志信息8.2進程地址空間進程地址空間的劃分

進程地址空間被劃分為內核空間和用戶空間,內核空間為內核映射,它們共享內核;用戶空間源自加載的可執(zhí)行程序,它們通常彼此獨立。為了便于管理,用戶空間被劃分為若干區(qū)域,其中包括,代碼區(qū)、數據區(qū)、堆、棧和mmap映射區(qū),不同區(qū)域的功能也不相同。進程地址空間結構未初始化數據(.bss)Linux內核棧(stack)初始化數據(.data)代碼(.text)0xc0000000用戶虛擬地址空間堆(heap)mmap內存映射etextedataendbrk輔助信息環(huán)境變量命令行參數0x000000000x08048000文本段

代碼區(qū)源自可執(zhí)行文件的文本段,為程序加載時生成的內存映射,其內容為源碼編譯生成的指令序列和只讀數據。進程運行期間,代碼區(qū)內容保持不變,因此,多個運行實例可共享代碼區(qū),代碼區(qū)僅需保留一份副本。數據段

數據區(qū)源自可執(zhí)行文件的數據段,為程序加載時生成的內存映射,其內容為全局變量和靜態(tài)變量,它被進一步分為未初始化數據區(qū)和初始化數據區(qū)。未初始化的全局變量和靜態(tài)變量存儲于未初始化數據區(qū),已初始化的全局變量和靜態(tài)變量存儲于初始化數據區(qū),有些編譯器允許將未初始化數據和初始化數據合并成一個數據段。進程執(zhí)行期間,數據區(qū)的內容可能發(fā)生改變,因此,程序的多個運行實例有各自獨立的數據區(qū)。4堆(heap)堆是內核為程序運行所構建環(huán)境的一部分,它位于數據區(qū)與棧之間,用于進程的動態(tài)內存管理。例如,C/C++中的malloc/new和free/delete函數。

Linux系統中,用戶進程所使用的堆由glibc實現,在可執(zhí)行文件加載至用戶空間時完成初始化。棧(stack)

棧同樣是內核為程序運行所構建環(huán)境的一部分,它位于用戶空間的底部,它是一種先進后出的數據結構,用于存放臨時數據,例如,函數內的局部變量、函數參數和返回地址等。在加載程序時,會將輔助信息、環(huán)境變量和命令行參數壓入棧底。其中,輔助信息以向量表的形式存儲,實現信息向進程的傳遞。棧幀結構字符串argcargv[0]...argv[n]0environ[0]...environ[n]0...AT_NULL字符串命令行參數數量命令行參數起始地址環(huán)境變量起始地址...輔助信息向量表mmap內存映射區(qū)

mmap內存映射區(qū)位于堆和棧之間,可利用mmap函數創(chuàng)建,主要用于共享庫的加載、共享內存和文件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進程控制內容提要子進程的創(chuàng)建與終止加載可執(zhí)行文件程序的啟動與結束執(zhí)行Shell命令監(jiān)控進程狀態(tài)的改變子進程的創(chuàng)建

子進程被創(chuàng)建時,內核將調用者進程擁有的資源復制給子進程,資源包括進程的用戶空間和打開的文件等。為了使它們有各自的執(zhí)行邏輯,內核在父進程的棧中壓入子進程ID,在子進程的棧中壓入0,當它們再次運行時,按各自軌跡執(zhí)行。進程執(zhí)行期間,可能只有少數數據被修改,為了節(jié)省資源,Linux內核采用了寫時復制算法(COW)。寫時復制COWstacktask_struct

datastackcodetask_struct

父進程子進程datastackcodedatacodetask_struct

task_struct

父進程子進程代碼區(qū)數據區(qū)棧區(qū)代碼區(qū)數據區(qū)棧區(qū)代碼區(qū)數據區(qū)棧區(qū)物理頁映射映射創(chuàng)建子進程時,父子進程共享用戶地址空間父子進程的一方在修改數據前,各自生成一個拷貝創(chuàng)建子進程fork頭文件

#include<unistd.h>函數原型

pid_tfork();功能 創(chuàng)建子進程。參數 無。返回值 父進程成功返回新建子進程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);}結束進程

終止的進程進入僵尸狀態(tài),釋放除返回值外的其他所有資源,等待父進程確認,父進程獲得返回值后,釋放其產六信息,根據返回值作相應處理。

_exit和exot函數軍可用于結束進程,_exit屬于核心函數,而exit屬于庫函數,exit建立在_exit函數基礎之上,此外,還負責進程前的善后處理工作。_exit函數頭文件

#include<unistd.h>函數原型

void_exit(intstatus);功能 結束進程。參數

Status:結束狀態(tài)。返回值 不返回。exit函數頭文件

#include<stdlib.h>函數原型

voidexit(intstatus);功能 終止進程。參數

status:返回值。返回值 無。ELF格式ELF(ExcutableandLinkableFormat)是一種可執(zhí)行和可鏈接的格式,它源自SystemV系統,與其他格式相比,具有較強的靈活性,根據用途,可進一步分為四種類型。1.可執(zhí)行文件該格式的文件可直接加載執(zhí)行,由可重定位目標文件經靜態(tài)鏈接產生。2.可重定位文件(.o文件)該格式的文件由源碼經編譯后生成,是一種包含重定位信息的中間代碼,供鏈接器使用。ELF格式(續(xù))3.共享庫(.so文件)該格式的文件為源碼經編譯后生成地址無關的目標文件,供動態(tài)鏈接器在程序加載時使用。4.核心轉儲文件該格式的文件在信號處理時生成,為信號發(fā)生時進程的內存映像,用于程序調試。elf文件格式程序頭表節(jié)頭表ELF頭可鏈接視圖可執(zhí)行視圖段節(jié)ELF文件通常包含程序頭和節(jié)頭兩種類型的頭部結構,可從可執(zhí)行和可鏈接兩個角度描述ELF文件的內容,加載可執(zhí)行文件頭文件

#include<unistd.h>函數原型

int

execve(constchar*filename,char*constargv[],char*constenvp[]);功能 加載可執(zhí)行文件。參數

filename:文件的路徑名。

argv[]:命令行參數。

envp[]:環(huán)境變量。返回值 成功不返回,失敗返回-1。加載可執(zhí)行程序task_struct

文件頭堆棧段數據段文本段ELF映像磁盤代碼區(qū)數據區(qū)棧區(qū)棧區(qū)數據區(qū)代碼區(qū)實例分析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在鏈接生成可執(zhí)行文件時引入,目的是完成一系列初始化,例如,動態(tài)內存管理的初始化,待start-up執(zhí)行完成后轉入main函數,最后通過exit函數結束進程,程序的運行exit庫函數標準I/O文件流清理exec終止處理函數1終止處理函數n…..Linux內核exitexitexit_exit用戶進程_exit_exitmain函數用戶自定義函數start-up函數監(jiān)控子進程狀態(tài)的改變

進程運行期間狀態(tài)可能會發(fā)生變化,例如,收到SIGSTOP/SIGCONT信號使進程暫停/恢復運行,因調用exit函數、從main函數返回或收到SIGTERM信號導致進程終止。為了監(jiān)控子進程狀態(tài)的改變,內核提供了同步和異步兩種方式,若采用同步方式;進程可通過調用wait/waitpid函數,以阻塞方式等待,直至目標進程狀態(tài)發(fā)生改變;若采用異步方式,當進程狀態(tài)改變時,父進程會收到來自子進程的SIGCHLD信號。等待子進程狀態(tài)改變頭文件

#include<sys/types.h> #include<sys/wait.h>函數原型

pid_t

wait(int*wstatus);

pid_t

waitpid(pid_t

pid,int*wstatus,intoptions);功能 等待子進程狀態(tài)發(fā)生改變。參數

pid:指定監(jiān)控的子進程。

wstatus:返回狀態(tài)。

options:操作選項。返回值

wait/waitpid成功返回狀態(tài)改變的進程ID,失敗返回-1。waitpid函數參數status的宏含義WIFEXITED(wstatus)若為真,子進程正常結束,調用_exit/exit函數或從main函數返回WIFSIGNALED(wstatus)若為真,子進程因信號而終止WIFSTOPPED(wstatus)若為真,子進程因信號而暫停WIFCONTINUED(wstatus)若為真,子進程因SIGCONT信號繼續(xù)運行,自內核2.6.10起生效參數pid含義<?1任意進程組為-pid的子進程?1任意子進程0任意與調用者同組的子進程>0進程ID為pid的任意子進程waitpid函數中參數pid的定義waitpid函數中wstatus的宏定義8.4進程優(yōu)先級和調度策略內容提要調度策略概述調度策略完全公平調度CFS實時調度策略進程的CPU親和力調度策略概述Linux繼承了Unix基于時間片的進程調度策略,但隨著Linux的不斷演化,進程調度策略也在不斷完善,自Linux內核2.6,開始支持實時調度策略。對于多處理器環(huán)境,每個CPU有各自的就緒隊列,隊列可能包含多種類型的進程,與普通進程相比,實時進程擁有更高的優(yōu)先級,具有優(yōu)先獲得CPU的權力。優(yōu)先級對于不同類型的進程具有不同的含義,其定義取決于調度策略。獲取/設置進程調度策略頭文件

#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標準時間片循環(huán)算法(CFS)SCHED_BATCH與SCHED_OTHER類似,但用于批量執(zhí)行SCHED_IDLE與SCHED_OTHER類似,但優(yōu)先級最低SCHED_FIFO基于先進先出的實時調度算法SCHED_RR基于時間片輪循的實時調度算法SCHED_RESET_ON_FORK創(chuàng)建的子進程不繼承父進程的調度策略獲取/設置進程調度策略頭文件

#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引入,通常作為系統的默認調度算法;對于每一次輪循,每個進程均有獲得處理器的機會,僅時間片大小不同,時間片的大小取決于進程的優(yōu)先級。內核為每個CFS進程定義一個nice值作為優(yōu)先級,其值從-20至19,默認情況下,其值為0,nice值表示進程獲得時間的權重,nice值越小,每次輪循獲得時間的權重越大。

CFS通常適用于交互式的個人電腦和服務器。獲取/設置nice值頭文件

#include<sys/resource.h>函數原型

int

getpriority(intwhich,id_twho);

int

setpriority(intwhich,id_twho,int

prio);功能 獲取/設置進程的優(yōu)先級級。參數

which:進程的目標類型。

who:進程身份。

prio:優(yōu)先級。返回值 成功返回0,失敗返回-1。實時調度策略

自內核2.6起引入了兩種類型的實時調度策略。,它們均基于優(yōu)先級。內核為每個實時進程賦予一個優(yōu)先級,其值從1(低)至99(高),調度器按優(yōu)先級從高到低依次獲得CPU,高優(yōu)先級進程優(yōu)先獲得CPU,一旦有更高優(yōu)先級進程就緒,運行中的進程將立即被更高優(yōu)先級進程搶占。實時調度策略(續(xù))1.基于時間片輪循的實時調度算法該算法在優(yōu)先級的基礎上,對于相同優(yōu)先級的進程,按時間片輪循。2.基于先進先出的實時調度算法該算法在優(yōu)先級的基礎上,對于相同優(yōu)先級的進程,按到達的先后順序依次執(zhí)行。獲取/設置實時進程優(yōu)先級范圍sched_get_priority_min/sched_get_priority_max函數頭文件

#include<sched.h>函數原型

int

sched_get_priority_min(intpolicy);

int

sched_get_priority_max(intpolicy);功能 獲取實時進程優(yōu)先級的最小/最大值。參數

policy:調度策略。返回值 成功返回優(yōu)先級,失敗返回-1。放棄CPU的控制權sched_yield函數頭文件

#include<sched.h>函數原型

int

sched_yield(void);功能 放棄CPU的控制權參數 無參數。返回值 成功,返回0,失敗,返回-1。進程的CPU親和力

在多處理器系統中,每個處理器有各自獨立的調度隊列,為了保持不同隊列在運行期間的負載均衡,從而發(fā)揮多處理器效率,必要時,進程可在不同隊列間遷移。

對于時間敏感的進程,可將其綁定至某個特定處理器,以免因遷移而造成的延期。配置進程的親和力

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:掩碼字節(jié)數。

mask:綁定的CPU集合。返回值 成功返回0,失敗返回-1。8.5守護近程守護進程概述

守護進程是指如同守護者一般持續(xù)在系統中運行的進程,守護進程通常具有一下特征。不手控制終端的影響。2.最多存在一個運行實例。3.必要時產生日志信息。4.修改配置后無需重啟系統。守護進程的啟動方式1.在系統啟動時啟動。2.在登錄shell上啟動。該方式啟動的進程會繼承shell的某些資源,在守護進程初始化階段需作相應處理。創(chuàng)建守護進程1.切斷與控制終端的聯系。創(chuàng)建一個子進程,父進程終止,在子進程中調用setsid函數建立一個新的會話,新建會話未關聯控制終端。2.關閉所有打開的文件關閉繼承自父進程的所有已打開文件。3.設置根目錄、工作目錄和權限掩碼重新設置繼承自父進程的根目錄、工作目錄和權限掩碼。完善守護進程1.處理SIGTERM信號進程結束前會收到SIGTERM信號,提醒進程作相應的善后處理。2.處理SIGHUP信號利用SIGHUP信號,重新讀取修改后的配置文件。3.僅保留一個運行實例用文件鎖實現僅保留一個運行實例。4.處理產生的日志利用系統提供的日志服務,保存產生的日志信息。處理SIGTERM信號

在系統關機時,所有守護進程會收到初始化進程發(fā)送的SIGTERM信號,通知守護進程在結束前做好善后處置工作

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論