280 likes | 438 Views
2.2 进程和线程与调度. 进程 线程 调度. 2.2 进程和线程与调度. 进程 线程 调度 . 进程概述. 进程 (process) 定义 : 是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的一个独立单位。 进程通常由三部分组成:程序、数据集合、进程控制块 PCB(Process Control Block) 进程特点: 动态性 独立性 并发行 结构化. 进程概述. 进程与程序的联系: 程序是构成进程的两个组成部分之一。一个进程的运行目标是执行它对应的程序。 进程与程序的区别:
E N D
2.2 进程和线程与调度 • 进程 • 线程 • 调度
2.2 进程和线程与调度 • 进程 • 线程 • 调度
进程概述 • 进程(process)定义:是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的一个独立单位。 • 进程通常由三部分组成:程序、数据集合、进程控制块PCB(Process Control Block) • 进程特点: • 动态性 • 独立性 • 并发行 • 结构化
进程概述 • 进程与程序的联系: 程序是构成进程的两个组成部分之一。一个进程的运行目标是执行它对应的程序。 • 进程与程序的区别: • 程序是静态的,进程是动态的。 • 进程有创建、执行及撤销而消亡的生命周期,程序只是一个文件,存在于某种介质上。 • 一个程序可对应多个进程,但是一个进程只能对应一个程序。
Windows CE进程 • Windows CE(5.0)最多只支持32个进程同时运行。每个进程占据32MB的虚拟地址空间,也被称为一个Slot。 • 在系统启动的时候,默认会启动四个进程,NK.EXE, FILESYS.EXE, GWES.EXE及DEVICE.EXE。
Windows CE进程 • Windows CE的进程也不支持环境变量(Environment Variable)和当前目录。 • 如果没有明确指明可执行文件的路径,那么Windows CE会按照如下的顺序搜索: • 首先查找“\Windows”目录 • 查找根目录(“\”) • OEM所指定的搜索目录(“HKEY_LOCAL_MACHINE\Loader\SystemPath”) • 例如:如果MyApp.exe的同一目录中存在MyFile.tex,那么下面的代码都是不正确的。 _wfopen(L”%WINDOWS%\\MyFile.txt, L”w”); _wfopen(L”MyFile.txt”,L”w”);
Windows CE进程 一种解决方案 TCHAR szBuf[MAX_PATH]; DWORD dwPathLen; //得到当前程序可执行文件的完整路径 dwPathLen = GetModuleFileName(NULL,szBuf,MAX_PATH); if(!dwPathLen) { return -1; } //除去文件名 while(szBuf[--dwPathLen]!=‘\\’); szBuf[dwPathLen+1]=NULL; //拼接文件 _tcscat(szBuf,TEXT(“MyFile.txt”)); //如果当前文件位于/Temp,则此时szBuf的内容为”/Temp/MyFile.txt”
Windows CE进程 • 创建进程的API如下: BOOL CreateProcess ( LPCWSTR lpApplicationName, //可执行文件的路径和名字,不能为NULL LPWSTR lpCommandLine, //传递启动参数(必须为Unicode字符串) LPSECURITY_ATTRIBUTES lpProcessAttributes, //不支持,设置为NULL LPSECURITY_ATTRIBUTES lpThreadAttributes, //不支持,设置为NULL BOOL bInheritHandles, //不支持,设置为FALSE DWORD dwCreationFlags, //进程加载后的初始状态 PVOID lpEnvironment, //不支持,设置为NULL LPCWSTR lpCurrentDirectory, //不支持,设置为NULL LPSTARTUPINFOW lpStartupInfo, //不支持,设置为NULL LPPROCESS_INFORMATION lpProcessInformation, //返回的进程相关的信息 ); 整个函数返回值为BOOL型,当成功创建进程后,返回值为真(TRUE) ,否则返回假(FALSE).
Windows CE进程 • 终止进程 • 最好是由WinMain()或者其他主函数返回 • 调用ExitThread()函数使进程的主线程退出从而终止进程 • 直接调用ExitProcess()函数 • 在当前进程终止另一个进程可以使用TerminateProcess()
2.2 进程和线程与调度 • 进程 • 线程 • 调度
线程概述 • 线程(Thread)定义:有时称轻量级进程,进程中的一个运行实体,是一个CPU调度单位。 • 线程特点: • 是进程的一个实体,可作为系统独立调度和分派的基本单位。 • 不拥有系统资源(只拥有从属进程的全部资源,资源是分配给进程) • 一个进程中的多个线程可并发执行。(进程可创建线程执行同一程序的不同部分) • 系统开销小、切换快。(进程的多个线程都在进程的地址空间活动)
线程概述 • 线程和进程的关系是: • 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。 • 线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
Windows CE线程 • 线程是Windows CE中最小的可执行单元。Windows CE的调度系统只识别和调度线程。 • 一个进程可拥有的线程数理论上是没有限制的,只与当前可用的内存有关。 • 线程的上下文:线程占用的内存以及其他资源(如:处理器的寄存器、自己独立的栈等),这些资源构成了线程的上下文。 • 线程可运行在: • 核心态:线程可访问操作系统所有的资源(可访问核心态的2GB虚拟地址空间)。一般来说,操作系统线程和中断服务例程运行在核心态。 • 用户态:应用程序和设备驱动程序的中断服务线程运行在用户态。
Windows CE线程 • 创建线程的API如下: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpsa, //不支持,设为NULL DWORD cbStack, //线程栈的大小,通常被设置为NULL,使用默认值 LPTHREAD_START_ROUTINE lpStartAddr, //指向线程的执行函数的指针 LPVOID lpvThreadParam, //向线程中传递一个参数 DWORD fdwCreate, //控制线程创建的附加参数 LPDWORD lpIDThread//返回新创建线程的ID ); 如果线程创建成功,那么函数返回新创建线程的句柄;否则函数 返回NULL。
Windows CE线程 • 结束线程 • 最好是从线程的执行函数返回 • 在线程中调用ExitThread()函数可以使线程结束执行 • 在当前线程中终止另一个线程调用TerminateThread()函数
2.2 进程和线程与调度 • 进程 • 线程 • 调度
Windows CE调度 • Windows CE是一个抢占式多任务(Preemptive Multitasks)操作系统。调度程序使用基于优先级的时间片算法对线程进行调度。 • Windows CE中每个线程都有一个优先级,Windows CE调度系统根据线程的优先级进行调度。 • Windows CE将线程分为256个优先级。0表示优先级最高,255表示优先级最低。 0~96---------优先级高于驱动程序的实时程序使用 248~255----基于WindowsCE的驱动程序 153~247----优先级低于驱动程序的实时程序使用 248~255----非实时的普通应用程序
Windows CE调度 • 获取和设置线程的优先级 • GetThreadPriority – 当前线程的优先级 • SetThreadPriority – 改变当前线程的优先级 (248~255) • CeGetThreadPriority – 得到当前线程的优先级 • CeSetThreadPriority – 改变当前线程的优先级
Windows CE调度 • 时间片大小(Quantum):在线程获得处理器后,会执行特定的一段时间,然后重新调度,这段时间称做时间片大小。 • 默认的时间片是 100毫秒,OEM可以在OAL中重新设置 • 获得时间片大小的API DWORD CeGetThreadQuantum( HANDLE hThread ); 此函数以线程的句柄为参数,返回值是一个32 位无符号整数,代表线程的时间片大小。
Windows CE调度 • 线程的状态 • 运行(Running) 线程正在处理器上执行。 • 就绪(Ready) 线程可以执行,但是此刻没有占用处理器。如果就绪的线程被调度程序选中,则占用处理器就进入运行状态。 • 挂起(Suspended) 创建线程时指定了CREATE_SUSPENDED 参数或者调用SuspendThread()函数都可导致线程挂起。 • 睡眠(Sleeping) 调用Sleep函数可使线程进入睡眠状态,处于睡眠状态的线程不能占有处理器。当睡眠时间结束后,线程转入就绪态。 • 阻塞(Blocked)如果线程申请的共享资源暂时无法获得,那么线程就进入阻塞状态,处于阻塞状态的线程不能占有处理器。 • 终止(Terminated)线程运行结束。
运行结束 终止 运行 Suspend Sleep(n) 上下文切换 得到CPU 挂起 睡眠 睡眠结束 Resume 得到资源 阻塞 Windows CE调度 • 线程的状态转换图 就绪
Windows CE调度 • 线程的调度 • 线程A拥有最高的优先级,他会一直执行直到结束或阻塞 • 线程B和C使用时间片轮转算法(Round-Robin,RR)运行
Windows CE调度 • Windows CE调度系统的特点 • 具有高优先级的进程如果处于就绪状态,则总是会被调度系统选中执行 • 如果系统中存在多个优先级相同的就绪进程,这些进程以时间片轮转算法调度 • 如果线程的时间片大小被设置为0,那么它会一直占用处理器运行,直到线程结束或者进入阻塞、挂起及睡眠状态 • 调度系统不提供对线饥饿(Starvation)的自动检测
Windows CE调度 • 优先级反转(Priority Inversion):系统中有一些资源是由多个线程共享的,如果具有高优先级的线程申请的资源正在被低优先级线程占用,那么此时高优先级别的线程就阻塞在低优先级的线程上,反而使具有中休先级的线程先于高优先级的线程执行,这就是所谓的优先级反转。
Windows CE调度 • Windows CE中解决优先级反转的方法 单级方法:在这种方法中,操作系统只会激 活导致高优先级线程阻塞的一个低优先级线程 上台执行,直到释放共享资源。
优先级反转 • Avoid priority inversion by keeping all threads waiting for same resource at the same priority Example: Thread 1 blocked waiting for resource owned by Thread 3, causing Priority Inversion PriorityInversion PriorityRestored Thread 3 High Priority Thread 1 Thread 1 Blocked Preempt Medium Priority Thread 2 Thread 2 Blocked Preempt Blocked Low Priority Thread 3 Thread 3 Resource Owner: Thread 3 Thread 1
Thread API • 线程创建 • CreateThread – 创建一个普通优先级的线程 • 线程优先级 • GetThreadPriority – 当前线程的优先级 • SetThreadPriority – 改变当前线程的优先级 (251) • CeGetThreadPriority – 得到当前线程的优先级 • CeSetThreadPriority – 改变当前线程的优先级 • 线程睡眠 • Sleep(0) – 放弃剩余的时间片 • Sleep (n) – 睡指定的毫秒 • Sleep (INFINITE) – 使当前线程一直睡眠 • SleepTillTick – 睡到下一个时钟嘀嗒 • SuspendThread – 增加线程的挂起计数 • ResumeThread –减少线程的挂起计数