第二章多任务和多线程精选PPT.ppt

上传人:石*** 文档编号:70320274 上传时间:2023-01-19 格式:PPT 页数:31 大小:1.39MB
返回 下载 相关 举报
第二章多任务和多线程精选PPT.ppt_第1页
第1页 / 共31页
第二章多任务和多线程精选PPT.ppt_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《第二章多任务和多线程精选PPT.ppt》由会员分享,可在线阅读,更多相关《第二章多任务和多线程精选PPT.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第二章多任务和多线程第1页,本讲稿共31页1.程序的顺序执行所具有的特点程序的顺序执行所具有的特点:顺序性当程序在处理机上运行时,处理机严格的按照顺序执行程序的规定动作封闭性一个程序在执行时独占资源,除了开始状态外,只有程序本身规定的动作才能改变资源的状态.可再现性程序执行的结果与与执行速度无关第2页,本讲稿共31页2.多道程序设计技术多道程序设计技术程序的并发执行程序的并发执行在任一时刻,系统中不再只有一个活动,而且还存在着并行的活动.从硬件方面看,处理机,各种外设,存储部件常常是并行的工作;从程序活动来看则可能有若干作业程序或者同时或者相互穿插的在系统中被执行.资源共享资源共享这是现代操作

2、系统的另一特性.指系统中的硬件资源和软件资源不再为单个用户程序所独占,而由几个用户程序共同占有.总之,程序的并发执行和资源共享是相互依存的.第3页,本讲稿共31页3.程序并发执行的特点程序并发执行的特点失去了程序的封闭性在任何时刻,程序的执行结果不一致程序和机器执行的活动不再一一对应程序:指令的有序集合静态概念机器执行程序的活动:指令序列在处理机上的执行活动,通常称之为计算.动态概念【注】在顺序执行的程序中,二者一一对应.并发程序间的相互制约主要表现在,一个正在执行的程序需要另一个程序执行的结果的情况.第4页,本讲稿共31页4.进程进程在多道程序下,程序的并发执行代替了程序的顺序执行.程序活动

3、不再处于一个封闭系统,而出现了许多新的特征,即独立性,并发性,动态性以及它们之间的相互制约性.20世纪60年代中期MULTCS系统的设计者和以E.W.Dijkson为首的The系统的设计者开始广泛的使用进程这一概念来描述系统和用户的程序的活动.对于进程,目前尚无一个非常确切的概念,为了强调进程的并发性和动态性,我们定义进程为:进程是程序的一次执行,该程序可与与其他程序并发执行.第5页,本讲稿共31页注:THE系统是1968年由E.W.Dijkstra和他的学生在荷兰的艾恩德霍文技术学院(Technische Hogeschool Eindhoven)开发的.此系统中第一次提出了操作系统的层次式

4、结构设计方法.该系统是运行在荷兰的Electrologica X8 计算机上的一个简单批处理系统,其内存只有32K,每字27位,系统共分6 个层次。处理器分配在第0层中进行,在中断发生或定时器到期时,由该层进行切换。在第0层之上,系统由一些连续的进程组成,编写这些进程时不用再考虑在单处理机上多个进程运行的细节。换句话说,第0层中提供了基本的CPU多道程序设计。存储管理在第1层中进行,它为进程分配主存空间,在主存用完时则在一个512K的磁鼓上保留进程的一部分(页面)。第1层上,进程不用考虑它是在磁鼓上还是在主存中运行;第1层软件保证一旦需要访问某一页面时,该页面必定已在内存中。第2层处理进程与操

5、作员控制台之间的通信。在第2层上,可以认为每个进程都有自己的操作员控制台。第3层管理I/O设备和缓存相关的信息流。第3层上,每个进程都与有良好特性的抽象I/O设备打交道,而不必考虑外部设备的物理细节。第4层是用户层。用户进程不用考虑进程,内存,控制台或I/O设备等细节。系统操作员进程位于第5层中。第6页,本讲稿共31页4.1进程的表示组成:程序:描述了进程所要完成的功能数据集合:包括程序在执行时所需要的数据和工作区进程控制块(PCB):包含了进程的描述信息和控制信息,是动态特性的集中反映PCB程序数据PCB程序数据共享程序段第7页,本讲稿共31页4.2进程的基本调度状态运行状态:进程已获得必要

6、的资源,并占有处理机,处理机正在执行该线程.就绪状态:已具备了运行条件等待处理机.阻塞状态:进程在运行过程中,应等待某一时间而暂时不能运行的状态.状态转换关系如下图所示:调度 时间片 I/O用完 请求I/O完成运行就绪阻塞第8页,本讲稿共31页4.3常用的进程调度算法静态优先级法 系统在调度进程时,按事先指定的优先级从高到低进行选择动态优先级按照变化情况对各个进程的优先级进行适当的调整时间片轮转系统把所有的就绪进程按FCFS(First Come First Sever)规则排成一个队列,首先将处理机分配给队列中的第第一个进程,并规定执行一定的时间,该时间称为时间片.当该进程用完这一时间片时,

