28
2.2 2.2 进进进进进进进进 进进进进进进进进 进进 进进 进进 进进 进进 进进

2.2 进程和线程与调度

  • Upload
    reia

  • View
    84

  • Download
    0

Embed Size (px)

DESCRIPTION

2.2 进程和线程与调度. 进程 线程 调度. 2.2 进程和线程与调度. 进程 线程 调度 . 进程概述. 进程 (process) 定义 : 是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的一个独立单位。 进程通常由三部分组成:程序、数据集合、进程控制块 PCB(Process Control Block) 进程特点: 动态性 独立性 并发行 结构化. 进程概述. 进程与程序的联系: 程序是构成进程的两个组成部分之一。一个进程的运行目标是执行它对应的程序。 进程与程序的区别: - PowerPoint PPT Presentation

Citation preview

Page 1: 2.2   进程和线程与调度

2.2 2.2 进程和线程与调度进程和线程与调度 进程进程 线程线程 调度调度

Page 2: 2.2   进程和线程与调度

2.2 2.2 进程和线程与调度进程和线程与调度 进程进程 线程线程 调度 调度 

Page 3: 2.2   进程和线程与调度

进程概述进程概述 进程进程 (process)(process) 定义定义 :: 是一个具有一定独立功能的是一个具有一定独立功能的

程序在一个数据集合上的一次动态执行过程。它是程序在一个数据集合上的一次动态执行过程。它是系统进行资源分配和调度的一个独立单位。系统进行资源分配和调度的一个独立单位。

进程通常由三部分组成:程序、数据集合、进程控进程通常由三部分组成:程序、数据集合、进程控制块制块 PCB(Process Control Block)PCB(Process Control Block)

进程特点:进程特点: 动态性动态性 独立性独立性 并发行并发行 结构化结构化

Page 4: 2.2   进程和线程与调度

进程概述进程概述 进程与程序的联系:进程与程序的联系: 程序是构成进程的两个组成部分之一。一个程序是构成进程的两个组成部分之一。一个

进程的运行目标是执行它对应的程序。进程的运行目标是执行它对应的程序。 进程与程序的区别:进程与程序的区别:

程序是静态的,进程是动态的。程序是静态的,进程是动态的。 进程有创建、执行及撤销而消亡的生命周期,程序只是进程有创建、执行及撤销而消亡的生命周期,程序只是

一个文件,存在于某种介质上。一个文件,存在于某种介质上。 一个程序可对应多个进程,但是一个进程只能对应一个一个程序可对应多个进程,但是一个进程只能对应一个

程序。程序。

Page 5: 2.2   进程和线程与调度

Windows CEWindows CE 进程进程 Windows CE(5.0)Windows CE(5.0) 最多只支持最多只支持 3232 个进程同时运行。个进程同时运行。

每个进程占据每个进程占据 32MB32MB 的虚拟地址空间,也被称为一的虚拟地址空间,也被称为一个个 SlotSlot 。。

在系统启动的时候,默认会启动四个进在系统启动的时候,默认会启动四个进程,程, NK.EXE, FILESYS.EXE, GWES.EXENK.EXE, FILESYS.EXE, GWES.EXE 及及DEVICE.EXEDEVICE.EXE 。。

Page 6: 2.2   进程和线程与调度

Windows CEWindows CE 进程进程 Windows CEWindows CE 的进程也的进程也不支持环境变量不支持环境变量

(Environment Variable)(Environment Variable) 和当前目录。和当前目录。 如果没有明确指明可执行文件的路径,那么如果没有明确指明可执行文件的路径,那么

Windows CEWindows CE 会按照如下的顺序搜索:会按照如下的顺序搜索: 首先查找“首先查找“ \Windows\Windows”” 目录目录 查找根目录查找根目录 (“\”)(“\”) OEMOEM 所指定的搜索目录所指定的搜索目录 (“HKEY_LOCAL_MACHINE\Loader\(“HKEY_LOCAL_MACHINE\Loader\

SystemPath”)SystemPath”)

例如:如果例如:如果 MyApp.exeMyApp.exe 的同一目录中存在的同一目录中存在MyFile.tex,MyFile.tex, 那么下面的代码都是不正确的。那么下面的代码都是不正确的。

     _wfopen(L”%WINDOWS%_wfopen(L”%WINDOWS%\\MyFile.txt\\MyFile.txt, L”w”);, L”w”); _wfopen(L”MyFile.txt”,L”w”);_wfopen(L”MyFile.txt”,L”w”);

