一、进程一般分为三个状态:运行态、就绪态和阻塞态。三种状态之间的相互转换以下图所示:spa
当调度程序选择了另外一个进程时,当前运行的进程由运行态转化为就绪态;指针
当调度程序选择了一个就绪状态的进程时,该进程右就绪态转化为运行态;队列
当前运行进程等待某事件时,由运行态转化为阻塞态。进程
当等待的事件发生时,由阻塞态转化为就绪态。事件
二、信号量概念:资源
信号量是最先出现的用来解决进程同步与互斥问题的机制。 同步
信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用状况。信号量S>=0时,S表示可用资源的数量。执行一次P操做意味着请求分配一个资源,所以S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其余进程释放该类资源,才能继续运行。而执行一个V操做意味着释放一个资源,所以S的值加1,若此时S<=0,表示有某些进程正在等待该资源,所以要唤醒一个等待状态的进程,使之运行下去。请求
注意,信号量的值只能由PV操做来改变。程序
三、关于PV操做容易产生的一些疑问:im
1,S大于0那就表示有临界资源可供使用,为何不唤醒进程?
S大于0的确表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,因此不须要唤醒。
2,S小于0应该是说没有临界资源可供使用,为何还要唤醒进程?
V原语操做的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候若是S<0,代表有进程阻塞在该类资源上,所以要从阻塞队列里唤醒一个进程来“转手”该类资源。好比,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,代表该类资源恰好用完, 当C进入时S=-1,代表有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操做,S=-1,释放该类资源,由于S<=0,代表有进程阻塞在该类资源上,因而唤醒一个。
3,若是是互斥信号量的话,应该设置信号量S=1,可是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操做使S加1,释放了资源,下一个应该可以执行,但唤醒的这个进程在执行P操做时因S<0,也仍是执行不了,这是怎么回事呢?
当一个进程阻塞了的时候,它已经执行过了P操做,并卡在临界区那个地方。当唤醒它时就当即进入它本身的临界区,并不须要执行P操做了,当执行完了临界区的程序后,就执行V操做。
4,S的绝对值表示等待的进程数,同时又表示临界资源,这究竟是怎么回事?
当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不一样状况下所表达的含义不同。当等于0时,表示恰好用完。