计算机知识宇宙
  • 介紹
  • 基础知识
    • 计算机系统
      • 进程与线程
        • 进程
        • 线程
        • 调度算法
        • 进程间通信
      • 锁
    • 计算机网络
    • 算法
  • 编程语言
    • Golang
      • 垃圾回收机制
  • 进阶实践
    • 云原生
      • 图解 Kubernetes
        • Deployment Controller 篇
        • Informer 篇(上)
        • QoS 篇
  • 附录
    • 概念
由 GitBook 提供支持
在本页
  • 状态
  • 控制结构
  • PCB 具体包含信息
  • 控制
  • 创建进程
  • 终止进程
  • 阻塞进程
  • 唤醒进程
  • 上下文切换
  • 进程的上下文切换
  • 发生进程切换的场景

这有帮助吗?

  1. 基础知识
  2. 计算机系统
  3. 进程与线程

进程

上一页进程与线程下一页线程

最后更新于4年前

这有帮助吗?

编写的代码知识存储在硬盘上的静态文件,通过编译生成二进制可执行文件,当可执行文件运行时,其会被装载进内存中,并交由 CPU 执行程序中的每一条指令,运行中的程序,就被称为「进程」。

当执行程序时,存在读取磁盘数据的情况,但是磁盘的读写速度非常慢(与 CPU 读写相比),在这个时候,如果 CPU 还在等待磁盘返回数据,那么 CPU 的利用率会非常低。

所以在进程要从磁盘读取数据时,CPU 不需要等待数据的返回,而是去执行其他的进程,而当磁盘返回数据时,向 CPU 发送中断,并继续执行这个进程。

进程1与进程2切换

多个程序、交替执行的思想,比如单核的 CPU 在某一时间,只能运行一个进程,但是在运行时会产生并行的错觉,实际上是并发。

进程的活动规律: 「运行 - 暂停 -运行」

并发与并行的区别

状态

一般来说,一个进程并不是自始至终连续不断运行的,它与并发执行中的其他进程是相互制约的。

所以一个进程在活动中至少具有三个状态:运行状态(Running)、就绪状态(Ready)、阻塞状态(Blocked)

此外,进程还有另外两只基本状态:创建状态(New)、结束状态(Exit)

另外还有一种挂起状态,表示进程没有占有物流内存空间,由于虚拟内存管理原因,进程所使用的空间可能没有映射到物理内存,而是在磁盘上,这时进程就会进入挂起状态,另外调用 Sleep 也会被挂起。

挂起状态可以分两种:

  • 阻塞挂起状态:进程在磁盘并等待某个事件的出现

  • 就绪挂起状态:进程在磁盘,但只要进入内存,立即就可执行

加上挂起状态的两种,就有了七种状态变迁:

控制结构

使用进程控制块(process control block, PCB)数据结构来描述进程。PCB 是进程存在的唯一标识,如果进程消失,则 PCB 也随之消失。

PCB 具体包含信息

进程描述信息:

  • 进程标识符:标识各个进程,每个进程都有一个唯一的标识

  • 用户标识符:进程归属用户,用户标识符主要为共享和保护服务

进程控制和管理信息:

  • 进程当前状态,如 new、ready、running、waiting、blocked 等

  • 进程优先级:进程抢占 CPU 时的优先级

资源分配清单:

  • 内存地址空间、虚拟地址空间信息,所打开文件的列表和所使用的 I/O 设备信息

CPU 相关信息:

  • CPU 中各个寄存器的值,当进程被切换时,CPU 的状态信息会保存在相应 PCB 中,以便进程重新执行时,能从断点继续执行

PCB 的组织方式

通常使用链表,把具有相同状态的进程链在一起,组成各种队列。

除了链接的组织方式,还有索引方式:将同一个状态的进程组织在一个索引表中,索引表项指向相应的 PCB,不同状态对应不同索引表。

一般还会选择链表,因为可能面临进程创建、销毁等调度导致进程状态发生变化,所以链表能够更加灵活的插入和删除。

控制

进程的创建、终止、阻塞、唤醒过程,也就是进程的控制。

创建进程

操作系统允许一个进程创建另一个进程,且允许子进程继承父进程所拥有的资源,当子进程终止时,会向父进程归还其继承的资源。同时,终止父进程也会终止其所有子进程。

创建过程:

  1. 分配唯一进程标识号,申请空白 PCB。(PCB 是有限的,若申请失败则创建失败)

  2. 为进程分配资源(若资源不足,则进入等待状态,等待资源)

  3. 初始化 PCB

  4. 如果进程的调度队列能够接纳新进程,那么将进程插入到就绪队列,等待被调度运行

终止进程

有三种方式可以终止进程:正常结束、异常结束、外界干预(信号 kill 掉)。

终止过程:

  1. 查找需要终止进程的 PCB

  2. 如果处于执行状态,则立即终止该进程的执行,将 CPU 资源分配给其他进程

  3. 如果有子进程,则终止其所有子进程

  4. 将该进程所拥有的全部资源都归还给父进程或操作系统

  5. 将 PCB 中所在队列中删除

阻塞进程

当进程需要等待某一事件完成时,它可以使用阻塞语句把自己阻塞等待。而一旦被阻塞等待,它只能由另一个进程唤醒。

阻塞过程:

  1. 查找将要被阻塞进程的 PCB

  2. 如果该进程为运行状态,则保护现场,将其状态转为阻塞状态,停止运行

  3. 将该 PCB 插入阻塞队列

唤醒进程

阻塞状态的进程由于必须等待某一事件的完成,所以决不能自己叫醒自己,需要别的进程发消息给他才行。

唤醒过程:

  1. 在该事件的阻塞队列中找到相应进程的 PCB

  2. 将其从阻塞队列中移出,并置其状态为就绪状态

  3. 将该 PCB 插入到就绪队列,等待调度程序调度

上下文切换

各个进程之间是共享 CPU 资源的,一个进程切换到另一个进程运行,称之为进程的上下文切换。

进程的上下文切换

进程是由内核管理和调度的,所以进程的切换只能发生在内核态。

进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间资源。

通常交换的信息会保存在进程的 PCB,当运行另一个进程时,会从其 PCB 取出上下文,使得进程继续执行。

进程的上下文切换是有开销的,所以我们希望它的开销越小越好。

发生进程切换的场景

  • 为了保证进程公平调度,CPU 时间被划分成时间片,将时间片轮流分配给各个进程。当进程的时间片耗尽,就会发生进程上下文切换

  • 进程在系统资源不足时(如内存资源),需要等待资源,这是发生进程上下文切换,调度其他进程运行

  • 进程通过 Sleep 主动挂起,进程重新调度

  • 发生硬件中断时,CPU 上的进程会被中断挂起,转而执行内核的中断程序服务

并发与并行
进程的三种基本状态
进程五种状态变迁
虚拟内存管理-换入换出
七种状态变迁
就绪队列和阻塞队列
进程的上下文切换