Page 7: 2.2   进程和线程与调度

Windows CEWindows CE 进程进程一种解决方案一种解决方案

TCHAR szBuf[MAX_PATH];TCHAR szBuf[MAX_PATH];

DWORD dwPathLen;DWORD dwPathLen;

//// 得到当前程序可执行文件的完整路径得到当前程序可执行文件的完整路径 dwPathLen = GetModuleFileName(NULL,szBuf,MAX_PATH);dwPathLen = GetModuleFileName(NULL,szBuf,MAX_PATH);

if(!dwPathLen)if(!dwPathLen)

{{

return -1; return -1;

}}

//// 除去文件名除去文件名 while(szBuf[--dwPathLen]!=‘\\’);while(szBuf[--dwPathLen]!=‘\\’);

szBuf[dwPathLen+1]=NULL;szBuf[dwPathLen+1]=NULL;

//// 拼接文件拼接文件 _tcscat(szBuf,TEXT(“MyFile.txt”));_tcscat(szBuf,TEXT(“MyFile.txt”));

//// 如果当前文件位于如果当前文件位于 /Temp/Temp ,则此时,则此时 szBufszBuf 的内容为的内容为”” /Temp/MyFile.txt”/Temp/MyFile.txt”

Page 8: 2.2   进程和线程与调度

Windows CEWindows CE 进程进程 创建进程的创建进程的 APIAPI 如下:如下: BOOL CreateProcess (BOOL CreateProcess (

LPCWSTR lpApplicationName, //LPCWSTR lpApplicationName, // 可执行文件的路径和名字,不能为可执行文件的路径和名字,不能为 NULLNULL

LPWSTR lpCommandLine, //LPWSTR lpCommandLine, // 传递启动参数(必须为传递启动参数(必须为 UnicodeUnicode 字符串)字符串) LPSECURITY_ATTRIBUTES lpProcessAttributes, //LPSECURITY_ATTRIBUTES lpProcessAttributes, // 不支持,设置为不支持,设置为 NULLNULL

LPSECURITY_ATTRIBUTES lpThreadAttributes, //LPSECURITY_ATTRIBUTES lpThreadAttributes, // 不支持,设置为不支持,设置为 NULLNULL

BOOL bInheritHandles, //BOOL bInheritHandles, // 不支持,设置为不支持,设置为 FALSEFALSE

DWORD dwCreationFlags, //DWORD dwCreationFlags, // 进程加载后的初始状态进程加载后的初始状态 PVOID lpEnvironment, //PVOID lpEnvironment, // 不支持,设置为不支持,设置为 NULLNULL

LPCWSTR lpCurrentDirectory, //LPCWSTR lpCurrentDirectory, // 不支持,设置为不支持,设置为 NULLNULL

LPSTARTUPINFOW lpStartupInfo, //LPSTARTUPINFOW lpStartupInfo, // 不支持,设置为不支持,设置为 NULLNULL

LPPROCESS_INFORMATION lpProcessInformation, //LPPROCESS_INFORMATION lpProcessInformation, // 返回的进程相关的信息 返回的进程相关的信息

););

整个函数返回值为整个函数返回值为 BOOLBOOL 型,当成功创建进程后,返回值为真型,当成功创建进程后,返回值为真 (TRUE) (TRUE) ,否则返回假,否则返回假(FALSE).(FALSE).

Page 9: 2.2   进程和线程与调度

Windows CEWindows CE 进程进程 终止进程终止进程

最好是由最好是由 WinMain()WinMain() 或者其他主函数返回或者其他主函数返回 调用调用 ExitThread()ExitThread() 函数使进程的主线程退出从而终止进程函数使进程的主线程退出从而终止进程 直接调用直接调用 ExitProcess()ExitProcess() 函数函数 在当前进程终止另一个进程可以使用在当前进程终止另一个进程可以使用 TerminateProcess()TerminateProcess()

Page 10: 2.2   进程和线程与调度

2.2 2.2 进程和线程与调度进程和线程与调度 进程进程 线程线程 调度调度

