操作系统精髓与设计原理学习笔记四:线程

一、进程和线程:

这里所说的进程个概念要比前面给出的更复杂和精细。实际上,它包含两个独立的概念:一个与资源管理权有关(进程),一个与执行相关(线程)

资源所有权:一个进程包括一个存放进程映像的虚拟地址空间;进程映像是程序、数据、栈和进程控制块中定义的属性的集合。一个进程总是拥有对资源的控制或所有权,这些资源包括内存,IO通道,IO设备和文件等。操作系统提供保护功能。以防止进程之间发生不必要的与资源相关的冲突。

调度执行:一个进程沿着 可以通过一个或多个程序的路径 执行,其执行过程可能与其他进程的执行过程交替进行。因此,一个进程具有一个执行状态(运行就绪等)和一个被分配的优先级,它是一个可被操作系统调度和分派的实体。

为了区分以上两点,分派的单位通常称为线程轻量级进程,而拥有资源所有权的单位通常称为进程任务

1,、多线程:

多线程是指操作系统在当进程内支持多个并发执行路径的能力。(Java运行时环境是单进程多线程的一个例子)。

在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位,与进程相关联的有:存放进程映像的虚拟地址空间;受保护的对处理器,其他进程,文件和IO资源的访问。

在一个进程中,可能有一个或多个线程,每个线程有:线程执行状态(运行、就绪等);在未运行时保存的线程上下文;一个执行栈;用于每个线程局部变量的静态存储空间,与进程内其他线程共享的对进程的内存和资源的访问。

单线程单进程模型中(没有明确的线程概念):进程的表示包括它的进程控制块用户地址空间,以及在进程执行中管理调用/返回行为的用户栈内核栈。当进程正在运行时,处理器寄存器将被该进程控制;当进程不运行时,这些处理器寄存器中的内容将被保存。

多线程环境中:进程仍然只有一个与之关联的进程控制块用户地址空间。但是每个线程都有一个独立的栈,还有独立的线程控制块(用于包含寄存器值、优先级和其他与线程相关的状态信息)。

进程中的所有线程共享该进程的状态和资源,他们驻留在同一块地址空间中,并且可以访问到相同的数据。当一个线程改变了内存中的一个数据项时,其他线程在访问这一数据项时能够看到变化后的结果。

线程的优点:

在一个已有进程正创建一个新线程比创建一个全新进程所需的时间要少许多;

终止一个线程比终止一个进程花费的时间少;

同一进程内线程间切换比进程间切换花费的时间少;

线程提高了不同的执行程序间通信的效率。独立进程间的通信需要内核的介入,以提供保护和通信所需要的机制;但是,由于在同一个进程中的线程共享内存和文件,他们无需调用内核就可以相互通信。

因此,如果一个应用程序或函数被实现为一组相关联的执行单位,那么用一组线程比用一组分离的进程更有效。

在支持线程的操作系统中,调度和分派时在线程基础上完成的,因此大多数与执行相关的信息可以保存在线程级的数据结构中。但是,有些活动影响着进程中的所有线程,操作系统必须在进程一级对他们进行管理。

2、线程功能特性

和进程一样,线程具有执行状态,且可以互相之间进行同步。

线程的关键状态有运行态、就绪态和阻塞态。一般来说,挂起态对线程没有什么意义(该状态是一个进程级的概念)。特别地,如果一个进程被换出,由于它的所有线程都共享该进程的地址空间,因此他们必须都被换出。

如果一个程序在单处理器上运行,那么必须顺序的产生请求并且顺序的处理结果,但是对两个应答的等待时并发的。在单处理器中,多道程序设计使得在多个进程中的多个线程可以交替执行。

线程同步:一个进程中的所有线程共享同一个地址空间和注入打开的文件之类的其他资源。一个线程对资源的任何修改都会影响同一个进程中其他线程的环境。因此,需要同步各种线程活动,以便他们互不干涉且不破坏数据结构。

二、线程分类

线程的实现可以分为两大类:用户级线程内核级线程

1)用户级线程。

在一个纯粹的用户级线程软件中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。

任何应用程序都可以通过使用线程库被设计成多线程程序。线程库是用于用户级线程管理的一个例程包,它包含用于创建和销毁线程的代码、在线程间传递消息和数据的代码、调度线程执行的代码、以及保存和恢复线程上下文的代码。

在默认情况下,应用程序从单线程开始,并在该线程中开始运行。该应用程序及其线程被分配给一个由内核管理的进程。在应用程序正在运行(进程处于运行态)的任何时刻,应用程序都可以派生一个在相同进程中运行的新线程(派生线程是通过调用线程库中的派生例程完成的,通过过程调用,控制权呗传递给派生例程)。线程库为新线程创建一个数据结构,然后使用某种调度算法,把控制权传递给该进程中处于就绪态的一个线程。

