第6章進程與存儲管理示例_第1頁
第6章進程與存儲管理示例_第2頁
第6章進程與存儲管理示例_第3頁
第6章進程與存儲管理示例_第4頁
第6章進程與存儲管理示例_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第6章 進程與存儲管理示例nLinux進程和存儲管理簡介nLinux進程結(jié)構(gòu)nLinux進程控制nLinux進程調(diào)度n進程通信nLinux存儲管理第6章 進程與存儲管理示例6.1 Linux進程和存儲管理簡介nLinux系統(tǒng)的核心部分,從整體上分兩大部分:“靜”的文件系統(tǒng)“動”的進程控制系統(tǒng)兩者之間通過數(shù)據(jù)結(jié)構(gòu)和函數(shù)調(diào)用相互作用nLinux將一個程序看作是一個可執(zhí)行文件,而把一個進程看作是程序的執(zhí)行或執(zhí)行中的程序?qū)嵗?.1 Linux進程和存儲管理簡介nLinux系統(tǒng)的啟動系統(tǒng)自舉,并初始化各種數(shù)據(jù)結(jié)構(gòu)與表格、初始化Linux核心的各個子系統(tǒng)等建立0#進程或idle進程唯一一個靜態(tài)建立的進程建

2、立控制終端進程及運行shell進程的init進程(也稱為1#進程)不同終端創(chuàng)建相應(yīng)的終端管理進程和shell進程在建立shell進程之后,出現(xiàn)相應(yīng)的提示符,等待用戶輸入命令圖6.1 Linux系統(tǒng)中各進程的關(guān)系6.1 Linux進程和存儲管理簡介nLinux系統(tǒng)中各進程的關(guān)系0#進程或idle進程祖先進程1#進程或init進程終端管理進程與shell進程的父進程用戶進程由Shell進程創(chuàng)建,是Shell進程的子孫進程6.1 Linux進程和存儲管理簡介n0#進程運行在核心態(tài),而init進程以及由init進程衍生的其他進程都可以在用戶態(tài)和核心態(tài)下執(zhí)行n用戶態(tài)與核心態(tài)的區(qū)別用戶態(tài)下的進程只能存取它

3、們自己的指令與數(shù)據(jù),而核心態(tài)下的進程可以存取核心和用戶地址在不同的執(zhí)行模式下,同一進程使用不同的堆棧,分別稱為核心態(tài)堆棧與用戶態(tài)堆棧。6.1 Linux進程和存儲管理簡介n核心線程:只在核心態(tài)下執(zhí)行的進程核心線程有:0#進程、kblockd、ksoftirqd、kswapd等等,常用于處理一些周期性事務(wù)圖6.2 Linux進程的核心態(tài)與用戶態(tài)之間的轉(zhuǎn)換6.1 Linux進程和存儲管理簡介nLinux的進程控制系統(tǒng)在邏輯上有4個模塊與文件系統(tǒng)的接口部分進程本身的控制部分進程間的控制部分存儲管理部分6.1 Linux進程和存儲管理簡介nLinux調(diào)度模塊調(diào)度原則:搶占式、動態(tài)優(yōu)先級調(diào)度法調(diào)度過程s

4、chedule()和時鐘中斷修改進程的動態(tài)優(yōu)先級6.1 Linux進程和存儲管理簡介nLinux中引起進程調(diào)度的情況當前執(zhí)行進程申請資源未得到滿足,自己調(diào)用sleep過程,放棄CPU,進入睡眠狀態(tài)為了與其他進程保持同步,調(diào)用wait過程,主動放棄CPU,進入睡眠狀態(tài)時間片用完,或某個更高優(yōu)先級進程被喚醒,系統(tǒng)設(shè)置need_resched調(diào)度標志。當系統(tǒng)在核心態(tài)下的程序執(zhí)行完畢,由核心態(tài)轉(zhuǎn)入用戶態(tài)時,即在中斷陷入總控處理程序結(jié)束之前的瞬間,檢查need_resched標志并進行調(diào)度當前進程調(diào)用exit,自我終止時6.1 Linux進程和存儲管理簡介nLinux進程通信包括:用于控制各并發(fā)進程執(zhí)行

5、速度和資源共享與競爭的低級通信,以及進程間大量傳遞信息的高級通信同步機制n在核心態(tài)下執(zhí)行時,系統(tǒng)進程使用:信號量、自旋鎖、關(guān)閉中斷、使用原子操作等n在用戶態(tài)下執(zhí)行時,用戶進程使用:軟中斷信號、管道、調(diào)用系統(tǒng)調(diào)用wait或sleep使得當前執(zhí)行進程進入等待狀態(tài)6.1 Linux進程和存儲管理簡介nLinux存儲管理模塊控制存儲分配管理進程在內(nèi)存和外存之間的信息轉(zhuǎn)移,以便所有進程都得到公平執(zhí)行的機會6.2 Linux進程結(jié)構(gòu)n進程的概念n進程的虛擬地址結(jié)構(gòu)n進程上下文n進程的狀態(tài)和狀態(tài)轉(zhuǎn)換6.2 Linux進程結(jié)構(gòu)n介紹Linux進程的靜態(tài)構(gòu)成,定義進程上下文及其狀態(tài)轉(zhuǎn)換6.2.1 進程的概念進程

6、的含義與特性進程控制塊:Linux的task_struct結(jié)構(gòu)n標識進程狀態(tài)用的狀態(tài)位:5個狀態(tài)編碼n進程標識符n描述進程家族關(guān)系、組成成員的指針n6.2 Linux進程結(jié)構(gòu)6.2.2 進程的虛擬地址結(jié)構(gòu)Linux進程的虛擬地址結(jié)構(gòu)依賴于硬件在Intel 80 x86中,每個進程擁有一個4GB的虛擬空間。其中:n03GB的地址空間由用戶進程使用,可以對其直接訪問; n34GB的地址空間稱為核心地址空間,在所有的進程中共享,存放核心的正文和數(shù)據(jù),只被核心使用,用戶進程不能直接訪問6.2.2 進程的虛擬地址結(jié)構(gòu)nLinux將用戶進程的所有地址空間有關(guān)的信息保存在mm_struct數(shù)據(jù)結(jié)構(gòu)中,該結(jié)構(gòu)

7、的指針保存進程描述符中nLinux的進程由邏輯段組成,而這些邏輯段則存放在若干個虛擬區(qū)域中。正文、數(shù)據(jù)和棧分別存放于各自的區(qū)中。nLinux的區(qū)類似于段頁式管理中的段,但區(qū)的虛擬地址是一維的6.2.2 進程的虛擬地址結(jié)構(gòu)n虛擬區(qū)域的管理名稱:區(qū)命名為vm_area,簡寫為VMA管理:n每個區(qū)對應(yīng)一個vm_area_strct結(jié)構(gòu)n創(chuàng)建新進程時,核心將從父進程復(fù)制相應(yīng)的表項給所創(chuàng)建的進程n使用平衡AVL二叉樹來組織和管理區(qū)域n對于用戶進程,通過系統(tǒng)調(diào)用mmap( )創(chuàng)建一個虛擬區(qū)域,通過系統(tǒng)調(diào)用munmap( )釋放虛擬區(qū)域6.2.3 進程上下文n進程上下文的基本結(jié)構(gòu)核心態(tài)棧:裝進程調(diào)用核心函數(shù)

8、時用到的有關(guān)參數(shù)等用戶態(tài)棧:在用戶態(tài)下執(zhí)行時函數(shù)調(diào)用的參數(shù)、局部變量及其他數(shù)據(jù)圖6.3 進程空間結(jié)構(gòu)圖6.4 執(zhí)行copy程序時用戶棧和核心棧的變化6.2.3 進程上下文n進程上下文的組成部分task_struct數(shù)據(jù)結(jié)構(gòu)用戶棧和核心棧的內(nèi)容用戶地址空間的正文段、數(shù)據(jù)段硬件寄存器頁表6.2.4 進程的狀態(tài)和狀態(tài)轉(zhuǎn)換nLinux的5個進程狀態(tài)TASK_RUNNING:進程處于執(zhí)行或就緒狀態(tài)TASK_INTERRUPTIBLE:進程正在睡眠,但可以被軟中斷信號喚醒TASK_UNINTERRUPTIBLE:進程正在睡眠,且不可以被軟中斷信號喚醒TASK_STOPPED:暫停,當一個進程SIGSTOP

9、、SIGSTP、SIGTTIN、SIGTTOU軟中斷信號后進入暫停狀態(tài)TASK_ZOMBIE:進程執(zhí)行系統(tǒng)調(diào)用exit后,進入僵死狀態(tài)6.2.4 進程的狀態(tài)和狀態(tài)轉(zhuǎn)換圖6.5 進程狀態(tài)轉(zhuǎn)換圖6.2.5 小結(jié)n進程上下文是進程的靜態(tài)描述進程描述符task_struct結(jié)構(gòu)是系統(tǒng)感知進程存在的唯一實體。 task_struct結(jié)構(gòu)包含了進程調(diào)度和運行所需要的大量數(shù)據(jù)結(jié)構(gòu),并且常住內(nèi)存正文段和數(shù)據(jù)段是進程完成所要求任務(wù)的關(guān)鍵部分寄存器和頁表等都是為正文段順利執(zhí)行而用來存放中間結(jié)果、傳遞參數(shù)、或區(qū)別控制CPU的訪問模式和完成地址變換等功能的n進程的狀態(tài)轉(zhuǎn)換6.3 進程控制nLinux啟動及進程樹的形成

10、n進程控制6.3 進程控制6.3.1 Linux啟動及進程樹的形成Linux啟動,系統(tǒng)建立0#進程或idle進程0#進程將根文件系統(tǒng)安裝到根“/”下,創(chuàng)建新進程1#進程 (也稱為init進程)init進程負責初始化所有新的用戶進程init進程調(diào)用exec執(zhí)行程序“/sbin/init”后,為每個終端生成一個子進程,然后等待用戶在終端上注冊用戶在終端輸入命令,每個命令都對應(yīng)一個可執(zhí)行文件圖6.6 進程樹的形成6.3.2 進程控制n進程創(chuàng)建fork()、執(zhí)行exec()和自我終止exit()n創(chuàng)建進程fork()功能:創(chuàng)建一個子進程。調(diào)用fork的進程稱為父進程格式:pid= fork();從系統(tǒng)

11、調(diào)用fork返回時,父進程和子進程除了返回值pid與task_struct結(jié)構(gòu)中某些特性參數(shù)不同之外,其他完全相同。CPU在父進程中時,pid值為所創(chuàng)建子進程的進程號,若在子進程時, pid值為零。6.3.2 進程控制n系統(tǒng)調(diào)用fork通過執(zhí)行核心程序fork完成的功能:為子進程分配一個進程描述符task_struct結(jié)構(gòu)為子進程分配一個唯一的進程標識符pid將父進程的地址空間的邏輯副本復(fù)制到子進程復(fù)制父進程相關(guān)聯(lián)的有關(guān)文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和用戶文件描述符表復(fù)制軟中斷信號有關(guān)的數(shù)據(jù)結(jié)構(gòu)設(shè)置子進程的狀態(tài)為TASK_RUNNING,加入就緒隊列,并啟動調(diào)度程序?qū)Ω高M程返回子進程的進程標識符,對子進程

