mutex和条件变量的区别

(新浪微博面试问了,整个人都懵了)

信号量  互斥量(mutex)   条件变量   有什么关系??

 

信号量(Semaphore)是一种 进程同步工具。

  整形信号量:  有wait 和 signal 两个原子操作。  (进程获取不到资源,就一直循环,尝试获取 )   (不会发生阻塞当前进程)

  记录型信号量:(进程获取不到资源不会一直在尝试获取,而是将进程进行阻塞,(通过调用block原语)进入到阻塞队列中,等待唤醒 )

    在整型信号量机制中的wait操作,只要是信号量 S<=0, 就会一直在while循环当中。(有一种CAS的感觉  准确说有种乐观锁的意思)

    记录型信号量机制是一种不存在 “忙等” 现象的进程同步机制,采取了 “让权等待”的策略,这时会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list, 用于链接所有的等待进程。

  ( 通过block原语进行阻塞,通过wakeup原语进行唤醒! )

  

 

                       

 

 

  AND型信号量:

    有时进程需要获取两个或更多的共享资源后才能执行后面的任务。 这时就容易出现死锁的现象,而且,进程同时要求的共享资源越多,出现进程死锁的可能就就越大。 AND型信号量,用来对多个临界资源的分配采取原子操作,要么请求的资源全部分配给请求的进程,要么一个也不分配。

  信号量集:

    用于一次获取多个单位的临界资源,即不一定是-1,而是 -n.

    

信号量有两个应用:

  1. 利用信号量实现进程互斥 

    为使多个进程能互斥的访问某临界资源,只需为该资源设置一互斥信号量 mutex,并设初始值为1.  进程在进入临界区之前,先要对mutex执行wait操作,退出临界区后,执行signal操作。

  2. 利用信号量实现前驱关系

    可利用信号量来描述程序或语句之间的前驱关系,设有两个进程 P1和P2, P1中有语句S1,P2中有语句S2. 希望在S1执行后再执行S2. 为实现这种前驱关系,可以使P1 和 P2 共享一个公用信号量S,并赋予初始为0,将 signal(S) 操作放在语句S1后面,wait(S)操作放在 S2前面。 这样就实现了,S1执行后,才能执行S2.

 

mutex (互斥信号量):

 (就是通过信号量来实现的!!!)

 

管程(monitor):  也是一种进程同步工具

(目的就是 对共享资源的所有访问访问进行同一的管理??? )

  信号量机制是一种既方便、又有效的进程同步机制,但每个要访问临界资源的进程都必须自备同步操作 wait (S)和 signal (s). 这使得大量的同步操作分散在各个进程中。

(什么意思?  什么叫自备同步操作啊???? )

  所有进程要访问临界资源时,都只能通过管程间接访问,而管程每次只允许一个进程进入管程,执行管程内的过程,从而实现了进程互斥。

  

 

条件变量:

  通过管程实现进程同步时,当某进程通过管程请求临界资源未能满足时,管程便调用 wait 原语使该进程等待,并将其排在等待队列上。当另一个线程访问完成并释放该资源之后,管程再调用 signal 原语,唤醒等待队列中的队首进程。

  ( 难道信号量不是这么做的吗???? 信号量中没有等待队列吗???)

  当一个进程获取了管程后,如果发生阻塞,那么将一直拥有管程,就会造成其它线程的长时间等待! 为了解决这个问题,引入了条件变量condition, 可以在管程中设置多个condition, 通过调用condition的wait和signal操作,来实现线程的阻塞和唤醒。阻塞后会释放管程。

 

管程和信号量的区别?

  

 

生产者消费者问题:

  通过信号量来解决:

    类似于synchronized

  通过管程解决信号量的问题:

    

 

 

 

 

 

参考文档:

 信号量与管程写的很好的文章:  https://www.cnblogs.com/binarylei/p/12544002.html      一定要看的!!!!!

 

posted @ 2020-08-06 11:04  你眼里的星辰  阅读(398)  评论(0)    收藏  举报