\begin{align*}
& \rightarrow = {(P_i, P_j)|P_i \text{ must complete before } P_j \text{ may start}} \
& P_i \rightarrow P_j \text{ means } P_i \text{ is a direct predecessor of } P_j \text{ and } P_j \text{ is a direct successor of } P_i.
\end{align*}
$$
若一个程序由若干程序段(即操作)组成,而这些操作必须按照某种先后次序执行,这类执行过程就是程序的顺序执行。
程序执行方式
顺序执行
若一个程序由若干程序段(即操作)组成,而这些操作必须按照某种先后次序执行,这类执行过程就是程序的顺序执行
并发执行的特征
为什么引入进程?
并发执行:进程使得多个任务可以在同一时间段内交替执行,这种并发执行使得 CPU 可以在等待一个任务的 IO 操作完成时执行另一个任务,从而提高了系统的效率和吞吐量。
独立性:每个进程都有自己的私有地址空间,这意味着一个进程不能直接访问另一个进程的内存。这种内存保护机制有助于防止一个进程意外或恶意地干扰另一个进程。
简化编程模型:在没有进程的情况下,程序员必须手动管理多任务执行和资源分配。有了进程,这些任务就由操作系统自动处理,程序员可以专注于应用程序的逻辑。
资源管理:进程是资源分配和管理的基本单位。操作系统可以根据每个进程的需要和优先级分配资源,如 CPU 时间、内存空间等。
PCB 是操作系统中用于描述进程的一种数据结构,它是操作系统中最重要的数据结构之一。PCB 中包含了进程的所有信息,是操作系统对进程进行控制和管理的数据结构。它包含以下主要信息:
进程标识符 PID
进程标识符用于唯一地标识一个进程。一个进程通常有两种标识符:
处理机状态信息 Processor State Information
处理机状态信息主要是由处理机的各种寄存器的内容组成的。例如:
进程调度信息 Scheduling Information
在 PCB 中还存放一些与进程调度和进程对换有关的信息。
linux kernel sched.h task_struct
结构进程控制信息 Process Control Information
进程控制块的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位(进程)。
在进程的整个生命期中,操作系统总是通过 PCB 对进程进行控制的。所以说,PCB 是进程存在的唯一标志。
OS 是根据 PCB 来对并发执行的进程进行控制和管理的,如:
进程创建:分配进程控制块
进程调度:保存和读取进程控制块
进程撤销:回收进程控制块
进程控制 Process Control:操作系统的核心功能之一。包括进程的创建,终止,调度,状态转换,同步,通信等。进程控制一般是由 OS 内核中的一组原语来实现的。
原语 Primitive:操作系统内核或微核提供核外调用的过程或函数称为原语,其由若干条指令构成,用于完成特定功能的一段程序。原语在执行过程不允许被中断。
原子操作 Atom Operation:执行中不能被其它进程(线程)打断的操作就叫原子操作。当该次操作不能完成的时候,必须回到操作之前的状态,原子操作不可拆分。
内核 Kernel:计算机硬件的第一层扩充软件,为系统对进程控制、存储器管理等提供有效的机制。内核常驻内存,紧靠硬件,运行效率较高。在不同操作系统中,内核所包含的功能不尽相同,但一般应包含以下功能:
支撑功能:中断处理,时钟管理,原语操作
资源管理功能:进程管理,存储器管理,设备管理
进程创建原语执行的操作:
引起进程创建的主要事件
用户登录
作业调度
提供服务
应用请求
引起进程终止的事件
正常结束。
异常结束:
外界干预:外界干预并非指在本进程运行中出现了异常事件,而是指进程应外界的请求而终止运行。
进程的终止过程
引起进程阻塞的原因
进程阻塞的过程
处于运行状态的进程,在其运行过程中期待某一事件发生,如等待键盘输入、等待磁盘数据传输完成、等待其它进程发送消息,当被等待的事件未发生时,由进程自己执行阻塞原语 block,使自己由运行态变为阻塞态。可见,进程的阻塞是进程自身的一种主动行为。
block
把自己阻塞;(阻塞是主动行为)running
改为blocked
,并将 PCB 插入阻塞队列;进程的唤醒过程
当被阻塞进程所期待的事件出现时,例如,当进程提出 I/O 请求时,进程会进入到阻塞状态,但是不能让这个进程一直处于阻塞状态,等到其 I/O 操作完成时,那么系统就要采用唤醒原语 wakeup 唤醒这个处于阻塞的进程,以使它继续执行。
wakeup()
,将等待该事件的进程唤醒。(唤醒是一种被动行为)当有引起进程挂起的事件,系统利用挂起原语suspend()
将指定进程或者处于阻塞状态的进程挂起。
当有发生激活进程的事件发生,若该进程在外存中已有足够的空间时,可将在外存上处于静止就绪的进程从外存调入内存,系统利用激活原语active()
将指定进程激活
进程的挂起
当出现了引起进程挂起的事件时,系统将利用挂起原语suspend()
将指定进程挂起或处于阻塞状态的进程挂起。(挂起是主动行为)
调用挂起原语的进程只能挂起自己或其子孙进程;内核的 sleep()函数是在挂起原语的基础上利用定时器实现的。
挂起原语的执行过程
running
:将该进程的 PCB 中的现行状态由running
改为ready suspend
,设置 CPU 调度标志为真;ready
: PCB 中的现行状态由running
改为ready suspend
;blocked
:将该进程的 PCB 中的现行状态由blocked
改为blocked suspend
;Ex:请判断下列说法哪些的正确的?
- 进程可以由自己创建(❌,进程可以创建子进程,但不能自己创建自己)
- 进程可以由自己阻塞
- 进程可以由自己挂起
- 进程可以由自己激活
- 进程可以由自己唤醒
- 进程可以由自己撤消