12、返回零圖6.7 fork流程圖6.3.2 進程控制n執(zhí)行一個文件的調(diào)用系統(tǒng)調(diào)用exec()引出另一個程序,它用一個可執(zhí)行文件的副本覆蓋調(diào)用進程的正文段和數(shù)據(jù)段,并以調(diào)用進程提供的參數(shù)轉(zhuǎn)去執(zhí)行這個新的正文段程序系統(tǒng)調(diào)用exec()包含六種不同的調(diào)用格式,但完成同一工作,主要是參數(shù)處理方法不同。常用調(diào)用格式: execvp( filename, argp); 或 excelp( filename,arg0,arg1,(char *)0);例如,用excelp調(diào)用實現(xiàn)一個shell的基本處理過程n用戶輸入命令后,按以下步驟執(zhí)行用戶命令:用fork,創(chuàng)建子進程用exec,啟動命令程序用wait,父進程

13、和子進程同步圖6.8 shell 執(zhí)行過程用C語言實現(xiàn)的程序shell程序的實現(xiàn)6.3.2 進程控制n進程的終止系統(tǒng)調(diào)用exit(rv):自我終止當前進程,使其進入ZOMBIE僵死狀態(tài),等待父進程進行善后處理exit調(diào)用將導(dǎo)致釋放除task_struct結(jié)構(gòu)之外的所有資源,并清除進程上下文父進程收到子進程的信息rv和有關(guān)子進程的時間信息后,將釋放子進程的task_struct結(jié)構(gòu),并將有關(guān)的時間信息加到自己的task_struct結(jié)構(gòu)的有關(guān)項中6.4 Linux進程調(diào)度n調(diào)度原理n調(diào)度的時機n調(diào)度標識的設(shè)置n調(diào)度策略與優(yōu)先數(shù)的計算n調(diào)度的實現(xiàn)6.4 Linux進程調(diào)度nLinux系統(tǒng)的進程調(diào)度

