Process

进程(process),指的是计算机中运行的一个实例。

进程是操作系统中最小的资源分配单元,接收来自 CPU 的调度。

PCB (Process Control Block)

系统中每个进程都有一个相应的 PCB,其中包含与其执行、资源需求和状态相关的信息

主要结构如下:

  • 进程 ID:PID 为 0 的是调度进程,是内核中的一部分,也称为系统进程;PID 为 1 的是 init 进程,是一个拥有超级用户权限的的用户进程;PID 为 2 的进程是页守护进程,负责支持虚拟储存系统的的分页操作。
  • 程序计数器:跟踪下一条要执行的指令的地址
  • CPU 寄存器:储存CPU 寄存器的值进行上下文切换
  • 进程状态
  • 内存管理信息:跟踪分配给进程的内存
  • IO Status:指示当前分给进程的相关IO设备
  • 会记信息:记录资源使用情况、执行时间和其他统计数据

相关状态

img

  1. new:创建进程
  2. ready:进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
  3. running:进程正在处理器上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
  4. waiting:又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。
  5. terminaated:进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。

调度

FCFS,Frist come, frist serverd

从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

SJF, shortest job frist

从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

RR, round-robin

时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

MFQ, Multi-level Feedback Queue

多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。

Priority

为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。

僵尸进程和孤儿进程

  • 僵尸进程:子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。这种情况下,子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。
  • 孤儿进程:一个进程的父进程已经终止或者不存在,但是该进程仍在运行。这种情况下,该进程就是孤儿进程。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。

Thread

也被称为轻量级进程,更加轻量。多个线程可以在同一个进程中同时执行,并且共享进程的资源比如内存空间、文件句柄、网络连接等。举例:你打开的微信里就有一个线程专门用来拉取别人发你的最新的消息。

一个进程中可以有多个线程,多个线程共享进程的方法区,但是每个线程有自己的程序计数器**、虚拟机栈 和 本地方法栈

  • 进程切换是一个开销很大的操作,线程切换的成本较低。
  • 线程更轻量,一个进程可以创建多个线程。
  • 多个线程可以并发处理不同的任务,更有效地利用了多处理器和多核计算机。而进程只能在一个时间干一件事,如果在执行过程中遇到阻塞问题比如 IO 阻塞就会挂起直到结果返回。
  • 同一进程内的线程共享内存和文件,因此它们之间相互通信无须调用内核。

TCB Thread Control Block

如同每个进程有一个进程控制块一 样,系统也为每个线程配置了一个线程控制块 TCB,将所有用于控制和管理线程的信息记录在线程控制块中。

组成包括:

  • 线程ID
  • 程序计数器
  • 状态寄存器、通用寄存器
  • 线程状态
  • 优先级
  • 线程专有储存区域
  • 信号屏蔽
  • 堆栈指针

Process 和 Thread 同步方式

  1. Mutex:互斥锁
  2. Read-Write Lock:读写锁
  3. Semaphore:信号量
  4. Barrier:屏障
  5. Event:事件

死锁

前提条件

  1. 互斥:资源非共享。
  2. 占有并且等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
  3. 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
  4. 循环等待:有一组等待进程 {P0, P1,..., Pn}, P0 等待的资源被 P1 占有,P1 等待的资源被 P2 占有,……,Pn-1 等待的资源被 Pn 占有,Pn 等待的资源被 P0 占有。

解决方法

解决死锁的方法可以从多个角度去分析,一般的情况下,有预防,避免,检测和解除四种