Skip to content

进程

进程的概念

进程的组成

  • code
  • PC
  • registers
  • data section: 全局变量(包括static)
  • heap: 动态分配的内存(如new/malloc)
  • stack: 局部变量

概念

  • 进程不等于程序(program). 进程是一个动态的概念。进程是程序的一次执行。
  • 进程包括code,data,stack,PCB
  • 多个进程可以并发执行

进程的状态

  • new: 进程还没被操作系统加载到内存
  • ready(就绪): 可以被分配到CPU上运行
  • running(运行): 在CPU上.
  • waiting(阻塞): 等待I/O
  • terminated(终止): 状态机

Example

1个处理器 OS只有运行/就绪/等待3种状态。假设10个进程并发执行,只考虑user mode,那么: 运行状态的程序 1个 就绪状态的程序 最少0(都在等待) 最多9个(有1个在运行) 等待状态的程序 最少0, 最多9

进程控制块

  • 进程标识符(pid)

Linux PCB: task_struct

进程的操作

- 从job

进程启动

每个进程有进程号pid, 父进程编号ppid。

  • init进程 pid=1,ppid=0

int pid=fork();

  • 在父进程中,fork返回子进程的pid.
  • 在子进程中,返回0
  • 如果失败, 返回负值

进程终止

系统调用exit()使得进程终止。

系统调用wait() 使当前进程进入 waiting 状态,并在任一子进程终止,或被信号停止,或被信号恢复时进入 ready 状态,同时返回发生该事件的子进程的 pid。

  • 当子进程已经终止,但父进程在忙,还没有调用 wait()这样的子进程为 僵尸进程 (zombie processes)
  • 当子进程没有结束,或者终止了但父进程没有调用 wait() 的情况下,父进程就结束了,子进程就会成为 孤儿进程 (orphan processes) 孤儿进程会被init接管作为子进程

进程调度

调度的分类

  • 作业队列(job queue): 所有提交给OS的作业(在外存)
  • 就绪队列(ready queue): 就绪,等待CPU执行的进程
  • device queue: 等待IO的进程

长程调度: 从作业队列选择作业进入就绪队列 短程调度(CPU调度): 从就绪队列选择作业执行 中程调度: 把内存中处于阻塞状态的进程换到外存上,减少内存占用

考虑 进程的状态 中的状态机

  • 非抢占式(non-preemptive)调度(图中绿色) : 只在exit和wait的时候进行调度
  • 抢占式调度(图中蓝色): 任何时候都可能进行调度。(如从job queue拿一个新进程到ready queue时,可能会把正在运行的进程中断,然后重新调度)

上下文切换(context-switch): 保存原来进程的state到PCB,从新进程的PCB加载state

评价指标

  • 运行时间burst time
  • 周转时间turnaround time=完成时间-到达时间
  • 等待时间waiting time=周转时间-运行时间

FCFS

方法:

  • 非抢占式
  • 按照进程进入就绪队列的顺序进行调度: 正在运行的进程直到阻塞或执行结束,才让出CPU。阻塞结束的进程进入就绪队列时,并不立即执行,等当前正在运行的进程。

优点:实现简单

SJF/SRTF

分为抢占式和非抢占式2种。

非抢占式:有多个进程处于就绪态时,选择需要运行时间最短的进程先运行。 缺点: 无法估计需要运行的时间

抢占式(SRTF) :总是执行 剩余运行时间最短 的进程。执行一个进程的过程中,有新进程加入就绪队列,如果新进程剩余运行时间更短,则终止当前进程。 缺点:会有饥饿(starvation)问题。抢占式SJF会导致长的任务长时间得不到运行

时间片轮转(RR)

分为长度T的时间片。每个时间片开始时取队头的进程运行,该进程最多运行时间T, 然后就被放到队尾(运行->就绪)。

不会发生饥饿现象(前提是T不能特别大)

  • T特别大,就相当于FCFS
  • T特别小,响应时间提高,但是进程间切换有开销

优先级

给每个进程一个优先级。算法类似SJF。 缺点:饥饿问题(如果新来的进程优先级特别高) 解决方法:priority aging

HRRN: 高响应比优先调度算法(Highest Response Ratio Next)响应比=作业周转时间/作业处理时间=(作业处理时间+作业等待时间)/作业处理时间

WinXP优先级调度 Scheduling Priorities - Win32 apps | Microsoft Learn

进程通信

线程

线程的概念

Warning

进程是资源分配的基本单位,线程是处理器调度的基本单位 每个线程都有它自己的PC, 寄存器和栈。线程与同一进程的其他线程共享 code section, data section, heap, open files 以及 signals。进程控制块 进程的组成

  • ​对于支持线程的操作系统,实际调度的是内核级线程而非进程
  • 一个进程中的多个线程可并发执行

Comments