欢迎来到天天文库
浏览记录
ID:58716573
大小:953.50 KB
页数:48页
时间:2020-10-04
《第02讲_进程与线程ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
第二章清华大学软件学院 第二章进程管理进程(Process)线程(Thread)进程间通信经典的IPC问题进程间高级通信进程调度 2.1进程(Process)2.1.1Whyprocesses?为了提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术(multi-programming),使多个程序同时在系统中存在并运行。 Whyprocesses?(Cont.)在多道程序系统中,各个程序之间是并发执行的,共享系统资源。CPU需要在各个运行的程序之间来回地切换,这样的话,要想描述这些多道的并发活动过程就变得很困难。为此,操作系统设计者提出了进程的概念。 2.1.2什么是进程?Aprocess=aprograminexecution一个进程应该包括:程序的代码;程序的数据;PC中的值,用来指示下一条将运行的指令;一组通用的寄存器的当前值,堆、栈;一组系统资源(如打开的文件)总之,进程包含了正在运行的一个程序的所有状态信息。 main(){…..}A(){…..}PROCESSAprogramisCstatementsorcommands静态的;Aprocessisprogram+runningcontext动态的.main(){…..}A(){…..}PROGRAMheapStackAMainRegisters,PCProcess≠Program 有一个计算机科学家,有一天女儿过生日,想亲手给女儿做一个生日蛋糕。所以他就找了一本有关做蛋糕的食谱,买了一些原料,面粉、鸡蛋、糖、香料等,然后边看边学边做。食谱=程序;科学家=CPU;原料=数据;进程=做蛋糕;这时小儿子哭着跑进来,说手被蜜蜂蛰了。教授只好把蛋糕先放在一边。他在食谱上做了个标记,把状态信息记录了起来。然后又去找了一本医疗手册,查到了相关的内容,按照上面的指令一步步地执行。当伤口处理完之后,又回到厨房继续做蛋糕。CPU从一个进程(做蛋糕)切换到另一个进程(医疗救护)。 2.1.3进程的特性动态性:程序的运行状态在变,PC、寄存器、堆和栈中变量的生成和赋值等;独立性:是一个独立的实体,是计算机系统资源的使用单位。每个进程都有“自己”的PC和内部状态,运行时独立于其他的进程(逻辑PC和物理PC);并发性:从宏观上看各进程是同时独立运行的 四个进程在并发地运行(本图摘自AndrewS.Tanenbaum:“ModernOperatingSystems”) 2.1.4进程的创建引起进程创建的四个主要事件:系统初始化时;在一个正在运行的进程当中,执行了创建进程的系统调用;用户请求创建一个新进程;初始化一个批处理作业。 从技术上来说,只有一种创建进程的方法,即在一个已经存在的进程(用户进程或系统进程)当中,通过系统调用来创建一个新的进程。Unix:fork函数;Windows:CreateProcess函数; 2.1.5进程的终止在以下四种情形下,进程终止:正常退出(自愿的);错误退出(自愿的);致命错误(强制性的);被其他进程所杀(强制性的),Unix:kill,Windows:TerminateProcess。 2.1.6进程的状态进程的三种基本状态:进程在生命结束前处于且仅处于三种基本状态之一不同系统设置的进程状态数目不同。运行状态(Running):进程占有CPU,并在CPU上运行。处于此状态的进程数目小于等于CPU的数目。就绪状态(Ready):进程已经具备运行条件,但由于CPU忙暂时不能运行,只要分得CPU即可执行;阻塞状态(Blocked):指进程因等待某种事件的发生而暂时不能运行的状态(如I/O操作或进程同步),此时,即使CPU空闲,该进程也不能运行。 (本图摘自AndrewS.Tanenbaum:“ModernOperatingSystems”,下同)进程的状态及其转换 进程转换运行-->阻塞等待I/O的结果等待某一进程提供输入运行-->就绪运行进程用完了时间片运行进程被中断,因为一高优先级进程处于就绪状态就绪-->运行调度程序选择一个新的进程运行阻塞-->就绪当所等待的事件发生时 以进程为基本结构的OS:最底层为CPU调度程序(包括中断处理等);上面一层为一组各式各样的进程;用进程的观点来看待OS:用户进程、磁盘管理进程、终端进程…… 问题:如果你要设计一个OS,怎么样来实现其中的进程机制?包括进程的创建、进程的管理、进程的终止、进程的状态转换等等。思考2分钟的时间! 程序=算法+数据结构描述进程的数据结构:进程控制块(ProcessControlBlock,PCB)。系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息。 PCB中的主要内容 进程的创建:为该进程生成一个PCB;进程的终止:回收它的PCB;进程的组织管理:通过对PCB的组织管理来实现;系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志。进程的状态转换:……?PCB存放在哪? (本图摘自Silberschatz,GalvinandGagne:“OperatingSystemConcepts”)两个进程的状态转换运行|就绪运行|阻塞阻塞|就绪就绪|运行 2.1.7状态队列由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态;不同的状态分别用不同的队列来表示(运行队列、就绪队列、各种类型的阻塞队列);每个进程的PCB都根据它的状态加入到相应的队列当中,当一个进程的状态发生变化时,它的PCB从一个状态队列中脱离出来,加入到另外一个队列。 就绪队列和各种I/O设备队列(本图摘自Silberschatz,GalvinandGagne:“OperatingSystemConcepts”) 2.2线程(Thread)自从60年代提出进程概念以来,在操作系统中一直都是以进程作为独立运行的基本单位,直到80年代中期,人们又提出了更小的能独立运行的基本单位线程。 2.2.1Why线程?【案例】编写一个MP3播放软件。核心功能模块有三个:(1)从MP3音频文件当中读取数据;(2)对数据进行解压缩;(3)把解压缩后的音频数据播放出来。 main(){while(TRUE){Read();Decompress();Play();}}Read(){…}Decompress(){…}Play(){…}单进程的实现方法问题:播放出来的声音能否连贯?各个函数之间不是并发执行,影响资源的使用效率;I/OCPU 程序1main(){while(TRUE){Read();}}Read(){…}多进程的实现方法问题:进程之间如何通信,共享数据?另外,维护进程的系统开销较大:创建进程时,分配资源、建立PCB;撤消进程时,回收资源、撤消PCB;进程切换时,保存当前进程的状态信息。程序3main(){while(TRUE){Play();}}Play(){…}程序2main(){while(TRUE){Decompress();}}Decompress(){…} 怎么来解决这些问题?需要提出一种新的实体,满足以下特性:(1)实体之间可以并发地执行;(2)实体之间共享相同的地址空间;这种实体就是:线程(Thread) 2.2.2什么是线程?Thread:Asequentialexecutionstreamwithinaprocess;Athreadofexecution;进程当中的一条执行流程。 从两个方面来理解进程:从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段、数据段)、打开的文件等各种资源;从运行的角度:代码在这个资源平台上的一条执行流程(线程)。资源平台线程 进程=线程+资源平台优点:一个进程中可以同时存在多个线程;各个线程之间可以并发地执行;各个线程之间可以共享地址空间。 例子:MS-DOS不同的操作系统对线程的支持例子:Unix例子:WindowsNT 线程所需的资源addr1,r2,r3subr2,r3,r10str2,0(r1)…线程独享线程共享 线程所需的资源(续)(本图摘自Silberschatz,GalvinandGagne:“OperatingSystemConcepts”) 线程与进程的比较进程是资源分配单位,线程是CPU调度单位;进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系;线程能减少并发执行的时间和空间开销:线程的创建时间比进程短;线程的终止时间比进程短;同一进程内的线程切换时间比进程短;由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信;线程=轻量级进程(lightweightprocess) 2.2.3线程的实现主要有两种线程的实现方式:用户线程:在用户空间实现;内核线程:在内核中实现; 用户线程(本图摘自AndrewS.Tanenbaum:“ModernOperatingSystems”,下同)PCBTCB(ThreadControlBlock) 用户线程(续)由于用户线程的维护由相应进程来完成(通过线程库函数),不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;每个进程都需要它自己私有的线程控制块(TCB)列表,用来跟踪记录它的各个线程的状态信息(PC、栈指针、寄存器),TCB由线程库函数来维护;用户线程的切换也是由线程库函数来完成,无需用户态/核心态切换,所以速度特别快;允许每个进程拥有自定义的线程调度算法。在用户空间实现的线程机制,它不依赖于操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包括进程的创建、终止、同步和调度等。 阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞,则整个进程在等待;当一个线程开始运行后,除非它主动地交出CPU的使用权,否则它所在的进程当中的其他线程将无法运行;时间片分配给进程,多线程则每个线程就慢。用户线程缺点: 内核线程用户空间内核空间PCBTCB 内核线程(续)在支持内核线程的操作系统中,由内核来维护进程和线程的上下文信息(PCB和TCB);线程的创建、终止和切换都是通过系统调用的方式来进行,需要从用户态转换到系统态,由内核来完成,因此系统开销较大;在一个进程当中,如果某个线程发起系统调用而被阻塞,并不会影响其他线程的运行;时间片分配给线程,多线程的进程获得更多CPU时间;WindowsNT和Windows2000/XP支持内核线程。是指在操作系统的内核当中实现的一种线程机制,由操作系统的内核来完成线程的创建、终止和管理。 2.2.4一个例子在一个实际的工程项目中,软件平台采用的是某一种实时的嵌入式操作系统。该项目有两个.c源文件,如下图所示。这两个.c文件实现的功能是:在文件1.c中,任务A循环地从SOCKET中接收数据;任务B每隔100ms向SOCKET发送响应消息,而定时功能是由文件2.c中的任务C来实现的。任务C和任务B之间通过同步信号量进行任务间的同步。问题:分析该操作系统当中的“任务”的概念,它相当于是我们通常所说的进程还是线程?为什么? intg_nSockId;//socket标识,全局变量semIdg_synSemId;//信号量标识,全局变量voidtestInit(void)//初始化函数{创建SOCKET,建立连接;//g_nSockId被赋值/*taskSpawn函数的功能:创建一个任务,它的参数为:“任务名”,“优先级”,“栈大小”,“函数名”,“函数的输入参数”);*//*创建任务A*/taskSpawn(“tTestTskA”,50,2000,testTskA,0,……..);/*创建任务B*/taskSpawn(“tTestTskB”,50,2000,testTskB,0,……..);}源文件1.c voidtestTskA(void){char*pChRxBuf;pChRxBuf=malloc(100);while(1){recv(g_nSockId,pChRxBuf,…..);……}}voidtestTskB(void){charpChTxBuf[100]=“Sendmessagebackevery100ms”;while(1){semTake(g_synSemId);send(g_nSockId,pChTxBuf,…..);}} externsemIdg_synSemId;voidtest(void){创建同步信号量,并初始为空;//即使用变量g_synSemId/*创建任务C*/taskSpawn(“tTestTskC”,50,2000,testTskC,0…….);}voidtestTskC(void){while(1){taskDelay(100);/*延时100ms,同时放出CPU资源*/semGive(g_synSemId);}}源文件2.c 下次课将介绍进程间通信(IPC)问题,请提前预习相关的内容,即教材上的第2.3小节。 下课啦!
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处