用户的计算任务称为作业, 程序的执行过程称作进程。进程是分配资源和在处理机上运行的基本单位。计算机系统中最重要的资源是CPU。
多个进程在活动过程中彼此间会发生相互依赖或者相互制约的关系,为保证系统中所有进程都能正常活动,就必须设置进程同步机制,它分为同步方式和互斥方式。
相互合作的进程之间往往需要交换信息, 为此, 系统要提供通信机制。 在现代计算机系统中, 又引进了线程概念。
进程定义为: 一个具有独立功能的程序关于某个数据集合的一次运行活动。 简而言之: 进程就是程序在并发环境中的执行过程。
进程的状态
- 运行状态 (Ready)
- 就绪状态 已经具备运行条件, 但因为其他进程正占用CPU, 使得它暂时不能运行而处于等待分配CPU的状态。一旦把CPU分配给它,就立即可以运行。
- 阻塞状态(Blocked)是指进程因等待某种事件发生(如等待某个输入、输出操作的完成,等待其他进程发来的信号等)而暂时不能运行的状态。
处于阻塞状态的进程尚不具备运行条件, 即使CPU空闲, 它也无法使用。
设立运行状态,以便知道哪个进程在占有CPU;
设立就绪状态, 以便有效挑选出适合运行的进程;
设立阻塞状态, 以便判定各个进程是否缺少除CPU之外的资源。

- 阻塞原语, 调用者进入睡眠; 唤醒原语(主动), 调用之后 把 其他进程唤醒.
线程
一个进程包含多个线程, 来提高程序的并行成都和系统资源的利用率。
线程必须在某个进程内执行。它所需的其他资源,如代码段、数据段、打开的文件和信号等,都由它所属的进程拥有。 线程除了自己私有的少量资源外,要共享所属进程的全部资源。
线程只作为独立调度的基本单位, 同一个进程的多个线程共享该进程的资源, 所以, 线程易于切换, 可以轻装运行。
互斥 各个进程彼此不知道对方的存在, 逻辑上没有关系, 由于竞争同一资源(打印机、文件等)而发生相互制约。
同步 各个进程不知对方的名字, 但通过对某些对象(如I/O缓冲区)的共同存取来协同完成一项任务
通信 各个进程可以通过名字彼此之间直接进行通信, 交换信息, 合作完成一项工作.
逻辑上相关的两个或多个进程为完成一项任务,通过协调活动来使用同一资源, 而产生的执行时序的约束关系, 即同步
逻辑上相互无关的两个或多个进程由于争用同一资源而发生的相互制约关系称作互斥。(由于竞争资源发生的间接关系)
- 一次仅允许一个进程使用的共享资源称为临界资源; 在每个进程中访问临界资源的那段程序叫做临界区。
原语(Primitive)
一个操作中的动作要么全做,要么全不做。(原语操作是不允许并发的) 也称 原子操作
信号量
信号量定义为一个共享的整型量, 它保存可供使用的唤醒数目。
使用方式: 当多个进程互斥进入临界区时, 需要设置一个信号量mutex, 其初值为1. 这些进程进入、使用和退出临界区的构造形式是一样的。
信号量的值与相应资源的使用情况有关。
- 当信号量的值大于0时, 表示当前可用资源的数量;
- 当信号量的值小于0时, 其绝对值表示等待使用该资源的进程个数。
生产者消费者
如果一个进程能产生并释放资源, 则该进程称作生产者; 如果一个进程单纯使用(消耗)资源, 则该进程称作消费者。
读者-写者
也是一个著名的进程互斥访问有限资源的同步问题
哲学家进餐
死锁(Deadlock)
独占资源(临界资源) : 一次只能由一个进程使用的资源。
当若干进程取得对设备、文件等资源的独占性访问权时, 就可能出现死锁。
死锁和不可抢占资源有关; 而与可抢占资源有关的潜在死锁问题可以通过在进程间重新分配资源来化解。
产生死锁的根本原因就是资源有限且操作不当。