计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件。
操作系统是控制和管理计算机硬件和软件资源、合理的组织计算机流程以方便用户使用的程序的集合。
(1) 并发性(阻塞)。
并发性和并行性是有区别的两个不同概念。并行性是指两个或多个事件在同一时刻发生,而并发性是指两个或多个事件在同一时间间隔内发生。并发在宏观上是同时发生的,而在微观上是交替执行的。(2)共享性。 两种共享方式:互斥共享和在一段时间内同时共享
(3)虚拟性
(4)不确定性。多道程序环境下执行是以异步的方式进行,每个程序在何时执行,多个程序的执行顺序都是不确定的。
目前我们计算机都是多核单CPU 或者是多核多CPU。多核单CPU是只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。如果跑一个多线程程序,可以做到并行执行,执行速度更快,具有较高的计算能力。
进程是程序的一次执行,改程序可以和其他程序并发执行;
它是一个动态的实体,在传统的计算机设计中,进程即使基本的分配单元,也是基本的执行单元。
从上面的概念可以看出。进程主要有以下几个特点:
(1)进程是一个实体。每一个进程都有自己的地址空间,一般情况下,包括文本域 数字域和堆栈。
(2)进程是一个执行中的程序,具有独立性 并发性和动态性。
(1)进程的基本状态:
运行态:进程已经获得资源,并占有处理机,处理机正在执行该进程的程序。
阻塞态:等待态、挂起态或者睡眠态。此时程序因为某个事件而暂时不能运行。如等待IO操作
就绪态:进程等待为其分配CPU,而CPU被其他进程占用,所以暂时不能运行,
但是该进程已经具备了执行的所有条件。
运行--阻塞转换:进程出让CPU,等待系统分配资源或某些事件的发生,如等待用户输入。
运行--就绪:分配的CPU 时间片已经用完,或者在中断模式下,有更高优先级的进程进入系统。
阻塞--就绪:处于阻塞队列的进程,当其等待的事件已发生或者等到可用资源时,进入就绪列竞争CPU。
就绪--运行:进程被调用程序选中CPU。
在多道程序设计系统中,同一时刻可能有多种进程,这些进程之间存在两种基本关系:竞争关系和协作关系。
系统中多个进程之间彼此无关,它们不知道其他进程的存在,并且也不受其他进程的影响。由于多个进程共用一套计算机系统资源,因而,必然会出现多个进程竞争计算机资源的问题。由于相互竞争资源的进程并不交换信息,但是一个进程的执行会影响其他进程的执行。如果两个资源要访问同一资源,那么一个进程通过操作系统分配得到了该资源,另一个不得不等待,极端情况下,会造成被阻塞的进程永远得不到执行。
资源竞争出现的两个控制问题:
(1)死锁,一组进程获得了部分资源,还想要得到其他进程所拥有的资源,最终所有的进程都陷入死锁。
(2)饥饿,一个进程由于其他进程总是优先于它而被无限的拖延。
某些进程完成一项任务需要分工协作,由于合作的进程都是独立的以不可确定的速度执行,这就需要相互协作的进程在某些协调点协调自己的工作。当合作进程中一个到达协调点后,在尚未得到其伙伴进程发来的信息之前,阻塞自己。直到被伙伴进程唤醒。
进程的互斥是解决竞争问题的手段。进程互斥是指若干个进程要使用共享资源时,任何时刻最多允许一个进程使用,其他进程等待。直到占有资源的进程释放该资源。
注意几个名词:临界资源:称为独占资源,是指一段时间内只允许一个进程去使用的资源。
临界区:访问临界资源的代码称为临界区。
对临界区使用的必要准则:
(1)当若干个进程要求进入临界区时,应是一个进程进入临界区,他们不应该改互相等待而是谁都不能进入。
(2)一次只允许一个进程去访问临界区,其他进程互斥的访问临界区。
(3)各进程使用临界区的时间是有限的,进程必须要早有限时间内释放临界资源。
进程的同步是指两个或两个以上进程基于某个条件来协调他们的活动。
一个进程的执行依赖于另外一个进程的信息。
当一个进程没有受到另一个协作进程发来的消息是,进程会阻塞状态。
p操作和v操作是不可中断的程序段,称为原语。
P,V原语中P是荷兰语的Proberen(测试), V是荷兰语的Verhogen(增加)。
信号量是一个表示资源的实体,是一个与队列有关的整型变量,信号量只支持P操作和V操作。其具体的意义如下述代码所示:
对于value取值的说明:
当:
value >0 时:信号量可用的资源个数
value=0 时:无空闲资源,无空闲进程,正在执行一个进程;
value< 0时:value的绝对值代表使用该资源的阻塞进程的个数;
信号量分为私有信号量和公有信号量。
公有信号量:用于进程之间的互斥,初始值通常设定为1;
私有信号量:用于实现进程之间的同步,初始值设定为0或者n,允许进程对其实施P操作。
P操作代表的是对资源的申请,其伪代码如下:
V操作是释放资源的操作,其伪代码如下:
在并发程序中,有进程A B C 执行打印作业,但是我们拥有的打印机台数为1台,若各进程竞争使用打印机,会造成的作业的错误,因此,必须使用进程互斥的手段来解决进程竞争的状态。设定 semaphor S=1 (代表着共享资源 打印机);利用PV操作实现进程的互斥。
————————————————
以上的PV操作实现了进程的互斥。整个过程可以很好的帮助大家理解PV操作的过程。
问题描述:
一组生产者进程和一组消费者进程共享一块初始为空,大小确定的缓冲区,只有当缓冲区没满时,生产者进程才可以把信息放入缓冲区,否则就要等待;只有缓存区不为空时,消费者进程才能从中取出消息,否则就要等待。缓冲区一次只能一个进程访问(临界资源)。
(1)问题分析:假定生产者是面包店,消费者是购物的人,缓存区为放面包的盒子(资源);
(2)关系分析:生产者和消费者对于资源的访问时互斥的关系;生产者把面包放入盒子,消费者才可以去拿走面包,或者消费者拿走面包后,生产者在放入面包;生产者放面包与消费者那面包不能同时进行。
生产者与消费者是相互依赖的关系,只有生产者产面包,消费者才可以取走面包;只有消费者取走面包后,生产者才可以继续生产。
(3)信号量的设定:
semaphore empty=n;代表当前的空格子数,对于生产者来说,空格子是生产者的资源;
semaphore full =0;代表当前具有面包的盒子数量,对于消费者来说,放面包的盒子是消费者资源
这就是我们可以称为 empty 和 full 是私有信号量的原因。
semaphore mutex=1 ;代表临界区互斥信号量
生产者生产一个面包,就会给消费者一个通行证,告诉消费者,可以拿走面包;
消费者消费一个面包,就会给生产者一个通行证,告诉生产者,可以生产面包;
如果生产者进程先执行P(mutex),然后执行P(empty),消费者执行P(mutex),然后执行P(fall),这样可不可以?
设想生产者进程已经将缓冲区放满,消费者进程并没有取产品,即empty = 0,当下次仍然是生产者进程运行时,它先执行P(mutex)封锁信号量,再执行P(empty)时将被阻塞,希望消费者取出产品后将其唤醒。轮到消费者进程运行时,它先执行P(mutex),然而由于生产者进程已经封锁mutex信号量,消费者进程也会被阻塞,这样一来生产者、消费者进程都将阻塞,都指望对方唤醒自己,陷入了无休止的等待。进入死锁状态。
有关读者写着、理发师的IPC问题会在下一篇进行介绍。