Page 11: 2.2   进程和线程与调度

线程概述线程概述 线程线程 (Thread)(Thread) 定义:有时称轻量级进程,进定义:有时称轻量级进程,进

程中的一个运行实体,是一个程中的一个运行实体,是一个 CPUCPU 调度单位。调度单位。 线程特点:线程特点:

是进程的一个实体,可作为系统独立调度和分派的基本是进程的一个实体,可作为系统独立调度和分派的基本单位。单位。

不拥有系统资源(只拥有从属进程的全部资源,资源是不拥有系统资源(只拥有从属进程的全部资源,资源是分配给进程分配给进程 ))

一个进程中的多个线程可并发执行。(进程可创建线程一个进程中的多个线程可并发执行。(进程可创建线程执行同一程序的不同部分)执行同一程序的不同部分)

系统开销小、切换快。(进程的多个线程都在进程的地系统开销小、切换快。(进程的多个线程都在进程的地址空间活动)址空间活动)

Page 12: 2.2   进程和线程与调度

线程概述线程概述 线程和进程的关系是:线程和进程的关系是:

线程是属于进程的,线程运行在进程空间内,同线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清退出时该进程所产生的线程都会被强制退出并清除。除。

线程可与属于同一进程的其它线程共享进程所拥线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息源,只拥有一点在运行中必不可少的信息 (( 如程如程序计数器、一组寄存器和栈序计数器、一组寄存器和栈 )) 。。

Page 13: 2.2   进程和线程与调度

Windows CEWindows CE 线程线程 线程是线程是 Windows CEWindows CE 中最小的可执行单中最小的可执行单元。元。 Windows CEWindows CE 的调度系统只识别和调度的调度系统只识别和调度线程。线程。

一个进程可拥有的线程数理论上是没有限制一个进程可拥有的线程数理论上是没有限制的,只与当前可用的内存有关。的,只与当前可用的内存有关。

线程的上下文:线程占用的内存以及其他资线程的上下文:线程占用的内存以及其他资源(如:处理器的寄存器、自己独立的栈源(如:处理器的寄存器、自己独立的栈等),这些资源构成了线程的上下文。等),这些资源构成了线程的上下文。

线程可运行在:线程可运行在: 核心态核心态 :: 线程可访问操作系统所有的资源(可访问核心态的线程可访问操作系统所有的资源(可访问核心态的 2GB2GB 虚虚

拟地址空间)。一般来说,操作系统线程和中断服务例程运行在核拟地址空间)。一般来说,操作系统线程和中断服务例程运行在核心态。心态。

用户态用户态 :: 应用程序和设备驱动程序的中断服务线程运行在用户态。应用程序和设备驱动程序的中断服务线程运行在用户态。

Page 14: 2.2   进程和线程与调度

Windows CEWindows CE 线程线程 创建线程的创建线程的 APIAPI 如下:如下:HANDLE CreateThread(HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpsa, LPSECURITY_ATTRIBUTES lpsa,          //// 不支持,设为不支持,设为 NULLNULL

DWORD cbStack, //DWORD cbStack, // 线程栈的大小,通常被设置为线程栈的大小,通常被设置为 NULLNULL ,使用默认,使用默认值值

LPTHREAD_START_ROUTINE lpStartAddr, //LPTHREAD_START_ROUTINE lpStartAddr, // 指向线程的执行函数的指针指向线程的执行函数的指针 LPVOID lpvThreadParam, LPVOID lpvThreadParam, ////向线程中传递一个参数 向线程中传递一个参数 DWORD fdwCreate, DWORD fdwCreate,           //// 控制线程创建的附加参数控制线程创建的附加参数 LPDWORD lpIDThreadLPDWORD lpIDThread        //// 返回新创建线程的返回新创建线程的 IDID

); );

如果线程创建成功,那么函数返回新创建线程的句柄;否则函数如果线程创建成功,那么函数返回新创建线程的句柄;否则函数返回返回 NULLNULL 。。

Page 15: 2.2   进程和线程与调度

Windows CEWindows CE 线程线程 结束线程结束线程

最好是从线程的执行函数返回最好是从线程的执行函数返回 在线程中调用在线程中调用 ExitThread()ExitThread() 函数可以使线程结束函数可以使线程结束

执行执行 在当前线程中终止另一个线程调用在当前线程中终止另一个线程调用

