【操作系统学习笔记】线程篇

一、何为线程
  • 线程,也称为轻量级进程。是为了解决进程在一个时间只能干一件事情的弊端,而设计出来的解决方案,类比于进程的"分身"。
    • 进程中的所有线程共享该进程的状态和资源,它们驻留在同一块地址空间中,并且可以访问到相同的数据。区别在于它们执行时的上下文不一致。
    • 在线程模式下,一个进程至少有一个线程,但也可以有多个线程。
    • 进程中的每个线程都具备自己的特有的属性,例如:线程执行状态、未运行时保存的线程上下文、一个执行栈、变量的静态存储空间等。
  • 优点:响应度高、  资源共享、经济、 多处理体系结构的利用
二、多线程模型
     提供线程支持的两种方式:用户层的用户线程、内核层的内核线程。用户线程受内核支持,而无需内核管理;而内核线程由操作系统直接支持和管理。
  1. 多对一模型
    • 将多个用户级线程映射到一个内核线程。线程管理是由线程库在用户空间进行的,因而效率比较高。
    • 但是如果一个线程执行了阻塞系统调用,那么整个进程会阻塞。因而任何一个时刻只有一个线程能访问内核,多个线程不能并行运行在多处理器上。
  2. 一对一模型
    • 将每个用户线程映射到一个内核线程。
    • 在一个线程执行阻塞系统调用时,能允许另一个线程继续执行,它提供了更好的并发性。
    •  缺点:创建内核线程的开销会影响应用程序的性能,所以这种模型的绝大多数实现限制了系统所支持的线程数量。
  3. 多对多模型
    • 该模型多路复用了许多用户线程到同样数量或更小数量的内核线程上。
    • 克服了上述两种模型的缺点。
          示例图如下:
三、线程库
     Thread Library:为程序员提供创建和管理线程的API。
  • 线程库实现方法:
    1. 在用户空间中提供一个没有内核支持的库,此库的所有代码和数据结构都存在于用户空间中。调用库中的一个函数只是导致了用户空间中的一个本地函数调用,而不是系统调用。
    2. 执行一个由操作系统直接支持的内核级的库。此时,库的代码和数据结构存在于内核空间中。调用库中的一个API函数通常会导致对内核系统的调用。
  • 目前三种主要的线程库:
    • POSIX PThread
      • PThread是由POSIX标准为线程创建和同步定义的API。这是线程定义的规范而不是实现。
      • POSIX 表示可移植操作系统接口(Portable Operating System Interface ,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。
    • WIN32线程
      • 适用于Windows操作系统的内核级线程库。
    • Java线程库
      • 允许在Java程序中直接创建和管理线程,然而大多数JVM运行在宿主系统上,故Java线程API通常采用宿主系统上的线程库来实现。
四、多线程问题
  • 系统调用fork()和exec()
    1. 调用fork()后复制所有线程:在fork()后另一进程并不调用exec(),那么另一进程就应复制所有线程。
    2. 调用fork()后仅复制调用了系统调用fork()的进程:调用fork()后立即调用exec(),因为exec()参数所指定的程序会替换整个进程,故只复制调用线程比较恰当。
  • 取消
    • 线程取消(thread cancellation)是在线程完成之前来终止线程的任务。
    • 要取消的线程通常称为目标线程,目标线程的取消可在如下两种情况下发生:
      1. 异步取消(asynchronous cancellation):一个线程立即终止目标线程。
      2. 延迟取消(deferred cancellation):目标线程不断检查它是否应终止,这允许目标线程有机会以有序方式来终止自己。
  • 线程池
    • 可以用来限制在系统中并发执行的线程的数量。
    • 主要思想:在进程开始时创建一定数量的线程,并放入池中以等待工作。当服务器收到请求时,它会唤醒池中的一个线程(如果有可以用的线程),并将要处理的请求传递给它。一旦线程完成了服务,它会返回池中再等待工作。如果池中没有可用的线程,那么服务器会一直等待直到有空线程为止。
    • 线程池具有如下优点:
      1. 通常用现有线程处理请求要比等待创建新的线程要快。
      2. 线程池限定了在任何时候可用线程的数量。这对那些不能支持大量并发线程的系统很重要。
五、操作系统实例
  • Windows XP 线程
    • Win XP实现了Win32 API。一个WinXP应用程序以独立进程方式运行,每个进程可包括一个或多个线程。
    • 一个线程通常如下部分:
      1. 一个线程ID,以唯一标示线程。
      2. 一组寄存器组合,以表示处理器状态。
      3. 一个用户栈,以供线程在用户模式下运行;一个内核堆栈, 以供线程在内核模式下运行。
      4. 一个私有存储区域,为各种运行时库和DLL所用。
    • 线程上下文:寄存器组合、栈、私有存储区域。
  • Linux线程
    • Linux并不区分进程和线程,在讨论程序控制流时,通常称之为任务而不是进程或线程。

你可能感兴趣的:(线程,操作系统,进程,设计)