• 第四章 线程、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对比表





    原创不易,转载请注明出处,谢谢
  • 相关阅读:
    转发:招聘一个靠谱的 iOS
    转发:经典面试题
    APP上架证书无效:解决
    转发:Xcode插件
    Alcatraz:插件管理
    类似禅道的多条件搜索功能,比如或者并且和模糊查询和指定查询,见下图吧
    关于angularjs中,数据模型被改变,页面不刷新的解决办法
    angluar1+ionic详情页返回在原来的位置(缓存数据和页面高度)
    unable to resolve module react-native-gesture-handler from
    解决React Native:Error: Cannot find module 'asap/raw'
  • 原文地址:https://www.cnblogs.com/Keeping-Fit/p/14897497.html
Copyright © 2020-2023  润新知