TerminateThread()TerminateThread() 函数函数

Page 16: 2.2   进程和线程与调度

2.2 2.2 进程和线程与调度进程和线程与调度 进程进程 线程线程 调度调度

Page 17: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 Windows CEWindows CE 是一个抢占式多任务是一个抢占式多任务 (Preemptive (Preemptive

Multitasks)Multitasks)操作系统。调度程序使用基于优先级的操作系统。调度程序使用基于优先级的时间片算法对线程进行调度。时间片算法对线程进行调度。

Windows CEWindows CE 中每个线程都有一个优先中每个线程都有一个优先级,级, Windows CEWindows CE 调度系统根据线程的优先级进行调度系统根据线程的优先级进行调度。调度。

Windows CEWindows CE 将线程分为将线程分为 256256 个优先级。个优先级。 00表示优表示优先级最高,先级最高, 255255表示优先级最低。表示优先级最低。

     0~96---------0~96---------优先级高于驱动程序的实时程序使用优先级高于驱动程序的实时程序使用     248~255----248~255---- 基于基于 WindowsWindows CECE 的驱动程序的驱动程序     153~247----153~247----优先级低于驱动程序的实时程序使用优先级低于驱动程序的实时程序使用     248~255----248~255----非实时的普通应用程序  非实时的普通应用程序  

Page 18: 2.2   进程和线程与调度

线程线程优先级分布图优先级分布图 (( 例例 ))

Priority Component

0-19 Open – Real Time Above Drivers

20 Graphics Vertical Retrace

99 Power management Resume Thread

100-108 USB OHCI UHCI, Serial

109-129 IRSIR1, NDIS, Touch

130 KITL

131 VMini

132 CxPort

145 PS2 Keyboard

148 IRComm

150 TAPI

248 Power Management

249 WaveDev, Mouse, PnP, Power

250 WaveAPI

251 Normal

252-255 Open - Applications

Page 19: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 获取和设置线程的优先级

GetThreadPriority – 当前线程的优先级 SetThreadPriority – 改变当前线程的优先级

(248~255) CeGetThreadPriority – 得到当前线程的优先

级 CeSetThreadPriority – 改变当前线程的优先

级    

Page 20: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 时间片大小时间片大小 (Quantum):(Quantum): 在线程获得处理器后,会在线程获得处理器后,会

执行特定的一段时间,然后重新调度,这段时间称执行特定的一段时间,然后重新调度,这段时间称做时间片大小。做时间片大小。

默认的时间片是默认的时间片是 100100毫秒,毫秒, OEMOEM 可以在可以在 OALOAL 中中重新设置重新设置

获得时间片大小的获得时间片大小的 APIAPIDWORD CeGetThreadQuantum( DWORD CeGetThreadQuantum( HANDLE HANDLE hThreadhThread ); ); 此函数以线程的句柄为参数,返回值是一个此函数以线程的句柄为参数,返回值是一个 3232位无符号整数,代表线程的时间片大小。位无符号整数,代表线程的时间片大小。

Page 21: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 线程的状态线程的状态

运行运行 (Running)(Running)  线程正在处理器上执行。 线程正在处理器上执行。 就绪就绪 (Ready)(Ready)  线程可以执行,但是此刻没有占用处 线程可以执行,但是此刻没有占用处理器。如果就绪的线程被调度程序选中,则占用处理器理器。如果就绪的线程被调度程序选中,则占用处理器就进入运行状态。就进入运行状态。

挂起挂起 (Suspended) (Suspended) 创建线程时指定了创建线程时指定了CREATE_SUSPENDED CREATE_SUSPENDED 参数或者调用参数或者调用SuspendThread()SuspendThread() 函数都可导致线程挂起。函数都可导致线程挂起。

睡眠睡眠 (Sleeping) (Sleeping) 调用调用 SleepSleep 函数可使线程进入睡眠函数可使线程进入睡眠状态,处于睡眠状态的线程不能占有处理器。当睡眠时状态,处于睡眠状态的线程不能占有处理器。当睡眠时间结束后,线程转入就绪态。间结束后,线程转入就绪态。

