前言
线程相对进程来说,系统开销较低,线程的上下文只包含一个堆栈、一个寄存器组和一个优先权。线程共享进程的数据片段、资源。
1、多线程处理
每个线程执行进程的程序代码。进程指令可分解或分组成子任务,可以异步执行。每个线程的程序计数器跟踪执行下一条指令。
2、线程与进程的相似处
线程和进程都有ID、寄存器组、状态以及优先权。它们与之关联的信息块,称为线程块和进程信息块。线程和子进程共享父进程资源。它们分别是独立的实体,竞争使用处理器。它们在创建后可以更改属性,创建新资源。都不能直接访问其它无关线程和进程的资源。
3、线程与进程不同处
主要不同:线程没有自己的地址空间。如果进程创建多个线程,所有线程将包含在线程的地址空间。因此,所有线程非常容易共享资源,以及访问进程内存。父和子进程必须使用进程间通信机制,同一进程的线程通过读取和写入数据到进程变量来通信。子进程对其它子进程不施加控制,进程的线程视为同位体,并对进程的其它线程进行控制。子进程不能对父进程施加控制,进程的所有线程都可以对主线程进行控制,并因此影响到整个进程。
4、线程的优点
进程有许多并发子任务,多线程可以提供子任务并发执行,产生的线程上下切换所需系统资源较少,所需时间较少(不同进程间的线程发生上下文切换,将产生进程上下文切换)。
多线程可以增加应用程序吞吐能力。每个线程可以异步执行,不会发生进程停止运行或等待。
线程不需要子任务间特殊的通信机制。这节省了系统资源。
5、线程的缺点
线程易于访问进程的内存,但线程需要同步并发访问内存。
把任务分解成多线程,一个线程可能产生影响其它线程的不良数据。不良数据可能影响进程的所有数据。
进程更独立。线程依赖于所属进程,不能退出到创建它的进程之外。进程可以保护资源不被其它进程随意访问,线程与进程中的所有线程共享资源。
6、线程类型
线程策略:
1)休眠和单步
休眠线程在系统某事件发生前一直挂起。单步线程其实也是休眠线程的特例。
2)先占工作
某个任务被请求执行前执行时就使用先占工作策略。对情况进行估计,并先执行一些动作。先占工作策略促进使用永不等待规则。永不等待规则目的是阻止非激活。这一规则表明预先执行一个可能不被使用的任务比空闲要好。
3)延迟工作
线程可以将任务推迟或延迟到将来某个时间执行的另一个线程。进行延迟的线程可以晚些执行,因为它不是关键性任务。这一线程的优先权可以为低级别。
7、线程相关信息
线程相关信息保存在线程信息块结构中。结构包含以下信息:指向线程异常处理器头的指针、线程的堆栈基和大小、线程ID以及调用线程的优先权。
在Win32环境中,线程具有一个模拟线程环境的结构,包括唤醒标记、线程的消息队列、虚拟化输入队列以及其它变量。唤醒标记在挂起线程接收到一条必须处理的消息时由系统设置。
POSIX环境有一个针对线程的属性对象,是一个属性封装体。属性对象可与一个线程关联,也可与多个线程关联。属性进行线程的行为。
线程属性对象可能包含处理器信息。在对称或非对称多处理器系统中,系统返回一个特定线程处理器的亲合掩码的函数。线程亲合掩码是一个数组,其中每个位表示线程可以运行的处理器。
8、线程创建
进程的主线程由系统创建。调用线程创建函数可以创建后续线程。
pthread_create/DosCreateThread/create_thread创建线程函数。参数结构和线程ID不能是局部变量,因为调用线程可能会越出作用域。对新建线程有影响的资源:堆栈、上下文、优先权。
1) 谁可终止线程
a、线程在执行完毕返回创建函数后自动终止,释放线程资源。
b、显示调用一个线程终止函数。
c、如果终止线程为主线程,将导致进程的结束。
d、线程可以强迫出自己之外的另一个线程终止。
e、终止函数: pthread_exit、pthread_detach、pthread_cancel。
DosExit、DosKillThread。
TerminalThread、ExitThread。
2) 分离线程
分离线程为异步子进程,不继承父进程的任何属性,它们用作后台进程。
分离线程结束时,系统不保存线程ID和完成状态。
在创建线程时设置分离标志,就可创建分离线程。
3) 远程线程
在Win32环境中,一个进程中的线程创建另一个进程中的线程,这称为远程线程。
9、线程堆栈
每个线程都有自己的堆栈,它们的大小在创建时被固定。线程堆栈在进程的地址空间的堆栈片段分配。
为了防止堆栈溢出,系统在线程堆栈外部设置一个危险区、危险页或危险地带,当收到入侵时,系统得到通知,从而采取一些行动。例如警戒页。警戒页位于栈定,下方是线程的提交页(可能为多个),当入侵到警戒页时,它就下移到另一个提交页,允许堆栈增长。
10、线程控制
进程内的所有线程对资源有相同的访问权限,相互间施加同等控制。线程能够访问其它线程打开或创建的资源。线程可创建或销毁其它线程。
1) 临界区
临界区是一个控制机制,用于控制线程访问内存的权限。进入临界区的线程访问所有线程的共享内存时,阻止其它线程访问共享内存中的共享、可修改的数据。
2) 挂起和恢复线程
线程可以挂起进程内另一个线程的执行。挂起线程直到调用恢复它的函数才会执行。
线程可以在指定时间内挂起自身。
11、线程优先权
系统从就绪队列选择最高优先权的线程优先执行。就绪队列用一个有序列表来组织,其中每个元素位于一个优先级。列表中的每个优先级是一个具有相同优先级的线程队列,它们使用循环规划分配给处理器。
改变线程优先权:
为了避免线程的饥饿,需要使用动态优先权机制的系统对这种情况和系统中的其他变化作出反应。
1) 线程的优先级和优先权
线程的优先权包括优先级和优先类。线程的优先类由所属进程的优先类决定。新线程的优先级从创建它的线程继承。每个优先类有个级范围。OS/2环境由32级;Win32环境,最高优先级有16~32级,其他类有0~15级;
线程的优先权称为线程的基优先权。当线程优先权的级别提升或降低时,基优先权加上一个正值或负值。
2) 提升线程优先权
正与用户交互的进程看做前台进程,其他的所有进程都是后台进程。前台进程应当能得到充足的处理时间,让系统对用户作出响应。前台进程的优先权比后台进程的优先权高,总是能得到优先处理。如果后台进程变成前台进程时,该进程的线程将被提升。
线程的优先权有时也可能受线程执行的干扰。当一个低优先权线程锁定一个较高优先权线程所需的资源时就发生优先权倒置。解决方法是通过提高锁定资源的线程的优先权,使它能执行、释放锁定的资源。
3)优先权原则
大部分用户进程和线程归入普通和常规优先权之列。在OS/2和Win32环境中设置优先权的推荐值。
12、线程状态
线程状态有执行、就绪、阻塞等状态,伴随有分派、唤醒、阻塞过程。准备好的线程进入就绪队列;从中取出一个就绪线程进入处理器,从而进入执行状态;如果线程因等待某事件的发生,进入阻塞状态。在状态切换过程中,可能发生线程上下文或进程上下文。
具有多线程的进程的状态,由线程状态决定。只有进程的所有线程都阻塞时,进程则阻塞,否则进程是激活的。
13、线程与资源
在进程内、系统内线程要竞争使用资源,如文件描述符、内存、处理器等。
14、线程的实现模型:用户级线程
三种线程实现:一种用户级线程,一种核心级线程,一种以上两种的混合线程。用户级线程由线程库管理。这类线程包在操作系统上层运行。对于操作系统,用户级线程不可见。
用户级线程具有多对一的线程关系。这种线程包开销低,因为线程不由操作系统管理。
1、核心级线程
核心级线程有操作系统管理。进程可以有多个线程,它们对于核心是可见的。每创建一个核心线程,都会存在一个创建核心线程的系统调用。这是一种一对一的线程关系。开销比用户级线程大。核心线程可以通过多个处理器使用系统,可以分配给不同的处理器。
2、混合线程
结合用户级线程和核心级线程的优点可以得到混合线程方式。混合线程被看做一个用户级线程,但被映射到核心级实体。与核心级线程不同,只创建必需数量的核心线程。可能许多线程被请求,但只能创建当前激活的线程。创建一个线程池从一个线程到另一个线程的模拟切换。线程库实际决定需要多少核心实体。
阅读(1650) | 评论(0) | 转发(0) |