操作系统(4)线程及其实现

来源:互联网 发布:物流系统源码 编辑:程序博客网 时间:2024/05/20 16:40

1、在windows中,处理器的调度对象是线程,作为系统调度和分派的基本单位,线程会被频繁地调度和切换。线程是进程中能够并发执行的实体,是进程的组成部分。

线程的组成部分有:

1)线程的唯一标识符及线程状态信息。

2)未运行时所保存的线程上下文,可以把线程看作进程中一个独立的程序计数器。

3)核心栈,在核心态工作时保存参数,在函数调用时的返回地址,等等。

4)用于存放线程局部变量和用户栈的私有存储区。

2、进程可以分为两个部分:资源集合和线程集合。

进程要支撑线程的运行,为线程提供地址空间和各种资源,进程封装管理信息,包括对指令代码、全局数据、打开的文件和信号量等共享部分的管理;线程封装执行信息,包括对CPU、寄存器、执行栈(用户栈和核心栈)和局部变量、过程调用参数、返回值等私有部分的管理。

3、线程状态:

由于线程不是资源的拥有单位,挂起状态对于线程是没有意义的。进程的终止将导致其中所有线程的终止。挂起状态属于不可运行态。用户可以通过SuspendThread和ResumeThread函数来挂起和激活线程。

线程库可分为用户空间线程库和内核空间线程库,线程库实际上是多线程应用程序的开发和运行环境。

4、一个进程可以包含若干线程,这些线程有多种组织方式,一种是调度员-工作者模式,一种是组模式,一种是流水线模式。

多线程技术主要应用包括:前台和后台工作,客户-服务器应用模式,任务异步处理,用户界面设计等。

5、多线程的实现分为三类:

用户级线程ULT:由用户空间的线程库来完成,应用程序通过线程库进行设计,再与线程库连接、运行以实现多线程。

内核级线程KLT:由内核锁提供的线程API来使用线程,内核需要为进程及进程中的单个线程维护现场信息。

混合方式:一个应用程序中的多个用户级线程能分配和对应于一个或多个内核级线程,内核级线程可同时在多处理器上并行执行,且在阻塞一个用户级线程时,内核可以调度另一个线程执行。窗口系统是典型的逻辑并行性程序较高的应用。

6、进程和线程均通过对象来实现。Win32进程由三个部分组成:

虚拟地址空间描述符VAD:描述进程地址空间各部分属性,用于虚存管理。

线程块列表:包含进程中所有线程的相关信息,供调度器控制CPU的分配和回收。

对象句柄列表:当进程创建或打开对象时,将得到一个代表此对象的句柄,用于对象的访问,此列表维护进程正在访问的所有对象。

7、对象及对象管理器:

windows是一个基于对象的操作系统,用对象来表示所有系统资源,可以认为i对象类就是资源类。定义两大类对象有:

1)执行体对象:用来实现各种外部功能。

2)内核对象:对用户态代码是不可见的,仅在执行体内部创建和使用。

windows对象由对象头和对象体组成。对象头由对象管理器控制,各执行体组件控制自己创建的对象类型的对象体。每个对象头都指向打开此对象的进程列表,同时还有一个称为类型对象的特殊对象,其所包含的信息对每个对象实例是公用的。

8、句柄是一个32位二进制数,用户线程以此来引用执行体对象。对象头包含句柄引用计数,用来记录对象被引用的次数。若句柄引用次数为0,系统会释放对象。

9、进程对象:

其属性包括进程标识、访问令牌、进程基本优先级和默认的亲合处理器集合等。进程是对应于存储器、打开文件表等资源的应用程序实体。线程是执行工作时的调度单位,并且可以被中断,这样处理器可以被其他线程所占用。

1)内核进程块KPROCESS。2)进程标识符。3)配额限制。4)主存管理信息。5)工作集信息。6)虚拟主存信息。7)异常/调试端口。8)访问令牌。9)对象句柄表。10)进程环境块PEB。

10、当应用程序调用CreateProcess( )函数时,将创建一个Win32进程,创建过程在操作系统的3个部分中分阶段完成,它们是:Win32客户端的KERNEL32.DLL、Windows执行体和Win32子系统进程CSRSS。

执行步骤如下:

1)打开将在进程中执行的.exe映像文件;

2)创建Windows执行体进程对象,申请并初始化EPROCESS,创建并初始化KPROCESS和进程环境块,向进程分配地址空间;

3)创建主线程(堆栈、描述表、执行体线程对象);

4)向Win32子系统通知创建进程和线程的句柄,以便初始化新的进程或线程;

5)在新进程和线程描述表中,完成地址空间的初始化,加载所需的动态链接库;启动初始线程执行。

11、线程对象:

每个线程都由一个线程描述表来表示,在进程描述表EPROCESS的KPROCESS中包含struct LIST_ENTRY ThreadListHead域,它指向一组线程描述表,称为ETHREAD结构。

执行体线程块ETHREAD描述线程的基本属性:

1)内核线程块KTHREAD。2)进程标识和指向线程所属进程EPROCESS的指针。3)访问令牌和线程类别(客户线程或服务器线程)。4)LPC消息信息。5)I/O请求信息。

注意:应用程序调用CreateThread( )函数创建一个Win32线程的具体步骤如下:

1)在进程的地址空间中为线程创建用户态堆栈;初始化线程描述表;

2)调用NtCreateThread( )创建执行体线程对象,内容包括:增加进程中线程计数;创建并初始化执行体线程块;生成新线程ID;从非页交换区分配线程的内核堆栈;设置线程环境块TEB;设置线程的起始地址和用户指定的Win32起始地址;设置KTHREAD块;设置指向进程访问令牌的指针和创建时间;

3)通知Win32子系统已经创建新线程,以便Win32子系统设置新的进程和线程;

4)设置新线程为准备态,将其句柄和ID返回到调用进程;调用ResumeThread( ),激活线程并调度执行。 

12、线程的7种状态:

就绪态、准备态、运行态、等待态、过渡态、终止态、初始态。





0 0
原创粉丝点击