4.1进程和线程
进程的两个属性:分配资源,处理机调度
资源所有权:一个进程包括一个存放进程映像的虚拟地址空间;进程映像是程序、数据、栈和进程控制块中定义的属性的集合。一个进程总是拥有对资源的控制或所有权,这些资源包括内存、I/O通道、I/O设备和文件等。操作系统总是提供保护功能,以防止进程之间发生不必要的与资源相关的冲突。
调度/执行:一个进程沿着可能通过一个或多个程序的执行路径(轨迹)执行。其执行过程可能与其他进程的执行过程交替进行。因此,一个进程具有一个执行状态和一个被分配的优先级,它是一个可被操作系统调度和分配的实体。
为了区分这两个特点,分配的单位通常称为线程或轻量级线程,而拥有资源所有权的单位通常仍称为进程或任务。
注:线程作为处理机调度的单位
进程作为分配资源(除处理机外)的单位
4.1.1多线程
单线程方法:每个进程中只有一个线程在执行的传统方法
在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。与进程相关联的有:
存放进程映像的虚拟地址空间。
受保护地对处理器、其他进程(用于进程间通信)、文件和I/O资源(设备和通道)地访问。
在一个进程中,可能有一个或多个线程,每个线程有:
线程执行状态
在为运行时保存的线程上下文;在某种意义上看,线程可被视为进程内地一个独立操作的程序计数器。
一个执行栈
用于每个线程局部变量地静态存储空间
与进程内的其他线程共享的对进程的内存和资源的访问
如图所示,在多线程环境中,进程仍然只有一个与之关联的进程控制块和用户地址空间。但是每个线程都有一个独立的栈,还有独立的控制块用于包含寄存器值、优先级和其他与线程相关的状态信息。
进程中的所有线程共享该进程的状态和资源,他们驻留在同一块地址空间中,并且可以访问到相同的数据。
因此线程相较于进程的优点:
耗时短,开销小,效率高
4.1.2线程功能特性
在支持线程的操作系统中,调度和调度是在线程的基础上进行的
处理执行的大多数状态信息都保存在线程级数据结构中
挂起进程包括挂起进程的所有线程
进程的终止终止进程中的所有线程
和进程一样,线程具有执行状态,且可以相互之间进行同步。
线程状态:线程的关键状态有运行态、就绪态和阻塞态。
有四种与线程状态改变相关的基本操作:
派生,阻塞,解除阻塞,结束
注意:如果一个被阻塞的线程阻塞了整个进程,就会丧失线程的某些灵活性和能力。
线程同步:一个进程中的所有线程共享同一个地址空间和诸如打开的文件之类的其他资源。一个线程对资源的任何修改都会影响同一个进程中的其他线程的环境。因此,需要同步各种线程的活动,以便他们互不干涉且不破坏数据结构。例如:如果两个线程都试图同时往一个双向联编中增加一个元素,则可能会丢失一个元素或者破坏链表结构。
4.2线程分类
4.2.1用户级和内核级线程
线程的实现可以分为两大类:用户级线程(User-Level Thread,ULT)和内核级线程(Kernel-Level Thread,KLT)
用户级线程:在一个纯粹的用户级县城软件中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。
内核继续以进程为单位进行调度,并且给该进程指定一个执行状态(就绪、运行、阻塞)下面的例子阐述线程调度和进程调度的关系。
假设进程B在它的线程2中执行,进程和作为进程的一部分的两个用户级线程的状态如图a所示,则可能发生以下任何一种情况:
1.线程2中执行的应用程序代码进行系统调用,阻塞了进程B,例如,进行一次I/O调用。这导致控制转移到内核,内核启动I/O操作,把进程B置于阻塞状态,并切换到另一个进程。在此期间,根据线程库维护的数据结构,进程B的线程2仍处于运行状态。值得注意的是,从在处理器上执行的角度看,线程2实际上并不处于运行态,但是在线程库看来,它处于运行态。
2.时钟中断把控制传递给内核,内核确定当前正在运行的进程B已经用完了它的时间片。内核把进程B置于就绪态并切换到另一个进程。同时,根据线程库维护的数据结构,进程B的线程2仍处于运行态,相应的状态图如c所示
3.线程2运行到需要进程B的线程1执行某些动作的一个点。此时,线程2进入阻塞态,而线程1从就绪态转换到运行态。进程自身保留在运行态。相应的状态图如图d
用户及线程的优点:
1.线程切换不需要内核态特权,因此进程不需要为了线程管理而切换到内核态,节省了两次状态转换的开销
2.调度可以是应用程序相关的
3.用户级线程可以在任何操作系统中运行
缺点:
1.当用户级线程执行一个系统调用时,不仅这个线程会被阻塞,进程中的所有线程都会被阻塞
2.内核一次只把一个进程分配给处理器,因此一次进程中只有一个线程可以执行。
内核级线程:在一个纯粹的内核级线程软件中,有关线程管理的所有工作都是由内核完成的,应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口(API)
内核级线程的优点:
内核可以在多个处理器上同时调度来自同一进程的多个线程
如果进程中的一个线程被阻塞,内核可以调度同一进程的另一个线程
内核例程自身也是可以使用多线程的。
内核级线程的缺点:
再把控制从一个线程传送到同一个进程内的另一个线程时,需要到内核的状态切换。
混合方法:
4.2.2其他方案
4.3多核和多线程
4.3.1多核系统上的软件性能
该定律中假设一个程序执行的时间的(1-f)部分的代码本质上是串行的,其余f部分的代码是可以被无限并行化且没有调度开销的。
。。。由于作者太懒,后续内容没有再写。