14、由核心的調(diào)度過程schedule()實現(xiàn)n調(diào)度原理Linux系統(tǒng)對實時進程和普通進程采用不同的調(diào)度算法普通進程:基于時間片的動態(tài)優(yōu)先數(shù)調(diào)度法6.4 Linux進程調(diào)度n調(diào)度時機在Linux系統(tǒng)中,為了減少操作系統(tǒng)設(shè)計的復(fù)雜性和提高系統(tǒng)執(zhí)行效率,只在核心的幾個預(yù)定的位置進行調(diào)度n當進程狀態(tài)發(fā)生變化,自動放棄處理機時,主動轉(zhuǎn)入調(diào)度過程進行調(diào)度。例如,調(diào)用sleep()或wait()或exit()放棄處理機n當處理機從核心態(tài)向用戶態(tài)轉(zhuǎn)換時,系統(tǒng)設(shè)置了高優(yōu)先級就緒進程的強迫調(diào)度標志need_resched時,則發(fā)生調(diào)度6.4 Linux進程調(diào)度n調(diào)度標識的設(shè)置Linux只使用一個調(diào)度標志need_re

15、sched,該標志保存在進程描述符中調(diào)度標志need_resched在以下兩種情況被設(shè)置為1n當處于運行態(tài)的進程的時間片耗盡時n當進程被喚醒,而它的優(yōu)先級比正在運行的當前進程的優(yōu)先級高時6.4 Linux進程調(diào)度n調(diào)度策略與優(yōu)先數(shù)的計算Linux將進程分為普通進程和實時進程,實時進程的調(diào)度優(yōu)先級比普通進程高, Linux總是優(yōu)先調(diào)度實時進程Linux使用三種調(diào)度策略n動態(tài)優(yōu)先數(shù)調(diào)度SCHED_OTHER:用于普通進程n先來先服務(wù)調(diào)度SCHED_FIFO:用于實時進程n輪轉(zhuǎn)法調(diào)度SCHED_RR:用于實時進程6.4 Linux進程調(diào)度n調(diào)度策略與優(yōu)先數(shù)的計算進程可以通過scehed_setsch