7、系统将它送至就绪队列的所有进程,又把处理机分配给下一进程,再执行同样大小的时间片.这样,就绪队列中的所有进程,就可以依次轮流获得一个时间片的处理时间,然后系统又回到队列的开始部分.如此不断循环.第9页,本讲稿共31页5.线程线程在操作系统中引入进程的概念的目的在于提高系统效率,提高系统资源利用率.进程是系统调度的基本单位,也是系统资源分配的一般单位.进程因创建而产生,经调度程序的调度而运行,因等待某一事件而阻塞,最后因任务完成而撤消.在进程的整个生存期内要不断地改变进程的运行环境.因此,如果以进程为系统调度的基本单位,要付出较大的时空开销,从而也限制了进程的开销和切换的效率.为了提高系统的并行

8、能力,把并行程序进一步减小,在进程内部引入了线程(Thread).线程是系统系统调度的一般单位,而不是独立资源分配的基本单位.线程可定义为进程内的一个执行单位,或者定义为进程内的一个可调度的实体.一个进程可以有多个线程,而且至少有一个可执行线程.第10页,本讲稿共31页5.1进程和线程的关系进程和线程是构造操作系统的两个基本元素,是操作系统的两个活动部分,两者之间的关系如下:1.线程是进程一个组成部分.2.进程的多线程都在进程的地址空间活动.3.资源是分配给进程的,而不是分配线程的.线程在执行中需要资源是,系统从进程的资源配额中扣除并分配给它.4.处理机调度的基本单位是线程.5.线程在执行过程

9、中,需要同步.第11页,本讲稿共31页5.2线程的组成WindowsNT中,线程和进程一样,也用对象来实现.线程是对象管理程序创建和删除.一个线程的基本组成是:(1)一个唯一的标识符,称之为客户ID.(2)描述处理机状态的一组寄存器内容.(3)两个栈,分别用于用户态和核心态下执行.(4)一个私用的存储区.第12页,本讲稿共31页5.3线程的基本调度状态(1)就绪状态:该线程已具备执行条件以等待CPU的执行,线程调度程序只从就绪线程池中选择线程进入备用状态.(2)备用状态:系统中每个处理机上只能有一个线程处于备用状态.处于备用状态的线程已被选定某一特定处理机的一个执行对象.当条件合适时,调度程序

10、为该线程进行描述表切换.(3)运行状态:一旦调度程序执行完描述表切换,该线程便进入了运行状态.(4)等待状态:以下情况可使线程进入等待状态:线程等待某一对象(事件)以便同步它的执行;因I/O系统而等待;环境子系统导致线程自己阻塞.当线程的等待结束,就回到就绪状态.(5)转化状态:如果线程已准备好执行,但由于资源不可用,从而成为转化状态.当资源为可用时,线程便于由转化状态进入就绪状态.(6)终止状态:线程完成了它的执行.第13页,本讲稿共31页5.4线程之间的通讯进程是没有活力的,它只是一个静态的概念.一个程序运行时,由系统自动创建一个进程.一个进程至少拥有一个线程,即主线程.主线程以函数地址形

11、式提供给操作系统.主线程终止,进程亦终止.另外,根据需要在程序中可以自己创建其他线程,称之为次线程.一般情况下,一个次级线程要为主线程完成某种特定类型的任务,这就隐含着表示在主线程和次级线程之间需要通信.实现这种通信功能的方法有:使用全局变量,使用消息和使用事件同步对象5.5线程间通讯的方法(一)使用全局变量进行线程通信使用全局变量进行线程通信/MyThreadView.cpp.volatile int ThreadFlag;/创建全局变量创建全局变量第14页,本讲稿共31页.void CMyThreadView:OnStopThread()ThreadFlag=0;/设置线程标记为终止设置线

12、程标记为终止void CMyThreadView:OnStartThread()ThreadFlag=1;HWND hWnd=GetSafeHwnd();AfxBeginThread(ThreadProc,hWnd);第15页,本讲稿共31页UINT ThreadProc(LPVOID param).for(;)/无限循环,使秒针不停地旋转无限循环,使秒针不停地旋转/监视全局变量监视全局变量ThreadFlag,若值为零则结束线程若值为零则结束线程if(ThreadFlag=0)break;.第16页,本讲稿共31页使用消息首先,用户要定义一个用户消息,如下所示:#define WM_USER

13、MSG WMUSER+100然后,需要时在一个线程中可以调用Win32API函数PostMessage()或成员函数CWinThread:PostThreadMessage()向另外一个线程发送定义的消息WM_USERMSG第17页,本讲稿共31页u实例:实例:1.首先定义一个用户消息首先定义一个用户消息/MyThreadView.h.const WM_THREADENDED=WM_USER+100;class CMyThreadView:public CView .afx_msg LONG OnThreadEnded(WPARAM wParam,LPARAM lParam);DECLARE_

