进程间互斥、同步

来源:互联网 发布:知道mac地址怎么查ip 编辑:程序博客网 时间:2024/06/14 14:58

进程间互斥、同步

  • 并发、并行的区别

    并发:是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为cpu要在多个程序间切换)运行多个程序。并行:是指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
  • 并发带来的问题

      1.全局资源的共享充满危险,出现读脏数据等。  2.很难对分配资源进行最优化的管理,甚至造成死锁。  3.程序错误不可再现。
  • 解决方法:

       控制对共享资源的访问
  • 基本概念

      临界资源:同一时刻,只允许一个进程(线程)访问的资源。  临界区:访问临界资源的代码段。  原子操作:不可被分割(中断)的操作。  饥饿:一个线程或是进程在无限的等待另外两个或多个线程或进程占有的但是不会往外释放的资源。  进程互斥:是指若干进程都要使用同一个资源时,任何时刻最多允许一个进程使用其他要使用该资  源的进程必须等待,直到占有资源的进程释放该资源。  进程同步:是完成统一任务的伙伴进程间因需要在某些位置上协调他们的工作或相互交换信息所产  生的进程之间的直接制约关系。  进程通信:进程协同工作时,需要互相交换信息,进程之间互相交换信息的工作称为进程通信。
  • 死锁

      1.概念:两个进程或线程以上都占有一定的资源,并且请对对方占有的资源时不释放自己手中的资源,而造成的互相等待的情况。  2.死锁产生的必要条件:          (1)互斥条件:系统中存在一个资源一次只能被一个进程所使用;          (2)非抢占条件:系统中存在一个资源仅能被占有它的进程所释放,而不能被别的  进程强行抢占;          (3)占有且等待条件:系统中存在一个进程已占有了分给它的资源,但仍然等待其  它资源;      (4)循环等待条件:在系统中存在一个由若干进程形成的环形请求链,其中的每一个进  程均占有若干种资源中的某一种,同时每一个进程还要求(链上)下一个进程所占有的资源。  3.死锁产生的原因?   系统资源不足和进程推进路径非法。   死锁产生的根本原因是系统的资源不足而引发了并发进程之间的资源竞争。由于资源总是有限的,我们不可能为所有要求资源的进程无限地提供资源。  而另一个原因是操作系统应用的动态分配系统各种资源的策略不当,造成并发进程联合推进的路径进入进程相互封锁的危险区。所以,采用适当的资源分配算法,来达到消除死锁的目的是操作系统主要研究的课题之一。  4.对待死锁,一般应考虑的问题有哪些?   死锁的预防、避免、检测和解除四个问题。
  • 解决临界区问题
    硬件:
    1.中断禁用

      通过系统对临界区进行禁用中断或者启用中断定义的原语来操作

2.机器指令

整个testset是原子操作,通过对标志值调用testset进行访问,值为0则允许进入临界区,并将值置为1,释放时再置为0,值为1则有进程在临界区中,此时不能访问。
  • 用信号量和P-V原语能方便地解决临界区问题
  1. 信号量:
    SemWait 请求资源,并进行-1操作
    SemSignal 释放资源,并进行+1操作

     S>0时,S表示可使用的资源数;或表示可使用资源的进程数。 S=0时,表示无资源可供使用;但也没有进程等待该类资源。 S<0时,|S|表示等待使用资源的进程个数;或表示等待进入临界区的进程个数。

注:等待在该信号量上的进程数与信号量的初值无关。

  1. P-V原语:
     mutex为互斥公用信号量,初值为1, 临界区的代码被置于P(mutex)、V(mutex)原语之间时,任何欲进入临界区的进程,必须 在公用信号量mutex上执行P原语,在完成对临界资源的访问后再执行V原语。 V操作的物理含义是请求一个资源,即信号量的值减1 V操作的物理含义是回收释放的一个资源,即信号量的值加1 由于mutex初值为1,当第一个进程执行P原语后减为0,表示临界资源空闲,可分配给该进程使之进入临界区,在第一个进程没有退出临界区之前,若此时第二个进程想进入临界区,也应先执行P原语。而结果是mutex变为负值,就意味着临界资源已被占用,因此,第二个进程被阻塞。直到第一个进程执行V原语,释放该临界资源mutex到0后,方可唤醒第二个进程,使之进入临界区,待它完成对临界资源的访问后,又执行V原语,使mutex恢复到初始值。