16、eduler( )系統(tǒng)調(diào)用選擇適合自己的調(diào)度策略。如果選擇了實時調(diào)度,則該進程就轉(zhuǎn)變?yōu)橐粋€實施進程進程的調(diào)度策略保存在進程描述符中,并被子進程所繼承,因此實時進程的子進程仍然是一個實時進程6.4 Linux進程調(diào)度n調(diào)度的實現(xiàn)進程調(diào)度由scehedule( )過程實現(xiàn),執(zhí)行過程n進程選擇:按照調(diào)度策略來找到合適的進程n進程切換:主要完成進程的上下文切換,其中用戶進程的地址空間切換由switch_mm()完成,進程的堆棧切換過程由switch_to()實現(xiàn)6.5 進程通信nLinux的進程通信分三部分低級通信管道通信進程間的通信IPCnLinux同時支持網(wǎng)絡(luò)通信協(xié)議TCP/IP6.5.1 Lin

17、ux的低級通信nLinux低級通信主要用來傳遞進程間的控制信號。主要方式:軟中斷信號機制:通知對方發(fā)生了異步事件n系統(tǒng)調(diào)用kill(pid,sig):向進程pid發(fā)送軟中斷信號sign系統(tǒng)調(diào)用signal(sig,func):收到信號sig后,執(zhí)行預(yù)先預(yù)定的動作func文件鎖庫函數(shù)lockf:實現(xiàn)互斥實現(xiàn)同步的系統(tǒng)調(diào)用nwait():用于父子進程之間的同步nsleep(n):當前進程睡眠秒后自動喚醒自己軟中斷信號nLinux有30個軟中斷信號和31個實時軟中斷信號n軟中斷信號的作用見圖6.10n實時軟中斷信號:其編號從3263,它們沒有預(yù)先定義的含義,與普通軟中斷信號的區(qū)別在于:實時信號可以排

18、隊而不會發(fā)生丟失的現(xiàn)象圖6.10 Linux軟中斷信號軟中斷信號n軟中斷是對硬中斷的模擬發(fā)送軟中斷:向接收進程的task_struct結(jié)構(gòu)中的相應(yīng)項發(fā)送圖6.10中的一個信號接收進程:收到軟中斷信號后,將按照預(yù)先規(guī)定去執(zhí)行一個軟中斷處理程序。但是,軟中斷處理程序不像硬中斷處理程序,收到中斷信號后立即被啟動,它必須等待接收進程執(zhí)行時才能生效。另外,一個進程自己也可以向自己發(fā)送軟中斷信號,以便在描寫意外情況下,進程能轉(zhuǎn)入規(guī)定好的處理程序。文件鎖庫函數(shù)lockf實現(xiàn)互斥nlockf:通過fctnl系統(tǒng)調(diào)用實現(xiàn)格式:lockf(fd,function,size)fd是被鎖定文件標識function是控制值nF_LOCK:鎖定一個文件段nF_UNLOCK:不再鎖定nF_TLOCK:測試和鎖定一個文件段nF_TEST:測試待鎖定的程序段是否已被其他進程鎖定size表示自fd文件的當前位置開始處理size個相連字節(jié)6.5.2 進程間通信IPCn自學

溫馨提示

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

評論

0/150

提交評論