进程控制与原语
一、 进程的五种状态
在操作系统中,一个进程可以经历五种基本状态,这被称为进程的五种基本状态模型。这包括:
-
创建状态(Create/New):
- 进程刚刚被创建,但还未被执行。在这个状态下,操作系统正在为进程分配资源,设置进程的初始状态,并进行初始化工作。
-
就绪状态(Ready):
- 进程已经准备好运行,但还没有被调度执行。在这个状态下,进程等待分配到CPU时间,一旦获得CPU,它将进入运行状态。
-
运行状态(Running):
- 进程正在执行指令,占用CPU时间。在运行状态下,进程的代码正在被处理器执行,执行完当前的指令后,可能会继续执行下一条指令。
-
阻塞状态(Blocked/Waiting):
- 进程因等待某个事件而暂时停止执行。在阻塞状态下,进程可能在等待外部输入、等待I/O操作完成等。一旦等待的事件发生,进程将转移到就绪状态。
-
终止状态(Terminated/Exit):
- 进程已经执行完成,或者被手动终止。在这个状态下,操作系统会释放进程占用的资源,清理进程的数据结构,然后将其从系统中移除。
这五种状态构成了进程的基本生命周期。在实际系统中,进程可以在这些状态之间转换,形成进程的状态转换图。操作系统通过调度算法来管理进程的状态转换,使得系统能够高效地利用CPU资源,同时满足各个进程的执行需求
二、 进程控制 (用原语实现)
进程控制是操作系统中用于管理和控制进程的一系列操作。这些操作涵盖了进程的创建、终止、调度、同步、通信等方面
原语是一种特殊的程序,它的执行具有原子性,即这段程序的运行必须一气呵成,不能中断。
2.1 进程创建
进程创建原语是操作系统提供的一组原始的指令或函数,用于创建新的进程。这些原语通常由操作系统的内核提供,可以通过系统调用的形式供应用程序使用。
2.2 进程终止
计算机科学和操作系统领域,并没有通用的"撤销原语"(Undo Primitive)用于撤销一般的系统操作。通常,系统设计的原则之一是确保不可逆的操作能够被谨慎地执行,因为撤销操作本身也可能引入复杂性和不一致性。
2.3 进程的阻塞和唤醒
-
阻塞原语(Blocking Primitives):
-
阻塞是指将一个进程置于等待某个事件完成的状态。阻塞原语的目的是使进程暂时停止执行,直到满足某个条件。这样可以有效地避免进程的忙等待,提高系统的效率。
-
通常,阻塞原语由系统调用提供,例如:
wait()
: 进程调用该原语等待某个条件的满足,当条件满足时,进程被唤醒。sleep()
: 进程主动调用该原语来进入睡眠状态,直到被唤醒。semaphore_wait()
: 在使用信号量进行进程同步时,等待信号量的操作可以将进程阻塞。
-
-
唤醒原语(Wakeup Primitives):
-
唤醒是指从阻塞状态唤醒一个或多个进程,使其继续执行。唤醒原语用于通知系统某个事件已经发生,需要唤醒一个或多个等待该事件的进程。
-
通常,唤醒原语也由系统调用提供,例如:
signal()
: 用于向等待某个条件的进程发送信号,唤醒其中一个或所有等待的进程。notify()
: 在某些同步机制中,用于通知一个等待的进程。
-
这两个原语通常用于解决生产者-消费者问题、进程同步、资源共享等场景。通过使用阻塞和唤醒原语,操作系统能够有效地管理进程的状态转换,确保在合适的时机唤醒等待中的进程,提高系统的效率和性能。
2.4 进程的切换
上下文切换原语是一组操作或指令,用于执行上下文切换。这是操作系统中的一个关键机制,因为它允许多个进程共享 CPU 时间,实现多任务处理。以下是与上下文切换相关的一些原语:
-
保存上下文(Save Context):
- 在切换到新的进程之前,操作系统需要保存当前运行进程的上下文信息,包括寄存器的状态、程序计数器、内存映射等。这确保了在将来切换回该进程时,它可以继续执行。
-
加载上下文(Load Context):
- 在切换到新的进程时,操作系统需要加载新进程的上下文信息,将保存的状态还原到寄存器、内存等位置。这是为了确保新进程可以继续执行。
-
调度(Scheduler):
- 在上下文切换时,调度器负责选择下一个要运行的进程。这通常涉及到进程队列、进程优先级、时间片等调度策略。
-
原子操作(Atomic Operation):
- 上下文切换通常涉及多个步骤,为了确保操作的原子性,可能需要使用原子操作,如禁用中断或其他同步机制,以防止在切换过程中出现竞态条件。
-
切换栈(Switch Stacks):
- 在一些系统中,为每个进程分配一个独立的栈。在切换进程时,操作系统可能需要切换栈,以确保正确的执行环境。
上下文切换的成本较高,因为它需要保存和加载大量的信息。因此,操作系统的设计会尽量减小上下文切换的频率。在多核系统中,可以通过并行执行多个进程来减小上下文切换的影响。上下文切换原语是操作系统内核提供的一组底层机制,对于应用程序开发者来说,这些细节通常是由操作系统自动处理的。