《第3讲补充线程精选文档.ppt》由会员分享,可在线阅读,更多相关《第3讲补充线程精选文档.ppt(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3讲补充线程本讲稿第一页,共三十一页WINCE中的进程与线程中的进程与线程1 进程的基本概念进程的基本概念2 线程的基本概念线程的基本概念3 系统调度系统调度 本讲稿第二页,共三十一页1进程的基本概念进程的基本概念n进程(Process)定义:是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的一个独立单位。n进程通常由三部分组成:程序、数据集合、进程控制块PCB(Process Control Block)本讲稿第三页,共三十一页1进程的基本概念进程的基本概念 进程特点:并发性:执行时间可以重叠;动态性:动态的产生,动态的消亡。有生命周期,存在不同的
2、状态;独立性:是一个相对完整的调度单位。制约性(交互性):虽然独立执行,但可能存在相互制约关系;异步性:各进程执行时间相对独立,不确定,不可预知;本讲稿第四页,共三十一页n进程与程序的区别与联系:程序是构成进程的3个组成部分之一。一个进程的运行目标是执行它对应的程序。n进程与程序的区别:n程序是静态的,进程是动态的。n进程有创建、执行及撤销而消亡的生命周期,程序只是一个文件,存在于某种介质上。n一个程序可对应多个进程,但是一个进程只能对应一个程序。1进程的基本概念进程的基本概念本讲稿第五页,共三十一页1进程的基本概念进程的基本概念运行运行就绪就绪阻塞阻塞被调度被调度时间片用完,时间片用完,中断
3、中断资源释放或事资源释放或事件完成件完成等待资源等待资源和事件和事件新建新建创建完毕创建完毕结束结束结束执行结束执行五种进程状态转换五种进程状态转换本讲稿第六页,共三十一页1进程的基本概念进程的基本概念n进程之间的基本关系:n同步进程之间相互合作、协同工作的关系称为进程的同步。简单说来就是:多个相关进程在执行次序上的协调。n临界资源也称独占资源,是指在一段时间内只允许一个进程访问的资源。例如打印机,磁带机,也可以是进程共享的数据、变量等。n互斥定义:当多个进程因为争夺临界资源而互斥执行称为进程的互斥。进程间的间接制约。本讲稿第七页,共三十一页1进程的基本概念进程的基本概念nWindows CE
4、(5.0)最多只支持32个进程同时运行。每个进程占据32MB的虚拟地址空间。n在系统启动的时候,默认会启动四个进程,NK.EXE,FILESYS.EXE,GWES.EXE及DEVICE.EXE。本讲稿第八页,共三十一页n创建进程的API如下:BOOL CreateProcess(LPCWSTR lpApplicationName,/可执行文件的路径和名字,不能为NULL LPWSTR lpCommandLine,/传递启动参数(必须为Unicode字符串)LPSECURITY_ATTRIBUTES lpProcessAttributes,/不支持,设置为NULL LPSECURITY_ATTR
5、IBUTES lpThreadAttributes,/不支持,设置为NULL BOOL bInheritHandles,/不支持,设置为FALSE DWORD dwCreationFlags,/进程加载后的初始状态 PVOID lpEnvironment,/不支持,设置为NULL LPCWSTR lpCurrentDirectory,/不支持,设置为NULL LPSTARTUPINFOW lpStartupInfo,/不支持,设置为NULL LPPROCESS_INFORMATION lpProcessInformation,/返回的进程相关的信息 );整个函数返回值为BOOL型,当成功创建进
6、程后,返回值为真(TRUE),否则返回假(FALSE).1进程的基本概念进程的基本概念本讲稿第九页,共三十一页n终止进程n最好是由WinMain()或者其他主函数返回。n调用ExitThread()函数使进程的主线程退出从而终止进程。n直接调用ExitProcess()函数。n在当前进程终止另一个进程可以使用TerminateProcess()。1进程的基本概念进程的基本概念本讲稿第十页,共三十一页2线程的基本概念线程的基本概念n线程(Thread)定义:有时也称为轻量级进程,它代替以往的进程,成为现代操作系统中处理机调度的基本单位。本讲稿第十一页,共三十一页2线程的基本概念线程的基本概念n线
7、程特点:n是进程的一个实体,可作为系统独立调度和分派的基本单位。n不拥有系统资源(只拥有从属进程的全部资源,资源是分配给进程)n一个进程中的多个线程可并发执行。(进程可创建线程执行同一程序的不同部分)n系统开销小、切换快。(进程的多个线程都在进程的地址空间活动)本讲稿第十二页,共三十一页2线程的基本概念线程的基本概念PCB程序程序数据数据进进程程地地址址空空间间TCB栈栈线程线程1TCB栈栈线程线程2TCB栈栈线程线程3工作区工作区n线程是进程的一个组成部分,线程由进程创建,因此一个进程中至少存在一个线程,线程还可以创建其它线程。n进程是资源分配和保护的基本单位,线程只能在进程的地址空间活动,
8、线程只能使用其所在进程的资源。本讲稿第十三页,共三十一页2线程的基本概念线程的基本概念n线程是Windows CE中最小的可执行单元。Windows CE的调度系统只识别和调度线程。n一个进程可拥有的线程数理论上是没有限制的,只与当前可用的内存有关。n线程的上下文:线程占用的内存以及其他资源(如:处理器的寄存器、自己独立的栈等),这些资源构成了线程的上下文。n线程可运行在:n核心态:线程可访问操作系统所有的资源(可访问核心态的2GB虚拟地址空间)。一般来说,操作系统线程和中断服务例程运行在核心态。n用户态:应用程序和设备驱动程序的中断服务线程运行在用户态。本讲稿第十四页,共三十一页2线程的基本
9、概念线程的基本概念n创建线程的API如下:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa,/不支持,设为NULL DWORD cbStack,/线程栈的大小,通常被设置为NULL,使用默认值 LPTHREAD_START_ROUTINE lpStartAddr,/指向线程的执行函数的指针 LPVOID lpvThreadParam,/向线程中传递一个参数 DWORD fdwCreate,/控制线程创建的附加参数 LPDWORD lpIDThread/返回新创建线程的ID);如果线程创建成功,那么函数返回新创建线程的句柄;否则函数返回NULL。本讲稿
10、第十五页,共三十一页2线程的基本概念线程的基本概念n结束线程n最好是从线程的执行函数返回。n在线程中调用ExitThread()函数可以使线程结束执行。n在当前线程中终止另一个线程调用TerminateThread()函数。本讲稿第十六页,共三十一页3系统调度系统调度nWindows CE是一个抢占式多任务(Preemptive Multitasks)操作系统。调度程序使用基于优先级的时间片算法对线程进行调度。nWindows CE中每个线程都有一个优先级,Windows CE调度系统根据线程的优先级进行调度。nWindows CE将线程分为256个优先级。0表示优先级最高,255表示优先级最
11、低。096-优先级高于驱动程序的实时程序使用248255-基于WindowsCE的驱动程序153247-优先级低于驱动程序的实时程序使用248255-非实时的普通应用程序本讲稿第十七页,共三十一页3系统调度系统调度PriorityComponent0-19Open Real Time Above Drivers20Graphics Vertical Retrace99Power management Resume Thread100-108USB OHCI UHCI,Serial109-129IRSIR1,NDIS,Touch130KITL131VMini132CxPort145PS2 Key
12、board148IRComm150TAPI248Power Management249WaveDev,Mouse,PnP,Power250WaveAPI251Normal252-255Open-Applications本讲稿第十八页,共三十一页3系统调度系统调度n获取和设置线程的优先级GetThreadPriority 当前线程的优先级SetThreadPriority 改变当前线程的优先级(248255)CeGetThreadPriority 得到当前线程的优先级CeSetThreadPriority 改变当前线程的优先级本讲稿第十九页,共三十一页3系统调度系统调度n线程的状态n运行(Run
13、ning)线程正在处理器上执行。n就绪(Ready)线程可以执行,但是此刻没有占用处理器。如果就绪的线程被调度程序选中,则占用处理器就进入运行状态。n挂起(Suspended)创建线程时指定了CREATE_SUSPENDED 参数或 者调用SuspendThread()函数都可导致线程挂起。n睡眠(Sleeping)调用Sleep函数可使线程进入睡眠状态,处于睡眠 状态的线程不能占有处理器。当睡眠时间结束后,线程转入就绪态。n阻塞(Blocked)如果线程申请的共享资源暂时无法获得,那么线程 就进入阻塞状态,处于阻塞状态的线程不能占有处理器。n终止(Terminated)线程运行结束。本讲稿第
14、二十页,共三十一页3系统调度系统调度就绪就绪终止终止阻塞阻塞睡眠睡眠运行运行挂起挂起运行结束运行结束睡眠结束睡眠结束得到得到资源资源ResumeSuspend得到得到CPU上下文上下文切换切换Sleep(n)本讲稿第二十一页,共三十一页3系统调度系统调度 对线程的控制就好比你控制了一个雇工为你干活。你对雇工的控制是通过编程来实现的。挂起线程挂起线程的意思就是你对主动对雇工说:“你睡觉去吧,用着你的时候我主动去叫你,然后接着干活”。使线程睡眠线程睡眠的意思就是你主动对雇工说:“你睡觉去吧,某时某刻过来报到,然后接着干活”。线程阻塞线程阻塞的意思就是,你突然发现,你的雇工不知道在什么时候没经过你允
15、许,自己睡觉呢,但是你不能怪雇工,肯定你这个雇主没注意,本来你让雇工扫地,结果扫帚被偷了或被邻居家借去了,你又没让雇工继续干别的活,他就只好睡觉了。至于扫帚回来后,雇工会不会知道,会不会继续干活,你不用担心,雇工一旦发现扫帚回来了,他就会自己去干活的。因为雇工受过良好的培训.本讲稿第二十二页,共三十一页3系统调度系统调度nWindows CE调度系统的特点n具有高优先级的进程如果处于就绪状态,则总是会被调度系统选中执行n如果系统中存在多个优先级相同的就绪进程,这些进程以时间片轮转算法调度n如果线程的时间片大小被设置为0,那么它会一直占用处理器运行,直到线程结束或者进入阻塞、挂起及睡眠状态n调度
16、系统不提供对线饥饿(Starvation)的自动检测本讲稿第二十三页,共三十一页9.3系统调度系统调度线程并发引起的问题:n多个线程相对执行的顺序是不确定的。n线程执行顺序的不确定性会产生执行结果的不确定性。n在多个线程对共享数据操作时常常会由于这种不确定性而产生错误。本讲稿第二十四页,共三十一页3系统调度系统调度 解决办法:解决办法:让线程的访问共享数据的操作序列不被打断,让线程的访问共享数据的操作序列不被打断,即让这些操作序列即让这些操作序列“串行串行”执行。执行。这种方法就叫做线程同步。这种方法就叫做线程同步。本讲稿第二十五页,共三十一页3系统调度系统调度临界区:临界区:临界区对象运行在
17、用户模式。它能保证在临界区内所有被访问的资源临界区对象运行在用户模式。它能保证在临界区内所有被访问的资源不被其它线程访问,直到当前线程执行完临界区代码。除了不被其它线程访问,直到当前线程执行完临界区代码。除了API外,外,MFC也对临界区函数进行了封装。临界区相关函数:也对临界区函数进行了封装。临界区相关函数:void InitializeCriticalSection(LPCRITICAL_SECTION);void EnterCriticalSection(LPCRITICAL_SECTION);void LeaveCriticalSection(LPCRITICAL_SECTION);v
18、oid DeleteCriticalSection(LPCRITICAL_SECTION);本讲稿第二十六页,共三十一页3系统调度系统调度void CriticalSectionExample(void)CRITICAL_SECTION csMyCriticalSection;InitializeCriticalSection(&csMyCriticalSection);/初始化临界区变量_try EnterCriticalSection(&csMyCriticalSection);/开始保护机制/此处编写代码_finally/异常处理,无论是否异常都执行此段代码LeaveCriticalSe
19、ction(&csMyCriticalSection);/撤销保护机制 本讲稿第二十七页,共三十一页3系统调度系统调度MFC类使用更简单:类使用更简单:CCriticalSection cs;cs.Lock();/编写代码编写代码cs.Unlock();本讲稿第二十八页,共三十一页3系统调度系统调度事件对象事件对象:事件对象运行在内核模式。与用户模式不同,内核模式下线程利用等待函数来等待所需事件对象运行在内核模式。与用户模式不同,内核模式下线程利用等待函数来等待所需要的事件、信号,这个等待过程由操作系统内核来完成,而线程处于睡眠状态,当接收到要的事件、信号,这个等待过程由操作系统内核来完成,而
20、线程处于睡眠状态,当接收到信号后,内核恢复线程的运行。内核模式的优点是线程在等待过程中并不浪费信号后,内核恢复线程的运行。内核模式的优点是线程在等待过程中并不浪费CPU时间,时间,缺点是从用户模式切换到内核模式需要一定的时间,而且还要切换回来。缺点是从用户模式切换到内核模式需要一定的时间,而且还要切换回来。本讲稿第二十九页,共三十一页3系统调度系统调度nDWORD WINAPI WaitForSingleObject(_in HANDLE hHandle,_in DWORD dwMilliseconds);n参数参数1为为HANDLE类型,参数类型,参数2为为DWORD类型。此函数等待参数类型
21、。此函数等待参数1标标识的事件,等待时间为参数识的事件,等待时间为参数2的值,单位的值,单位ms。如果不超时,当事件成。如果不超时,当事件成为有信号状态时,线程唤醒继续运行。为有信号状态时,线程唤醒继续运行。本讲稿第三十页,共三十一页3系统调度系统调度HANDLE WINAPI CreateEvent(_in LPSECURITY_ATTRIBUTES lpEventAttributes,_in BOOL bManualReset,_in BOOL bInitialState,_in LPCTSTR lpName);n函数函数CreateEvent创建一个事件对象,参数创建一个事件对象,参数1
22、必须为必须为NULL,参数,参数2指定是否手工重指定是否手工重新设置事件对象的状态。新设置事件对象的状态。如果为如果为FALSE,当等待函数接到信号并返回后此事件对象被自动置为无信号状,当等待函数接到信号并返回后此事件对象被自动置为无信号状态。这时等待此事件对象的其它线程就不会被唤醒,因为事件对象已经被置为无态。这时等待此事件对象的其它线程就不会被唤醒,因为事件对象已经被置为无信号状态。信号状态。如果参数如果参数2设置为设置为TRUE,当等待函数接到信号并返回后事件对象不会被自动,当等待函数接到信号并返回后事件对象不会被自动置于无信号状态,其它等待此事件对象的线程都能够被唤醒。置于无信号状态,其它等待此事件对象的线程都能够被唤醒。nBOOL SetEvent(HANDLE hEvent);本讲稿第三十一页,共三十一页