操作系统——进程和线程详细介绍

本文旨在研究进程和线程相关知识。

一、进程

进程有很多定义,如正在执行的程序。进程要想正确在内存中执行,则必须有下面几个部分,用来记录进程信息的进程控制块,用于保存参数的系统栈,进程程序代码和代码相关的数据。这四个部分的集合被称为进程映像。

1. 进程控制块

进程控制块由以下几个元素构成:

  • 标识符:此进程标识符pid、创建这个进程的进程的标识符ppid、用户标识符uid。
  • 处理器状态:
    • 用户可见寄存器:处于用户态的处理器执行机器语言可以访问的寄存器。
    • 控制和状态寄存器:程序计数器、条件码(最近算数或逻辑运算的结果)、状态信息(中断允许标志、异常模式)。
  • 进程控制信息:
    • 进程状态:运行态这些。
    • 优先级:相对于其它进程的优先级。
    • 调度相关信息:取决于所使用的调度算法。例如进程等待的时间总量和进程在上一次运行时执行时间总量。
    • 事件:进程在继续执行前等待的事件标识。
    • 数据结构:进程可以以队列、环或者别的结构形式与其它进程进行连接。进程控制块为支持这些结构需要包含指向其它进程的指针。
    • 进程间通讯: 与两个独立进程间的通信相关联的各种标记、信号和信息。进程控制块中维护者某些或全部此类信息。
    • 进程特权:进程根据其可以访问的内存空间以及可以执行的指令类型被赋予各种特权。此外特权还用于系统使用程序和服务的使用。
    • 存储管理:包括指向描述分配给该进程的虚拟内存空间的段表和页表的指针。
    • 资源的所有权和使用情况:进程控制的资源可以表示成诸如一个打开的文件,还可能包括处理器或其它资源的使用历史,调度器会需要这些信息。

当进程被中断时,处理器的程序计数器和寄存器会存放到进程对应位置,并且修改此进程的状态(阻塞态等)。

2. 进程创建和终止

导致进程创建的原因一般有四种:新的批处理作业、交互登录(终端用户登录到系统)、操作系统因为提供一项服务而创建、由现有的进程派生。

当一个操作系统决定创建一个进程时,可以按照以下步骤:

  1. 给新进程分配唯一标识符。此时主进程表中会增加一个新的表项。
  2. 给新进程分配空间。首先操作系统必须知道私有用户地址空间(程序和数据)和用户栈有多少空间。可以根据进程的类型使用默认值,也可以在创建的时候根据用户请求设置。如果该进程是另一个进程生成的,则父进程可以把需要的值作为请求创建的一部分给操作系统。如果有任何地址空间被新进程共享,则必须建立正确连接。最后必须给进程控制块分配空间。
  3. 初始化进程控制块。首先初始化进程标识符。之后处理器的状态信息大多数项目通常初始化为0,除了程序计数器和系统栈指针。进程控制信息部分的初始化基于标准默认值和为该进程所请求的属性。例如:进程状态默认被初始化为就绪等。
  4. 设置正确的连接。例如操作系统把每个调度队列都保存成链表,则新进程必须放置在就绪链表中。
  5. 创建或扩充其它的数据结构。

进程终止的条件就比较多,大体分为进程正常完成、错误故障、被父进程终止。

3. 操作系统的控制进程

操作系统为了管理进程和资源,必须时刻知道进程和资源的状态信息,通常使用的手段就是维护信息表。一般有:内存表、I/O表、文件表、基本进程表。

内存表用于跟踪内存和外存(虚拟内存),内存表必须包括以下信息:

  • 分配给进程的内存和外存。
  • 内存块或虚拟内存块的任何保护属性,如哪些进程可以访问某些共享内存区域。
  • 管理虚拟内存所需要的任何信息。

I/O表用力管理计算机系统的I/O设备和通道,在任何时刻,一个I/O设备是否可用,被分配给哪个特定的进程,I/O设备现在的状态、I/O传送的源和目标的内存单元。

文件表提供关于文件是否存在,文件在外存中的位置、当前状态和其它属性的信息。

进程表

如果操作系统要管理进程,其进程至少要有一部分在内存中,当要执行该进程时,整个进程必须载入内存中或至少载入需要知道其在内存中的位置。

4. 进程切换

操作系统在某一时刻,将正在运行的进程中断,将就绪态一个进程设为运行态,就完成了一次进程切换。

何时切换进程
  • 时钟中断:操作系统确定当前进程超过了最大允许的时间,就会进行中断,将该进程切换为就绪态,调入另一个进程。
  • I/O中断:当进程进行I/O活动时,操作系统就必须决定是继续让该进程处于运行态,还是让高优先级的就绪态进程抢占这个进程。
  • 内存失效:处理器访问一个虚拟内存地址,且此地址不在内存中时,操作系统会把包含这个引用的内存块调用内存中。在发出调入内存块的I/O请求之后,操作系统可能会执行一个进程切换。
  • 陷阱:操作系统会判断陷阱是否致命,如果致命则将当前进程换到退出态,并发生进程切换。如果不致命,则操作系统的动作取决于错误的种类和操作系统的设计,是尝试恢复或通知用户。
  • 系统调用:例如用户进程使用I/O操作的指令,这个就会把用户进程置为阻塞态。
