【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet 或 .../gentleliu,文章仅供学习交流,请勿用于商业用途】
当操作系统进入多道批处理系统时代以后。一个系统中就存在多个任务,每一个任务都依照一定的算法进行调度来使用内存、cpu等共享资源。
当当中一个任务等待其它资源时,该任务能够临时睡眠,操作系统调度另外任务继续运行额,这样能够使系统资源得到最大化利用。而无需像曾经单道批处理系统那样仅仅有当一个任务完毕之后才运行下一个任务。
可是由此也引入了多任务并发的问题。
并发就是多个任务同一时候运行,在如今的一般大型应用系统中,一个功能基本有多个任务共同完毕,每一个任务相互协调。互相配合以及交换信息。如此一来,我们须要考虑并发任务的同步与相互排斥了。
所谓同步,就是一件事情须要依照先后顺序去完毕,当一个任务和还有一个任务通信时,任务A获取还有一个任务B的信息,当任务B未返回信息时,任务A持续等待,直到B返回信息回来,A再继续运行。
异步是和同步相对的一个概念,就是任务A向B请求信息时。不必等待B信息的返回,A请求完毕之后直接做下一件事情。
所谓相互排斥就是某些资源在某一时刻仅仅能由一个任务占有。在某资源被任务A占有的情况下。其它须要占有该资源的任务B必须等待,任务A使用完该资源后释放后任务B才干使用该资源。一般这种资源被称作临界资源,有的时候一段程序不同意并发运行。这段程序被称作临界区。
要解决同步相互排斥问题。 最基本的是理清楚活动者之间的同步关系, 还有某些问题中变量的相互排斥问题。我们来看看生产者消费者问题。生产者消费者问题是一个经典的进程同步问题。它描写叙述的是:
有一群生产者进程在生产产品, 并将此产品提供给消费者进程去消费。为使生产者进程和消费者进程能并发执行, 在它们之间设置有个缓冲区的缓冲池。 生产者进程可将它所生产的产品放入一个缓冲区中,消费者进程可从一个缓冲区取得一个产品消费。虽然全部的生产者进程和消费者进程都是以异步的方式执行的。但它们之间必须保持同步。即不同意消费者进程到一个空缓冲区去取产品, 也不同意生产者进程向一个已装满产品的缓冲区投放产品。
我们这样来描写叙述这个问题, 假如缓冲池中有n个缓冲区。每一个缓冲区存放一个消息,生产者和消费者进程(或线程)对缓冲区相互排斥的訪问。仅仅要缓冲池未满,生产者可将消息送入缓冲池;仅仅要缓冲池未空,消费者可从缓冲池取走一个消息。 此时生产者和消费者须要保持同步。当缓冲池为空时,生产者通知消费者不要再来取数据。当不为空时,通知消费者能够来取数据。
在linux中,实现同步与相互排斥的方法有非常多,比方信号量等,线程还有专用的线程相互排斥锁以及条件变量。本系列文章将对各种实现同步相互排斥的方法进行分析以及给出演示样例,而且大多演示样例都基于生产者消费者模型来阐述。