在前一段描述的所有活动都发生在用户空间中,并且发生在一个进程内,而内核并不知道这些活动。内核继续以进程为单位进行调度,并且给该进程指定一个执行状态。

优点(相对于内核线程):

由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核态特权;

调度可以使应用程序相关的,可以做到为应用程序量身定做调度算法而不扰乱底层的操作系统调度程序;

用户级线程可以再任何操作系统中运行,线程库是一组供所有应用程序共享的应用程序级别的函数。

缺点(相对于内核线程):

当用户级线程执行一个会引起阻塞的系统调用时,不仅这个线程会被阻塞,进程中的所有线程都会被阻塞。

在纯粹的用户级线程策略中,多线程应用程序不能利用多处理技术,内核一次只把一个进程分配给一个处理器,因此一次进程中只有一个线程可以执行。

2)内核级线程。

在一个纯粹的内核级线程软件中,有关线程管理的所有工作都是由内核完成的,应用程序部分没有进行线程管理的代码,只有一个到内核线程设施的应用程序编程接口。

内核为进程及其内部的每个线程维护上下文信息。调度是由内核基于线程完成的。优势:首先,内核可以同时把同一个进程中的多个线程调度到多个处理器中;再者,如果进程中的一个线程被阻塞,内核可以调度同一个进程中的另一个线程;另外,内核例程自身也是可以使用多线程的。缺点:把控制从一个线程传送到同一个进程内的另一个线程时,需要到内核的状态转换。

3)混合方法。

在混合系统中,线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。

在混合方法中,同一个应用程序中的多个线程可以在多个处理器上并行地运行,某个会引起阻塞的系统调用不会阻塞整个进程。如果设计正确,该方法将会结合纯粹内核级线程和用户级线程的优点。

Java应用程序:Java从根本上支持线程的概念。不仅Java语言本身能够很方便地支持多线程应用程序开发,Java虚拟机也是一个多线程进程,它为Java应用程序提供调度机制和内存管理。


四、Windows7线程

Windows使用两类与进程相关的对象;进程和线程。进程是对应一个拥有内存、打开的文件等资源的用户作业或应用程序的实体;线程是顺序执行的一个科分派的工作单元,并且它是可中断的,因此,处理器可以切换到另一个线程。

一个Windows进程必须至少包含一个执行线程,该线程可能会创建别的线程。在多处理器系统中,同一个进程的多个线程可以并行的执行。

由于不同进程中的线程可能并非执行,因而Windows支持进程间的并发性。此外,同一个进程中的多个线程可以分配给不同的处理器并且同时执行。一个含有多线程的进程在实现并发时,不需要使用多进程的开销。同一个进程中的线程可以通过他们的公共地址空间交换信息,并访问进程中的共享资源,不同进程中的线程可以通过在两个进程间建立的共享内存交换信息。


五、Linux的进程和线程管理

Linux中的进程或任务由一个task_struct数据结构表示。

传统的UNIX系统支持美国之行的进程中只有一个单独的一个线程,但现代典型的UNIX系统支持一个进程中含有多个 内核级线程。

Linux提供一种不区分进程和线程的解决方案。用户级线程被映射到内核级进程上,组成一个用户级进程的多个用户级线程被映射到共享同一个组ID的多个Linux内核级进程上。这使得这些进程可以共享文件和内存等资源,使得同一组中的进程调度切换时不需要切换上下文。

当两个进程共享相同的虚存时,它们可以被当做是一个进程中的线程。

当Linux内核执行从一个进程到另一个进程的切换时,它将坚持当前进程的页目录地址是否和将被调度的进程相同。如果相同,那么它们共享同一个地址空间,所以此时上下文切换仅仅是从代码的一处跳转到代码的另一处。

虽然属于同一进程组的被克隆的进程共享同一内存空间,但它们不能共享同一个用户栈。


六、总结:

某些操作系统区分进程和线程的概念,前者涉及资源的所有权,后者涉及程序的执行,这种方法可以使性能提高、编码方便。在多线程系统中,可以再一个进程内定义多个并发线程。这可以通过使用用户级线程或内核级线程来完成。

用户级线程对操作系统是未知的,他们由一个正在进程的用户空间中运行的线程库创建并管理。用户线程是非常高效的,因为从一个线程切换到另一个线程不需要进行状态切换,但是,一个进程中一次只有一个用户级线程可以执行,如果一个线程发生阻塞,整个进程都会被阻塞。

进程内包含的内核级线程是由内核维护的。由于内核认识他们,因而同一个进程中的多个线程可以再多个处理器上并行执行,一个线程的阻塞不会阻塞整个进程,但当从一个线程切换到另一个线程时就会需要进行模式切换。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值