现代操作系统提供了一个并发控制环境,即系统中同时活动着的多个不同的进程,这些进程共享同一个CPU、内存或 I/O设备。特别是对于Linux操作系统来说,其多任务、多用户、分时实时混合的性质决定了多个进程在某种程度上彼此依赖或相互制约的关系,这些关系我们叫“并发关系”,按其性质可以分为同步(synchronization)和互斥(mutual exclusion)两类。
互斥:
由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间
竞争使用这些资源,进程的这种关系就叫做进程的互斥。
系统中某些资源一次只允许一个进程使用,称这种资源叫做临界资源或者互斥资源
临界资源:系统中同时存在有许多进程,它们共享各种资源,然而有许多资源在某一时刻只能允许一个进程使用。例如打印机、磁带机等硬件设备和变量、队列等数据结构,如果有多个进程同时去使用这类资源就会造成混乱。因此必须保护这些资源,避免两个或多个进程同时访问这类资源。我们把某段时间内只能允许一个进程使用的资源称为临界资源。
同步:对比前面的互斥概念,还有一种并发关系叫做同步,即进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。简单来说就是多个进程之间相互协作共同完成一项任务。
临界区:几个进程若共享同一临界资源,它们必须以互相排斥的方式使用这个临界资源,即当一个进程正在使用某个临界资源且尚未使用完毕时,其它进程必须延迟对该资源的操作,当使用该资源的进程释放该资源时,其它进程才可使用该资源,任何进程不能从中插进去使用这个临界资源,否则将会造成信息混乱和操作出错。我们把访问临界资源的代码段称为临界区。
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程生产者线程生产物品,然后将物品放置在一个空 缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费 者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。