第四章 线程、SMP和微内核

toc

零、进程

进程被定义成资源分配单位和被保护的单位:

  1. 存放进程映像的虚拟地址空间,资源分配的对象
  2. 受保护地对处理器、其他进程(进程间通信)、文件和I/O资源的访问

一、线程

线程概念:系统在单个进程内支持多个并发执行路径的能力

线程拥有属性

  1. 执行状态
  2. 上下文
  3. 执行栈
  4. 静态存储空间
  5. 访问进程内资源的能力

多线环境中,进程仍只有一个与之关联的进程控制块与地址空间,但是其内部的线程各自拥有独立的栈、独立的控制块TCB(用于保存寄存器值、优先级、线程相关状态信息),并且进程中所有线程共享进程的状态和资源。

线程相对于进程的优点

  1. 在已有进程中创建新线程所需的开销比创建新进程少
  2. 终止线程比终止进程效率高
  3. 同一进程内线程切换比进程切换开销少
  4. 线程间通信比进程间通信效率高(进程间通信需要内核介入来提供保护和通信的必要机制)

线程状态

线程5种基本状态:

  1. 派生 新线程产生时。新线程拥有自己的寄存器上下文和栈空间,且位于就绪队列
  2. 阻塞 等待事件时被阻塞(保存用户寄存器程序,计数器和栈指针),此时处理器执行另一个同一进程中或不同进程中的就绪线程
  3. 运行 正在运行
  4. 解除阻塞 等待的事件发生,线程转移到就绪队列中
  5. 结束,线程完成,寄存器上下文和栈被释放

用户级线程与内核级线程

用户级线程

  • 有关线程管理的所有工作都由应用程序完成,内核感觉不到线程的存在。
    • 该管理工作包括线程的销毁与创建、线程间消息与数据的传递,线程的调度、线程上下文的保存与恢复

用户级线程的优点

  1. 用户级线程间切换不需要转到内核态,节省了两次状态转换的开销(用户态到内核态,内核态回到用户态)
  2. 调度算法可以为应用程序量身定做
  3. 可以在任何操作系统中运行,而不需要修改内核

用户级线程的缺点

  1. 当一个用户级线程调用系统函数时,该进程中所有线程都被阻塞
  2. 伪并行,用户级线程不能利用多处理器技术

内核级线程

有关线程管理的所有工作全部由内核完成

内核级线程的优点

  1. 内核可以同时把同一进程中的多个线程调度到不同的处理器中,实现正真的并行
  2. 如果一个线程被阻塞,内核可以调用同一进程中的其他线程

内核级线程的缺点

  1. 把控制从一个线程转移到另一个线程时,必须经过模式切换(用户态-内核态-用户态),会产生额外的开销

二、微内核

原理:最基本的操作系统功能才放在内核中,非基本的服务和应用程序在微内核之上构造,运行在用户态
内核外部的操作系统部件,被当做服务器进程实现,通过微内核传递消息来实现相互之间的交互,微内核起着信息交互与保护的功能

微内核的优点

  1. 一致接口,不用区分内核级服务与用户级服务接口,因为所有服务都是通过消息传递提供的
  2. 可扩展性,允许增加新的服务
  3. 灵活性,可以增加新功能与删减现有功能
  4. 可移植性,大部分处理器相关代码都在微内核中,移植需要修改的地方集中
  5. 可靠性,模块化设计增强可靠性
  6. 分布式支持,通过消息传递提供服务

微内核缺点

  • 性能问题:
    1. 通过微内核构造消息、发送消息、接收应答并解码所花费的时间比一次系统调用多
    2. 当地址空间不重叠的进程之间传递消息会发生内存复制

微内核设计

微内核功能通常分为:

  1. 低级存储管理:微内核必须控制硬件概念上的地址空间,使得操作系统可以再进程级实现保护
  2. 进程间通信(IPC):微内核操作系统中进程间或线程间通信的基本形式是消息,地址空间不重叠的独立进程间消息传递设计内存间复制
  3. I/O和中断管理:内核识别中断但不处理中断,产生消息给该中断相关联的用户级进程

三、Windows线程

Windows区分进程与线程,同一进程内的多个线程可以分配给不同的处理器并且并发执行。
Windows先分配线程给处理器时,有软亲和性策略,分派器会试图把一个就绪线程指定给上一次运行它的同一个处理器,这有助于重新使用前一次执行该线程后仍处于高速缓存中的数据

四、Linux线程

老版本(2.4以前)的Linux并不区分进程与线程,任务统一由task_struct管理

图中

  • 停止态 实际是一种暂停状态,只能由另一进程恢复
  • 可中断 是一种阻塞状态,等待的是一个事件的结束、一个资源的可用或另一进程的信号。
  • 不可中断状态 是一种与可中断状态不同的阻塞状态,它在等待一个硬件条件,不会接受任何信号

Linux上的组成一个用户进程的多个用户级进程被映射到共享同一组ID的多个内核级进程上
由于Linux是通过复制当前进程的属性的方式来创建新进程的,因此他们可以共享资源,如文件、信号处理程序和虚存,当两个进程共享相同虚存时,他们可以被当做是一个进程中的线程。
当内核需要从一个进程切换到另一个进程时,会检查当前进程的页目录地址是否和即将被调度的进程相同,如果相同,那么他们是共享了同一个地址空间了的,此时的上下文切换仅仅是从代码的处跳转到另一处。
虽然同组的进程共享一个内存空间,但是他们各自拥有一个独立的用户栈。

windows与linux对比表





posted @ 2021-06-17 22:06  無雙  阅读(150)  评论(0编辑  收藏  举报