阻塞阻塞 (Blocked)(Blocked) 如果线程申请的共享资源暂时无法如果线程申请的共享资源暂时无法获得,那么线程就进入阻塞状态,处于阻塞状态的线程获得,那么线程就进入阻塞状态,处于阻塞状态的线程不能占有处理器。 不能占有处理器。

终止终止 (Terminated)(Terminated) 线程运行结束。 线程运行结束。

Page 22: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 线程的状态转换图线程的状态转换图

就绪就绪

终止终止

阻塞阻塞

睡眠睡眠

运行运行

挂起挂起

运行结束运行结束

睡眠结束睡眠结束

得到得到资源资源

ResumeResume

SuspendSuspend

得到得到CPUCPU

上下文上下文切换切换

Sleep(n)Sleep(n)

Page 23: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 线程线程 AA 拥有最拥有最高的优先级,高的优先级,他会一直执行他会一直执行直到结束或阻直到结束或阻塞塞

线程线程 BB 和和 CC 使使用时间片轮转用时间片轮转算法算法 (Round-(Round-Robin,RR)Robin,RR) 运运行行

线程的调度线程的调度

Page 24: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 Windows CEWindows CE 调度系统的特点调度系统的特点

具有高优先级的进程如果处于就绪状态,则总具有高优先级的进程如果处于就绪状态,则总是会被调度系统选中执行是会被调度系统选中执行

如果系统中存在多个优先级相同的就绪进程,如果系统中存在多个优先级相同的就绪进程,这些进程以时间片轮转算法调度这些进程以时间片轮转算法调度

如果线程的时间片大小被设置为如果线程的时间片大小被设置为 0,0, 那么它会一那么它会一直占用处理器运行,直到线程结束或者进入阻直占用处理器运行,直到线程结束或者进入阻塞、挂起及睡眠状态塞、挂起及睡眠状态

调度系统不提供对线饥饿调度系统不提供对线饥饿 (Starvation)(Starvation) 的自动的自动检测检测

Page 25: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 优先级反转优先级反转 (Priority Inversion)(Priority Inversion) :系统中有:系统中有

一些资源是由多个线程共享的,如果具有高一些资源是由多个线程共享的,如果具有高优先级的线程申请的资源正在被低优先级线优先级的线程申请的资源正在被低优先级线程占用,那么此时高优先级别的线程就阻塞程占用,那么此时高优先级别的线程就阻塞在低优先级的线程上,反而使具有中休先级在低优先级的线程上,反而使具有中休先级的线程先于高优先级的线程执行,这就是所的线程先于高优先级的线程执行,这就是所谓的优先级反转。谓的优先级反转。

Page 26: 2.2   进程和线程与调度

Windows CEWindows CE 调度调度 Windows CEWindows CE 中解决优先级反转的方法中解决优先级反转的方法 单级方法:在这种方法中,操作系统只会激 单级方法:在这种方法中,操作系统只会激活导致高优先级线程阻塞的一个低优先级线程活导致高优先级线程阻塞的一个低优先级线程上台执行,直到释放共享资源。上台执行,直到释放共享资源。

Page 27: 2.2   进程和线程与调度

优先级优先级反转反转 Avoid priority inversion by keeping all threads waiting for same resource Avoid priority inversion by keeping all threads waiting for same resource

at the same priorityat the same priority

Thread 3

High Priority

Medium Priority

Low Priority

Thread 3Resource Owner:

Thread 2

Thread 1

Thread 1

PriorityInversion

Preempt

Preempt

Blocked

PriorityRestored

Thread 3

Example: Thread 1 blocked waiting for resource owned by Thread 3, causing Priority Inversion

Thread 3 BlockedThread 1

Thread 2 Blocked

Page 28: 2.2   进程和线程与调度

Thread APIThread API线程创建

CreateThread – 创建一个普通优先级的线程线程优先级

GetThreadPriority – 当前线程的优先级 SetThreadPriority – 改变当前线程的优先级 (251) CeGetThreadPriority – 得到当前线程的优先级 CeSetThreadPriority – 改变当前线程的优先级

线程睡眠 Sleep(0) – 放弃剩余的时间片 Sleep (n) – 睡指定的毫秒 Sleep (INFINITE) – 使当前线程一直睡眠 SleepTillTick – 睡到下一个时钟嘀嗒 SuspendThread – 增加线程的挂起计数 ResumeThread – 减少线程的挂起计数