14、MESSAGE_MAP();第18页,本讲稿共31页2.消息映射消息映射/MyThreadView.cppBEGIN_MESSAGE_MAP(CMyThreadView,CView)/AFX_MSG_MAP(CMyThreadView)ON_COMMAND(ID_StartThread,OnStartThread)ON_COMMAND(ID_StopThread,OnStopThread)/AFX_MSG_MAPON_MESSAGE(WM_THREADENDED,onThreadEnded)END_MESSAGE_MAP()第19页,本讲稿共31页3.调用函数调用函数:PostMessage(

15、)发送消息发送消息/MyThreadView.cppUINT ThreadProc(LPVOID param).:PostMessage(HWND)parma,WM_THREADENDED,0,0);return 0;第20页,本讲稿共31页4.手工编写函数手工编写函数OnThreadEnded/MyThreadView.cppLONG CMyThreadView:OnThreadEnded(WPARAM wParam,LPARAM lParam)CString str;str.Format(%s%d%s,第第,ThreadCount-,个线程终止个线程终止);MessageBox(str);

16、return 0;第21页,本讲稿共31页5.5线程间通讯的方法(二)l使用事件同步对象多线程程序需要使用同步对象来实现同步.同步对象主要有3种:临界区对象、互斥(mutex)和信号灯(semaphore).u临界区对象方法:临界区对象方法:使用临界区对象,将一段代码放入临界区,制止多于一个线程同时进入临界区中CCriticalSection criSect;criSect.Lock();criSect.Unlock();第22页,本讲稿共31页void CMainFrame:OnSynchro()/同步方式启动三个线程同步方式启动三个线程count=0;HWND hWnd=GetSafeHw

17、nd();AfxBeginThread(SynchroFunction,hWnd);AfxBeginThread(SynchroFunction,hWnd);AfxBeginThread(SynchroFunction,hWnd);第23页,本讲稿共31页UINT SynchroFunction(LPVOID param)/同步线程控制函数同步线程控制函数int Data5,i;critical.Lock();/保护临界区数据保护临界区数据for(i=0;i3;i+)count+;:Sleep(50);Datai=count;char str50;str0=0;for(i=0;i3;i+)in

18、t len=strlen(str);wsprintf(&strlen,%d,Datai);critical.Unlock();/释放该线程对临界区的控制权释放该线程对临界区的控制权:MessageBox(HWND)param,str,Nonsyn Thread,MB_OK);return 0;第24页,本讲稿共31页UINT NonsynFunction(LPVOID param)/非同步线程控制函数非同步线程控制函数int Data5,i;for(i=0;i3;i+)count+;:Sleep(50);Datai=count;char str50;str0=0;for(i=0;i3;i+)i

19、nt len=strlen(str);wsprintf(&strlen,%d,Datai);:MessageBox(HWND)param,str,Nonsyn Thread,MB_OK);return 0;第25页,本讲稿共31页void CMainFrame:OnNonsyn()/非同步方式启动非同步方式启动三个线程三个线程count=0;HWND hWnd=GetSafeHwnd();AfxBeginThread(NonsynFunction,hWnd);AfxBeginThread(NonsynFunction,hWnd);AfxBeginThread(NonsynFunction,hW

20、nd);第26页,本讲稿共31页u互斥对象(Mutexse):类似临界区对象,如果另一线程已经占用了互斥对象,系统将挂起当前的调用线程,直到这个互斥对象被占用线程释放为止CSingleLock singleLock(&mutex);singleLock.Lock();singleLock.Unlock();第27页,本讲稿共31页/MySyn1View.cpp/CCriticalSection critical;CMutex mutex;UINT SynchroFunction(LPVOID param)/同步线程控制函同步线程控制函数数./critical.Lock();/保护临界区数据保护

21、临界区数据CSingleLock singleLock(&mutex);/用互斥对象保护用互斥对象保护数据数据singleLock.Lock();./critical.Unlock();/释放该线程对临界区的控制权释放该线程对临界区的控制权singleLock.Unlock();.第28页,本讲稿共31页u使用信号量使用信号量(Semaphores):信号量可以允许多个线程同时访问:信号量可以允许多个线程同时访问资源,创建信号量对象时,可以设置访问计数器的值来控制同资源,创建信号量对象时,可以设置访问计数器的值来控制同时使用资源的线程数。每当有一个线程访问资源时,计数器的时使用资源的线程数。每

22、当有一个线程访问资源时,计数器的值减一,当值为值减一,当值为0时,其他线程不再允许访问资源,直到某一线时,其他线程不再允许访问资源,直到某一线程释放信号量。程释放信号量。CSemaphore Sema(m,n);初始线程数初始线程数最大线程数第29页,本讲稿共31页/MySyn1View.cpp/CCriticalSection critical;CSemaphore*sema=new CSemaphore(2,2);UINT SynchroFunction(LPVOID param)/同步线程控制函数同步线程控制函数int Data5,i;CSingleLock singleLock(sema);singleLock.Lock();/保护临界区数据保护临界区数据for(i=0;i3;i+)count+;/:Sleep(50);:Sleep(5000);.singleLock.Unlock();/释放该线程对临界区的控制权释放该线程对临界区的控制权:MessageBox(HWND)param,str,synchro Thread,MB_OK);return 0;第30页,本讲稿共31页第31页,本讲稿共31页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