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 一定要看的!!!!!
浙公网安备 33010602011771号