进程切换完整步骤
  1. 保存处理器上下文环境,包括程序计数器和其它寄存器。
  2. 更新当前处于运行态进程的进程控制块。包括将进程的状态改变到另一个状态(就绪态、阻塞态、就绪/挂起态、退出态)。还必须更新其它相关域,包括离家运行态的原因和记账信息。
  3. 将进程的进程控制块移到相对应的队列。
  4. 选择另一个进程执行。
  5. 更新此进程的进程控制块。
  6. 更新内存管理的数据结构,这却决于如何管理地址转换。
  7. 恢复处理器上一次运行该进程的上下文环境,如载入程序计数器等。

这些步骤都由内核进行操作,故进程切换是需要用户态切换到内核态的。

二、线程

在一个进程中,通常有一个或多个线程,每个线程有:

  • 线程的执行状态(运行、就绪等)。
  • 在未运行时保存线程的上下文,从某种意义上看,线程可以被看做进程内的一个被独立的操作的程序计数器。
  • 一个执行栈。
  • 用于每个线程局部变量的静态存储空间。
  • 与进程内其它线程共享的对进程的内存和资源的访问。

1. 线程与进程优缺点

从性能上来说:

  1. 在进程内部创建一个新线程比创建一个全新的进程要快得多。
  2. 终止一个线程要比终止一个进程快的多。
  3. 同一进程内线程切换比进程切换花费的时间少。
  4. 线程提高了不同程序间通信的效率。在大多数操作系统中,进程间通信通常需要内核的介入,以提供保护和通信所需要的机制。而线程在同一进程中共享内存和文件,所以无需调用内核。

2. 线程状态

与线程的状态不同,线程通常只有运行、就绪和阻塞三种状态,因为当挂起进程时,其内所有线程都将被换出去。

有四种线程的操作会改变线程的状态:

  • 派生:当派生一个新的进程,或进程中的线程派生一个新的线程时,会为新的线程提供指令指针和参数,新线程会拥有自己的寄存器上下文和栈空间,并被放置在就绪队列中。
  • 阻塞:当线程需要等待一个事件时,会被阻塞,同时处理器将执行另一个就绪线程(可在同一进程也可不在)。
  • 解除阻塞:当被阻塞的线程,其事件发生后,该线程会被放入就绪队列。
  • 结束:当线程完成时,其寄存器上下文和栈都会被释放。

当一个线程被阻塞时,会把其进程也阻塞吗?一般是不会的,因为不阻塞效率会更高。

3. 用户级线程

在纯粹的用户级线程软件中,线程的管理的所有工作都是应用程序完成的,全部在进程内部完成,内核是意识不到线程的存在的并会一直以进程为单位进行调度。

使用用户级线程有不少优点

  1. 因为线程的切换在进程内部完成,所以不需要从用户态去切换到内核态,节省了开销。

  2. 进程内部的线程调度方式比较自由,可以根据需要选择不同的调度算法,这样增加了自由度,而且不会干扰底层的调度程序。

  3. 用户级线程可以在任何操作系统中执行,不需要对底层内核进行修改以支持用户级线程。

当然,这样也有不少缺点

  1. 当用户级线程被阻塞的时候,整个进程都会被阻塞。
  2. 同一时间内,一个进程中,只有一个线程被执行,相当于实现了应用程序级别的到多程序设计,虽然这样会提高cpu利用率,但是如果能同时执行多个线程显然更有利。

4. 内核级线程

在一个纯粹的内核级线程中,所以管理线程的工作都是通过内核来完成。

由于所有操作都是内核完成,所以优点为:

  1. 内核可以同时把一个进程中多个线程放到多个处理器中。
  2. 如果一个进程中一个线程被阻塞,内核可以调用该进程中的其它线程。

缺点也很明显,即切换同一进程中不同线程时,也需要内核状态切换。

5. 对称多处理器

SMP是一种并行的手段。

5.1 计算机分类
  • 单指令单数据流(SISD):单个处理器,对单个内存中的数据,执行单个操作。
  • 单指令多数据流(SIMD):一个机器指令,同时控制多个处理器,每个处理器都有自己要处理的数据。每条指令由不同的处理器在不同的数据上同时执行。向量和阵列处理器都属于这一类。
  • 多指令单数据流(MISD):一系列数据放到不同处理器上,每个处理器执行不同的指令,这个结构从未实现过。
  • 多指令多数据流(MSMD):一组处理器同时在不同的数据上执行不同的指令。
5.2 并行处理器(SMP)

并行处理器中,主要分为两种,第一种是单指令多数据流的,还有一种是多指令多数据流的。

在多指令多数据流的处理器中,每个处理器都可以被看成一个独立的计算机。其间通信有的借助固定路径,则为共享内存型处理器,有的借助网络,则被称为分布式内存,即集群。

共享内存型处理器中,根据内核进程是不是固定在某一处理器上,分为主/从和对称多处理器。主/从型会导致主处理器失效,则整个系统失效。并且主处理器必须独立完成所有调度和进程管理,它可能会称为性能瓶颈。而对称多处理中,内核可以在任何处理器上执行,并且允许部分内核并行执行,但其操作系统的复杂度将非常高。

参考文献

  1. 操作系统精髓与设计原理——William Stallings
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值