




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章進(jìn)程線程模型學(xué)習(xí)目標(biāo)<2
>掌握進(jìn)程的定義和組成要素掌握應(yīng)用進(jìn)程狀態(tài)轉(zhuǎn)換關(guān)系了解進(jìn)程地址空間掌握進(jìn)程創(chuàng)建、撤銷、阻塞和喚醒的機(jī)制理解進(jìn)程控制的原語與相關(guān)系統(tǒng)調(diào)用理解資源分配單位和調(diào)度執(zhí)行單位的區(qū)別掌握線程的組成要素理解線程和進(jìn)程的關(guān)系理解線程的不同實(shí)現(xiàn)方式了解PthreadAPI,并能運(yùn)用其開發(fā)多線程應(yīng)用了解協(xié)程的概念教師導(dǎo)讀<3
>進(jìn)程是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的獨(dú)立單位,本章內(nèi)容是理解如何創(chuàng)建并管理進(jìn)程的重要知識(shí)單元進(jìn)程的定義與構(gòu)成進(jìn)程的狀態(tài)模型與進(jìn)程隊(duì)列父子進(jìn)程的工作模式:fork/exec、wait線程的引入原因線程的組成及其與進(jìn)程的關(guān)系線程的三種實(shí)現(xiàn)方式及每種方式的優(yōu)缺點(diǎn)Pthread線程包的主要函數(shù)與使用方式3.1進(jìn)程基本概念3.2進(jìn)程控制3.3線程引入及基本概念3.4
線程的實(shí)現(xiàn)和實(shí)例目錄CONTENTSPART3.1進(jìn)程基本概念3.1.1進(jìn)程定義<6
>定義:進(jìn)程是具有一定獨(dú)立功能的程序在某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),
是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位進(jìn)程分為系統(tǒng)進(jìn)程和用戶進(jìn)程兩類系統(tǒng)進(jìn)程執(zhí)行操作系統(tǒng)程序用戶進(jìn)程運(yùn)行用戶程序系統(tǒng)進(jìn)程的優(yōu)先級(jí)通常高于一般用戶進(jìn)程的優(yōu)先級(jí)進(jìn)程定義3.1.1進(jìn)程定義<7
>1.
進(jìn)程和程序的聯(lián)系程序是構(gòu)成進(jìn)程的組成部分之一進(jìn)程是由程序、數(shù)據(jù)和進(jìn)程控制塊(PCB)三部分組成的一個(gè)進(jìn)程的運(yùn)行目標(biāo)是執(zhí)行它所對(duì)應(yīng)的程序2.
進(jìn)程和程序的區(qū)別程序是靜態(tài)的,而進(jìn)程是動(dòng)態(tài)的進(jìn)程是程序的一個(gè)執(zhí)行過程程序的存在是永久的,進(jìn)程存在生命周期,一個(gè)程序可以產(chǎn)生多個(gè)進(jìn)程進(jìn)程與程序的聯(lián)系和區(qū)別可再入程序<8
>一個(gè)能夠被多個(gè)用戶同時(shí)調(diào)用的程序稱作是“可再入”的程序可再入程序在執(zhí)行中不會(huì)修改自身的代碼一個(gè)程序不是任何條件下都可以產(chǎn)生多個(gè)進(jìn)程的一個(gè)能被多個(gè)用戶同時(shí)調(diào)用的程序,在執(zhí)行中自身不能改變3.1.1進(jìn)程定義進(jìn)程的特征<9
>進(jìn)程的兩個(gè)基本屬性:進(jìn)程是一個(gè)可擁有資源的獨(dú)立單位進(jìn)程同時(shí)又是一個(gè)可以獨(dú)立調(diào)度和分派的基本單位進(jìn)程具有以下特性:
并發(fā)性:一個(gè)進(jìn)程可以同其他進(jìn)程一道向前推進(jìn)2.動(dòng)態(tài)性:進(jìn)程有其生命周期,且進(jìn)程的狀態(tài)是不斷變化的3.獨(dú)立性:一個(gè)進(jìn)程是一個(gè)相對(duì)完整的資源分配單位4.交往性:一個(gè)進(jìn)程在運(yùn)行過程中可能會(huì)與其他進(jìn)程發(fā)生直接的或間接的相互作用5.
異步性:每個(gè)進(jìn)程按照各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)6.
結(jié)構(gòu)性:一個(gè)進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊三部分組成3.1.1進(jìn)程定義<10
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換
1.三狀態(tài)進(jìn)程模型運(yùn)行中的進(jìn)程可以處于以下三種狀態(tài)之一:運(yùn)行、就緒、等待三狀態(tài)模型狀態(tài)定義:(1)運(yùn)行狀態(tài)(Running)
進(jìn)程已獲得CPU,并且在CPU上執(zhí)行的狀態(tài)(2)就緒狀態(tài)(Ready)
進(jìn)程已經(jīng)具備運(yùn)行條件,但沒有獲得CPU的狀態(tài)(3)阻塞狀態(tài)(Blocked)
進(jìn)程因等待某種事件發(fā)生而暫時(shí)不能運(yùn)行的狀態(tài)<11
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換三狀態(tài)模型的狀態(tài)轉(zhuǎn)換條件:(1)就緒→運(yùn)行
進(jìn)程調(diào)度程序把處理機(jī)
分配給某個(gè)就緒進(jìn)程(2)運(yùn)行→就緒
規(guī)定的運(yùn)行時(shí)間片用完(3)運(yùn)行→阻塞
運(yùn)行狀態(tài)的進(jìn)程等待其他資源(4)阻塞→就緒
阻塞進(jìn)程在其被阻塞的原因獲得時(shí)解除阻塞<12
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換2.五狀態(tài)進(jìn)程模型五狀態(tài)模型狀態(tài)定義:(1)運(yùn)行狀態(tài)(Running):
進(jìn)程正在占用CPU資源(2)就緒狀態(tài)(Ready):
進(jìn)程等待分配CPU資源(3)阻塞狀態(tài)(Blocked):
進(jìn)程因等待I/O操作等條件而暫停運(yùn)行(4)創(chuàng)建狀態(tài)(New):
進(jìn)程正在創(chuàng)建過程中,還不能運(yùn)行(5)結(jié)束狀態(tài)(Exit):
進(jìn)程已結(jié)束運(yùn)行,
回收除進(jìn)程控制塊之外的其他資源,
讓其他進(jìn)程從進(jìn)程控制塊中收集有關(guān)信息<13
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換五狀態(tài)狀態(tài)轉(zhuǎn)換條件:(1)創(chuàng)建新進(jìn)程:進(jìn)入創(chuàng)建狀態(tài)(2)提交(Admit):完成一個(gè)新進(jìn)程的創(chuàng)建過程,進(jìn)入就緒狀態(tài)(3)調(diào)度運(yùn)行(Dispatch):進(jìn)入運(yùn)行狀態(tài)(4)釋放(Release):進(jìn)程終止運(yùn)行,進(jìn)入退出狀態(tài)(5)超時(shí)(Timeout):用完時(shí)間片,進(jìn)程暫停運(yùn)行,、從運(yùn)行狀態(tài)進(jìn)入就緒狀態(tài)(6)事件等待(EventWait):進(jìn)程要求的事件未出現(xiàn)而進(jìn)入阻塞狀態(tài)(7)事件出現(xiàn)(EventOccurs):進(jìn)程等待的事件出現(xiàn),進(jìn)程從阻塞狀態(tài)進(jìn)入就緒狀態(tài)<14
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換3.七狀態(tài)進(jìn)程模型七狀態(tài)模型引入原因:五狀態(tài)進(jìn)程模型沒有區(qū)分進(jìn)程地址空間位于內(nèi)存還是外存低優(yōu)先級(jí)進(jìn)程對(duì)換至外存,這種做法可得到的好處:(1)提高處理機(jī)效率(2)可為運(yùn)行進(jìn)程提供足夠內(nèi)存(3)有利于調(diào)試<15
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換七狀態(tài)模型狀態(tài)定義:與五狀態(tài)進(jìn)程模型相比,增加了就緒掛起和阻塞掛起兩個(gè)狀態(tài)(1)阻塞掛起狀態(tài)(Blocked,suspend):
進(jìn)程在外存并等待某事件的出現(xiàn)(2)就緒掛起狀態(tài)(Ready,suspend):
進(jìn)程在外存,但只要進(jìn)入內(nèi)存,即可運(yùn)行3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換七狀態(tài)模型狀態(tài)轉(zhuǎn)換條件:(1)掛起(Suspend):
進(jìn)程從內(nèi)存轉(zhuǎn)到外存
阻塞到阻塞掛起
就緒到就緒掛起
運(yùn)行到就緒掛起(2)激活(Activate):
進(jìn)程從外存轉(zhuǎn)到內(nèi)存
就緒掛起到就緒
阻塞掛起到阻塞<16
>3.1.2進(jìn)程狀態(tài)及狀態(tài)轉(zhuǎn)換<17
>七狀態(tài)模型狀態(tài)轉(zhuǎn)換條件:(3)事件出現(xiàn)(EventOccurs):
等待的事件出現(xiàn)
阻塞到就緒
阻塞掛起到就緒掛起(4)提交(Admit):
完成創(chuàng)建過程
進(jìn)入就緒狀態(tài)或就緒掛起狀態(tài)3.1.3進(jìn)程控制塊進(jìn)程控制塊(PCB:ProcessControlBlock):描述進(jìn)程的基本情況以及進(jìn)程的運(yùn)行變化過程PCB是進(jìn)程存在的惟一標(biāo)志當(dāng)系統(tǒng)創(chuàng)建一個(gè)進(jìn)程時(shí),為進(jìn)程設(shè)置一個(gè)PCB,再利用PCB對(duì)進(jìn)程進(jìn)行控制和管理撤消進(jìn)程時(shí),系統(tǒng)收回它的PCB,進(jìn)程也隨之消亡<18
>3.1.3進(jìn)程控制塊PCB的內(nèi)容PCB的內(nèi)容可以分成調(diào)度信息和現(xiàn)場(chǎng)信息兩大部分調(diào)度信息:供進(jìn)程調(diào)度時(shí)使用,描述進(jìn)程當(dāng)前所處的狀況進(jìn)程名、進(jìn)程號(hào)、存儲(chǔ)信息、優(yōu)先級(jí)、當(dāng)前狀態(tài)、資源清單、“家族”關(guān)系、消息隊(duì)列指針、進(jìn)程隊(duì)列指針和當(dāng)前打開文件等現(xiàn)場(chǎng)信息:刻畫進(jìn)程的運(yùn)行情況程序狀態(tài)字、時(shí)鐘、界地址寄存器等一旦中斷進(jìn)程的運(yùn)行,必須把中斷時(shí)刻的內(nèi)容記入進(jìn)程控制塊的現(xiàn)場(chǎng)信息<19
>3.1.3進(jìn)程控制塊
進(jìn)程的組成進(jìn)程由程序、數(shù)據(jù)和進(jìn)程控制塊三部分組成PCB存有進(jìn)程的地址信息程序描述了進(jìn)程要實(shí)現(xiàn)的功能數(shù)據(jù)是程序操作的對(duì)象<20
>3.1.3進(jìn)程控制塊3.
PCB組織(1)線性方式:
所有PCB不分狀態(tài)組織在一個(gè)線性表(稱PCB表)中優(yōu)點(diǎn):簡單,且不需要額外的開銷缺點(diǎn):需要掃描整個(gè)PCB表,
才能找到需要的PCB(2)索引方式:相同狀態(tài)的進(jìn)程,分別設(shè)置PCB索引表<21
>3.1.3進(jìn)程控制塊(3)鏈接方式:對(duì)于具有相同狀態(tài)進(jìn)程的PCB,通過PCB中的鏈接字構(gòu)成一個(gè)隊(duì)列鏈接字指出本隊(duì)列下一PCB在PCB表中的編號(hào)(或地址)編號(hào)為0表示隊(duì)尾隊(duì)首由內(nèi)存固定單元中相應(yīng)的隊(duì)列指針指示<22
>3.1.3進(jìn)程控制塊
4.進(jìn)程的隊(duì)列(1)就緒隊(duì)列所有就緒狀態(tài)的進(jìn)程排在一個(gè)就緒隊(duì)列中(2)等待隊(duì)列對(duì)每一種等待事件組織一個(gè)隊(duì)列(3)運(yùn)行隊(duì)列在單CPU系統(tǒng)中,整個(gè)系統(tǒng)有一個(gè)運(yùn)行隊(duì)列<23
>3.1.3進(jìn)程控制塊5.
進(jìn)程隊(duì)列的組成單向鏈接:
同一隊(duì)列中的進(jìn)程,通過進(jìn)程控制塊中的隊(duì)列指針聯(lián)系起來
前一進(jìn)程的進(jìn)程控制塊中的指針值為它的下一個(gè)進(jìn)程的進(jìn)程控制塊的地址
隊(duì)列中最后一個(gè)進(jìn)程的進(jìn)程控制塊中的指針值置為“0”雙向鏈接:
設(shè)置兩個(gè)指針,前向指針和后向指針
分別指出它的前一個(gè)或后一個(gè)進(jìn)程的進(jìn)程控制塊地址
系統(tǒng)為每個(gè)隊(duì)列設(shè)置一個(gè)隊(duì)首指針,指出該隊(duì)列的第一個(gè)和最后一個(gè)進(jìn)程
的進(jìn)程控制塊地址,以便進(jìn)行雙向搜索<24
>背景-2:北京大學(xué)圖書館PART3.2進(jìn)程控制<26
>3.2.1進(jìn)程控制進(jìn)程控制:對(duì)進(jìn)程在整個(gè)生命周期中各種狀態(tài)之間的轉(zhuǎn)換進(jìn)行有效的控制通過進(jìn)程控制原語來實(shí)現(xiàn)原語:
若干條指令所組成的一個(gè)指令序列,用來實(shí)現(xiàn)某個(gè)特定的操作功能
連續(xù)的,具有不可分割性,在執(zhí)行時(shí)也不可間斷
必須在管態(tài)下執(zhí)行,并且常駐內(nèi)存用于進(jìn)程控制的原語:創(chuàng)建進(jìn)程、撤消進(jìn)程、掛起進(jìn)程、激活進(jìn)程、阻塞進(jìn)程、喚醒進(jìn)程以及改變進(jìn)程優(yōu)先級(jí)等<27
>3.2.1進(jìn)程控制創(chuàng)建原語創(chuàng)建一個(gè)新的進(jìn)程,前者稱為父進(jìn)程,后者稱為子進(jìn)程建立進(jìn)程控制塊PCB2.
撤消原語撤消進(jìn)程的PCB撤消屬于該進(jìn)程的一切“子孫進(jìn)程”,釋放被撤消進(jìn)程所占用的全部資源
3.
阻塞原語進(jìn)程從運(yùn)行狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)中斷CPU的執(zhí)行,把CPU的當(dāng)前狀態(tài)保存在PCB的現(xiàn)場(chǎng)信息中當(dāng)前狀態(tài)置為等待狀態(tài),并把它插入到該事件的等待隊(duì)列中去
4.
喚醒原語等待狀態(tài)轉(zhuǎn)換為就緒狀態(tài)從等待隊(duì)列中撤出并插入到就緒隊(duì)列中排隊(duì),等待調(diào)度執(zhí)行<28
>3.2.2Linux操作系統(tǒng)有關(guān)進(jìn)程控制的系統(tǒng)調(diào)用在Linux操作系統(tǒng)中,常用的有關(guān)進(jìn)程控制的系統(tǒng)調(diào)用有:fork,exec,wait,exit,getpid,sleep和nice等下表所示為這些系統(tǒng)調(diào)用的功能說明系統(tǒng)調(diào)用功
能fork創(chuàng)建一個(gè)子進(jìn)程getpid返回當(dāng)前進(jìn)程的PIDexec更換進(jìn)程映像,即根據(jù)指定的文件名找到可執(zhí)行文件,并用它來取代調(diào)用進(jìn)程的內(nèi)容exit終止調(diào)用的程序(用于程序運(yùn)行出錯(cuò))wait等待任何要僵死的子進(jìn)程sleep使進(jìn)程掛起指定的時(shí)間nice改變進(jìn)程的優(yōu)先級(jí)<29
>3.2.2Linux操作系統(tǒng)有關(guān)進(jìn)程控制的系統(tǒng)調(diào)用【代碼示例-fork與exec】Linux系統(tǒng)中,父進(jìn)程創(chuàng)建子進(jìn)程,以及各自分開活動(dòng)的情況#include<unistd.h>#include<sys/types.h>#include<stdio.h>#include<sys/wait.h>#include<stdlib.h>intmain(intargc,char*argv[]){intpid;pid=fork();/*創(chuàng)建一個(gè)子進(jìn)程*/if(pid<0){/*出現(xiàn)錯(cuò)誤。進(jìn)程ID號(hào)不可能小于0*/fprintf(stderr,"ForkFailed");/*輸出出錯(cuò)消息——ForkFailed*/exit(-1);/*程序終止,返回碼-1*/}<30
>3.2.2Linux操作系統(tǒng)有關(guān)進(jìn)程控制的系統(tǒng)調(diào)用elseif(pid==0){/*下面是子進(jìn)程執(zhí)行*/execlp("/bin/ls","ls",NULL);/*執(zhí)行目錄/bin下面的ls命令*/}else{/*下面是父進(jìn)程執(zhí)行*/wait(NULL);/*父進(jìn)程等待子進(jìn)程完成*/printf("ChildComplete");/*輸出子進(jìn)程完成的信息*/exit(0);/*終止*/}}<31
>3.2.2Linux操作系統(tǒng)有關(guān)進(jìn)程控制的系統(tǒng)調(diào)用【代碼示例-進(jìn)程相關(guān)操作】利用fork()創(chuàng)建子進(jìn)程,利用getpid()和getppid()分別獲得本進(jìn)程的PID和父進(jìn)程的PID,使用sleep()將相關(guān)進(jìn)程掛起幾秒/*proc1.c演示有關(guān)進(jìn)程操作*/#include<unistd.h>#include<sys/types.h>#include<stdio.h>#include<errno.h>#include<stdlib.h>#include<string.h>
intmain(intargc,char**argv){pid_tpid,old_ppid,new_ppid;pid_tchild,parent;<32
>3.2.2Linux操作系統(tǒng)有關(guān)進(jìn)程控制的系統(tǒng)調(diào)用parent=getpid(); if((child=fork())<0){fprintf(stderr,"%s:forkofchildfailed:%s\n",argv[0],strerror(errno));exit(1);} elseif(child==0){ /*此時(shí)子進(jìn)程被調(diào)度運(yùn)行*/old_ppid=getppid();sleep(2);new_ppid=getppid();}else{/*父進(jìn)程運(yùn)行*/sleep(1);exit(0);}/*下面僅子進(jìn)程運(yùn)行*/printf("Originalparent:%d\n",parent);printf("Child:%d\n",getpid());printf("Child'soldppid:%d\n",old_ppid);printf("Child'snewppid:%d\n",new_ppid);
exit(0);}程序運(yùn)行的結(jié)果如下:$./proc1Originalparent:2009Child:2010Child'soldppid:2009Child'snewppid:1需要注意的是,進(jìn)程是并發(fā)執(zhí)行的;當(dāng)子進(jìn)程被成功調(diào)度后,調(diào)度程序的返回值是0。如果父進(jìn)程先終止,則其子進(jìn)程的父進(jìn)程就被系統(tǒng)指定為init進(jìn)程(其PID為1)背景-3:西門華表線程引入及基本概念PART3.3<34
>3.3.1線程的引入為何需要線程?進(jìn)程活動(dòng)存在時(shí)間和空間的資源開銷,數(shù)目不宜太多,切換頻率不宜過高使多個(gè)程序更好地并發(fā)執(zhí)行,盡量減少系統(tǒng)的開銷分離調(diào)度的基本單位和獨(dú)立分配資源的單位調(diào)度和分派的基本單位不負(fù)責(zé)分配資源擁有資源的基本單位,不頻繁地切換<35
>3.3.1線程的引入什么是線程?線程是進(jìn)程中的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位只擁有少量在運(yùn)行中必不可少的資源同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源線程有就緒、等待和運(yùn)行三種基本狀態(tài)有的系統(tǒng)中線程還有終止?fàn)顟B(tài)等進(jìn)程執(zhí)行程序,就如同工人完成工作一個(gè)進(jìn)程內(nèi)的多個(gè)線程同時(shí)運(yùn)行,就如同多個(gè)工人共同完成一份工作<36
>3.3.1線程的引入2.線程的屬性(1)惟一的標(biāo)識(shí)符和一張線程描述表
線程描述表記錄了線程執(zhí)行的寄存器以及棧等現(xiàn)場(chǎng)狀態(tài)(2)不同的線程可以執(zhí)行相同的程序(3)同一個(gè)進(jìn)程中的各個(gè)線程共享該進(jìn)程的內(nèi)存地址空間(4)線程是處理器的獨(dú)立調(diào)度單位,多個(gè)線程是可以并發(fā)執(zhí)行的(5)線程在生命周期內(nèi)會(huì)經(jīng)歷等待狀態(tài)、就緒態(tài)和運(yùn)行態(tài)等各種狀態(tài)變化每個(gè)線程單獨(dú)占有CPU資源,只有在多核CPU上,多線程才可能并行執(zhí)行<37
>3.3.1線程的引入3.引入線程的好處(1)創(chuàng)建一個(gè)新線程花費(fèi)時(shí)間少
創(chuàng)建線程的速度比創(chuàng)建進(jìn)程的速度快,且系統(tǒng)的開銷也少(2)線程之間的切換花費(fèi)時(shí)間少(3)同一個(gè)進(jìn)程內(nèi)的線程共享內(nèi)存和文件,通信更簡便,信息傳送速度也快(4)線程能獨(dú)立執(zhí)行,充分利用和發(fā)揮處理器與外部設(shè)備并行工作能力<38
>3.3.2
線程的組成thread結(jié)構(gòu),即線程控制塊,由以下四個(gè)基本部分組成:①一個(gè)唯一的線程標(biāo)識(shí)符②描述處理器工作情況的一組寄存器的內(nèi)容
如程序計(jì)數(shù)器、狀態(tài)寄存器、通用寄存器等③兩個(gè)棧指針
一個(gè)指向核心棧;另一個(gè)指向用戶棧④一個(gè)私有存儲(chǔ)區(qū)
用來存放現(xiàn)場(chǎng)保護(hù)信息和其他與該線程相關(guān)的統(tǒng)計(jì)信息等<39
>3.3.2
線程的組成一個(gè)進(jìn)程可以包含一個(gè)線程或多個(gè)線程當(dāng)一個(gè)進(jìn)程包含多個(gè)線程時(shí),這些線程除各自私有少量資源以外,共享所屬進(jìn)程的全部資源<40
>3.3.3
線程與進(jìn)程的關(guān)系線程又稱為輕量級(jí)進(jìn)程或者進(jìn)程元傳統(tǒng)的進(jìn)程稱為重量級(jí)進(jìn)程通常一個(gè)進(jìn)程都有若干個(gè)線程調(diào)度傳統(tǒng)的操作系統(tǒng)中擁有資源的基本單位和獨(dú)立調(diào)度、分派的基本單位都是進(jìn)程引入線程的操作系統(tǒng)中線程作為調(diào)度和分派的基本單位,進(jìn)程作為資源擁有的基本單位<41
>3.3.3
線程與進(jìn)程的關(guān)系2.并發(fā)性引入線程的操作系統(tǒng)中不僅進(jìn)程之間可以并發(fā)執(zhí)行一個(gè)進(jìn)程中的多個(gè)線程之間也可以并發(fā)執(zhí)行擁有資源不論是傳統(tǒng)的操作系統(tǒng),還有線程的操作系統(tǒng)進(jìn)程都是擁有資源的一個(gè)獨(dú)立單位<42
>3.3.3
線程與進(jìn)程的關(guān)系4.
系統(tǒng)開銷在創(chuàng)建或撤消進(jìn)程時(shí),操作系統(tǒng)所付出的開銷將顯著地大于在創(chuàng)建或撤消線程時(shí)的開銷進(jìn)程切換的開銷遠(yuǎn)大于線程切換的開銷同一進(jìn)程中的多個(gè)線程具有相同的地址空間,同步和通信的實(shí)現(xiàn)比較容易<43
>3.3.3
線程與進(jìn)程的關(guān)系比較概念線程進(jìn)程基本功能調(diào)度的基本單位資源分配的基本單位系統(tǒng)開銷切換開銷小切換開銷大資源分配線程共享一個(gè)進(jìn)程下的資源進(jìn)程獨(dú)占資源通信方式共享內(nèi)存地址空間使用進(jìn)程通信的系統(tǒng)調(diào)用并發(fā)性更強(qiáng)更弱背景-4:未名湖PART3.4線程的實(shí)現(xiàn)和實(shí)例<45
>3.4.1
線程的實(shí)現(xiàn)方式1.用戶級(jí)線程、核心級(jí)線程和混合方式線程已在許多系統(tǒng)中實(shí)現(xiàn),但實(shí)現(xiàn)的方式并不完全相同用戶級(jí)線程(User-LevelThreads),不依賴于內(nèi)核例如:數(shù)據(jù)庫系統(tǒng)中的線程核心級(jí)線程(Kernel-SupportedThreads),依賴于內(nèi)核混合方式實(shí)現(xiàn)線程,即同時(shí)實(shí)現(xiàn)了以上兩種類型的線程<46
>3.4.1
線程的實(shí)現(xiàn)方式(1)用戶級(jí)線程實(shí)現(xiàn)方式創(chuàng)建、撤消和切換都不利用系統(tǒng)調(diào)用管理線程的工作全部由應(yīng)用程序完成每個(gè)進(jìn)程都有一個(gè)私有的線程表核心空間中有一個(gè)進(jìn)程表,記載系統(tǒng)中各個(gè)進(jìn)程的情況POSIXPthreadsMachC-threadsSolaris2UI-threads<47
>3.4.1
線程的實(shí)現(xiàn)方式(1)用戶級(jí)線程優(yōu)缺點(diǎn)
優(yōu)點(diǎn):線程的切換速度快允許采用適合自己要求的不同調(diào)度算法可以運(yùn)行在任何操作系統(tǒng)上缺點(diǎn):當(dāng)一個(gè)線程執(zhí)行系統(tǒng)調(diào)用時(shí),在同一個(gè)進(jìn)程內(nèi)的所有線程都被阻塞多線程應(yīng)用程序不具有多處理器的優(yōu)點(diǎn)<48
>3.4.1
線程的實(shí)現(xiàn)方式(2)核心級(jí)線程實(shí)現(xiàn)方式創(chuàng)建、撤消和切換都由核心實(shí)現(xiàn)核心保留了一個(gè)線程控制塊,根據(jù)該控制塊感知線程的存在并對(duì)線程進(jìn)行控制線程表在核心空間中,記載系統(tǒng)中所有線程的情況核心空間中保存一個(gè)進(jìn)程表,記載系統(tǒng)所有進(jìn)程的信息核心進(jìn)行調(diào)度時(shí)以線程為基本單位<49
>3.4.1
線程的實(shí)現(xiàn)方式(2)核心級(jí)線程優(yōu)缺點(diǎn)優(yōu)點(diǎn):核心可以同時(shí)調(diào)度同一進(jìn)程中的多個(gè)線程,真正實(shí)現(xiàn)并行操作如果一個(gè)進(jìn)程的某個(gè)線程阻塞了,核心可以調(diào)度同一個(gè)進(jìn)程中的另一個(gè)線程核心線程本身也可以是多線程的缺點(diǎn):控制轉(zhuǎn)移開銷大應(yīng)用進(jìn)程無法影響線程的切換3.4.1
線程的實(shí)現(xiàn)方式(3)混合方式
用戶級(jí)線程和核心級(jí)線程兩種實(shí)現(xiàn)方式結(jié)合
同一個(gè)進(jìn)程內(nèi)的多個(gè)線程可在多個(gè)處理器上
并行運(yùn)行
阻塞式系統(tǒng)調(diào)用不必將整個(gè)進(jìn)程阻塞
線程創(chuàng)建在用戶空間完成
線程調(diào)度等在核心態(tài)完成<50
>3.4.1
線程的實(shí)現(xiàn)方式2.線程實(shí)現(xiàn)方式的比較(1)線程的調(diào)度與切換速度
用戶級(jí)線程的切換速度更加快(2)系統(tǒng)調(diào)用
用戶級(jí)線程調(diào)用一個(gè)系統(tǒng)調(diào)用時(shí),把系統(tǒng)調(diào)用看作是整個(gè)進(jìn)程的行為
內(nèi)核支持線程,則調(diào)度是以線程為單位(3)線程執(zhí)行時(shí)間
用戶級(jí)線程,調(diào)度是以進(jìn)程為單位進(jìn)行的
核心級(jí)線程,調(diào)度是以線程為單位進(jìn)行的<51
>3.4.2
Pthread線程包多線程應(yīng)用程序用一組用戶級(jí)程序庫來編寫,將所有線程映射到一個(gè)單獨(dú)的內(nèi)核級(jí)進(jìn)程中其中最著名的是:Pthread(POSIXthread)庫Pthread線程共有特性:
一個(gè)標(biāo)識(shí)符
一組寄存器(包括程序計(jì)數(shù)器)
一組存儲(chǔ)在結(jié)構(gòu)中的屬性,包括棧大小、調(diào)度參數(shù)以及其它線程需要的項(xiàng)目下表中列舉了幾個(gè)主要的Pthread函數(shù)調(diào)用線程調(diào)用描述pthread_create()創(chuàng)建一個(gè)新線程pthread_join()等待一個(gè)特定的線程退出pthread_exit()結(jié)束調(diào)用的線程pthread_yield()釋放CPU來運(yùn)行另外一個(gè)線程pthread_attr_init()創(chuàng)建并初始化一個(gè)線程pthread_attr_destroy()刪除一個(gè)線程的屬性結(jié)構(gòu)<52
>3.4.2
Pthread線程包【代碼示例-Pthread庫的簡單應(yīng)用】#inc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京城市職業(yè)學(xué)院《算法與數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西工程學(xué)院《視覺檢測(cè)技術(shù)及應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱廣廈學(xué)院《高中思想政治課程標(biāo)準(zhǔn)與教材研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 和田職業(yè)技術(shù)學(xué)院《軟件質(zhì)量保證與測(cè)試實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 煙臺(tái)南山學(xué)院《建筑設(shè)備施工經(jīng)濟(jì)與組織》2023-2024學(xué)年第二學(xué)期期末試卷
- 安順學(xué)院《有毒有害物質(zhì)檢測(cè)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣州中醫(yī)藥大學(xué)《金屬成型工藝及設(shè)備》2023-2024學(xué)年第二學(xué)期期末試卷
- 甘肅財(cái)貿(mào)職業(yè)學(xué)院《電磁場(chǎng)與微波技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄂爾多斯職業(yè)學(xué)院《證據(jù)法律實(shí)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 哈爾濱應(yīng)用職業(yè)技術(shù)學(xué)院《農(nóng)村土地調(diào)查》2023-2024學(xué)年第二學(xué)期期末試卷
- 中職電子商務(wù)班級(jí)建設(shè)方案
- 高考日語-必考11個(gè)語法
- 杏芎氯化鈉注射液-藥品臨床應(yīng)用解讀
- 【校本作業(yè)】六年級(jí)下冊(cè)語文校本作業(yè)與單元練習(xí)(附參考答案)
- 安全生產(chǎn)與質(zhì)量管理體系的關(guān)系
- (完整文本版)體檢報(bào)告單模版
- 學(xué)生實(shí)習(xí)自主申請(qǐng)表
- 痛覺及其調(diào)制
- 七年級(jí)上冊(cè)語文人教版全冊(cè)文言文全文詳解及翻譯
- 北師大小學(xué)數(shù)學(xué)小升初《簡便運(yùn)算》復(fù)習(xí)課件
- 園藝植物種質(zhì)資源圖文
評(píng)論
0/150
提交評(píng)論