我正在进行与IPC相关的实验,特别是Mutex、Semaphore和Spin Lock。
我学到的是,Mutex用于异步锁定(根据我在网上读到的理论),是伴随着休眠机制的;Semaphore是同步锁定(伴随着信号和休眠)机制;而Spin Locks是同步但非休眠机制。
有没有人能帮我深入澄清这些问题?还有另一个疑问是关于Mutex,当我用线程和Mutex编写程序时,当一个线程正在运行时,另一个线程不处于休眠状态,而是不断尝试获取锁。这样,Mutex是休眠还是非休眠的?
我正在进行与IPC相关的实验,特别是Mutex、Semaphore和Spin Lock。
我学到的是,Mutex用于异步锁定(根据我在网上读到的理论),是伴随着休眠机制的;Semaphore是同步锁定(伴随着信号和休眠)机制;而Spin Locks是同步但非休眠机制。
有没有人能帮我深入澄清这些问题?还有另一个疑问是关于Mutex,当我用线程和Mutex编写程序时,当一个线程正在运行时,另一个线程不处于休眠状态,而是不断尝试获取锁。这样,Mutex是休眠还是非休眠的?
首先,需要记住这些“同步对象”的目标:
这些对象旨在为同一进程或不同进程中的多个线程之间提供高效且协调一致的共享数据的使用。
这些对象可以被“获取”或“释放”。
就是这样了!!!故事结束了!!!
现在,如果有帮助的话,让我加点料:
1) 临界区(Critical Section)= 用户对象,用于允许来自许多其他线程的一个活动线程(在同一进程内)执行,其它未被选择的线程(@获取此对象)则被置于睡眠状态。
[没有进程间能力,非常原始的对象]。
2) 互斥量信号量(Mutex Semaphore,又称Mutex)= 内核对象,用于允许来自许多其他线程的一个活动线程(在同一进程内或在不同进程之间)执行,其它未被选择的线程(@获取此对象)则被置于睡眠状态。该对象支持线程所有权、线程终止通知、递归(同一线程的多个“获取”调用)和“优先级反转避免”。
[进程间能力,使用非常安全,是一种“高级”的同步对象]。
3) 计数信号量(也称为信号量) = 内核对象,用于允许在同一进程或不同进程中的许多其他活动线程组中执行线程组。 其他未被选中的线程(在获取此对象时)将被置于休眠状态。
[然而,跨进程的能力不太安全,因为它缺少以下“互斥”属性:线程终止通知,递归?,“优先级反转避免”?等等]。
4) 现在,谈论“自旋锁”,首先是一些定义:
关键区域 = 2个或多个进程共享的内存区域。
锁定 = 值允许或拒绝进入“关键区域”的变量。 (它可以实现为简单的“布尔标志”)。
忙等待 = 不断测试变量,直到出现某个值。
最终:
自旋锁(也称为自旋锁) = 使用忙等待的锁定。 (通过xchg或类似的原子操作获得锁定)。
[没有线程睡眠,通常仅在内核级别使用。 对于用户级代码效率低下]。
最后一点评论,我不确定,但我可以打赌上面的前三个同步对象(#1,#2和#3)将其作为实现的一部分使用该简单的机制(#4)。
祝您有美好的一天!
参考文献:
-《嵌入式系统实时概念》著者:Qing Li, Caroline Yao(CMP Books)。
-《现代操作系统》第3版作者:Andrew Tanenbaum(Pearson Education International)。
-《为Microsoft Windows编写应用程序》第4版著者:Jeffrey Richter(Microsoft Programming Series)。
这里有一个关于信号量和互斥锁之间区别的很好的解释:
http://blog.feabhas.com/2009/09/mutex-vs-semaphores-–-part-1-semaphores/
简单来说,至少对于二进制信号量来说,它与所有权有关,但我建议您阅读整篇文章。