原子操作,自旋锁,互斥锁,信号量学习
来源:互联网 发布:淘宝 婚礼 成长视频 编辑:程序博客网 时间:2024/04/26 06:33
1.什么是原子操作?
2.什么是互斥锁?
互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁( lock )和解锁( unlock )。互斥锁是线程间互斥用的,一个线程占用了某一个共享资源,那么别的线程就无法访问,直到这个线程离开,其他的线程才开始可以使用这个共享资源。可以把互斥锁看成二值信号量。互斥锁只用于线程间通信。
互斥锁的操作流程如下:
1)在访问共享资源后临界区域前,对互斥锁进行加锁。
2)在访问完成后释放互斥锁导上的锁。
3)对互斥锁进行加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放。
互斥锁的数据类型是: pthread_mutex_t。
(1)自旋锁它是为为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
(2)自旋锁的一般原理:跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。由此我们可以看出,自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁可能存在两个问题:死锁和过多占用cpu资源。
(3)自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。另外格外注意一点:自旋锁不能递归使用。
4.什么是信号量?
(1)信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。
一般说来,为了获得共享资源,进程需要执行下列操作:
(1)测试控制该资源的信号量。
(2)若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
(3)若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
(4)当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
(2)信号量支持两个原子操作P()和V().
5.操作系统的PV操作
在讲这个PV操作之前,吐槽一下下!当初自己修读操作系统这门课的时候,本来有人说这门课很简单,但是当初上这门课的那位老师也是讲的太抽象了,一个学期下来都不知道他在讲啥,现在还得重新学习一遍,哎!
关于PV操作可以参考这位网友:http://blog.csdn.net/wzh402/article/details/44889671,感觉总结的不错。
关于操作系统的这几个概念暂且理解到这里,因为还没有进行实际的的代码操作,对这些概念理解的不是很深,以后有机会我将深入内核对代码进行分析,以及实际编程操作来加深这些概念的理解!
参考:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html
参考:http://blog.csdn.net/lianghe_work/article/details/47747497
- 原子操作,自旋锁,互斥锁,信号量学习
- 原子操作 信号量 自旋锁 互斥锁
- 原子操作 信号量 自旋锁 互斥锁
- 信号量、互斥锁、自旋锁、原子操作
- 原子、信号量、互斥锁、自旋锁
- 互斥体、原子操作、自旋锁、信号量
- 原子操作、信号量、读写信号量和自旋锁
- 原子操作、信号量、读写信号量和自旋锁
- 原子操作,自旋锁
- 原子操作、信号量、读写信号量和自旋锁的区别与联系
- 自旋锁、内核信号量、原子变量
- [Linux]互斥机制(中断屏蔽、原子操作、自旋锁、信号量)
- Driver:内核的竞态和并发:中断屏蔽、原子操作、自旋锁、信号量
- Linux设备驱动中的并发控制,原子打操作、自旋锁、信号量、完成量、互斥体
- Linux下原子操作(信号量 自旋锁)的实现原理和底层代码分析
- 信号量、自旋锁、互斥锁
- 自旋锁&信号量&互斥锁
- 自旋锁,互斥锁,信号量
- jeesite导入导出前端(.jsp)+controller
- 试一下
- 1010: [HNOI2008]玩具装箱toy
- python设置中文编码
- 【tree 反转二叉树 inverse binary tree】
- 原子操作,自旋锁,互斥锁,信号量学习
- android检测arp攻击
- Struts2入门(8):OSNL & 标签库
- linux利用源码安装madplay
- Complete Android Fragment & Activity Lifecycle
- 常用图像数据库
- 【二分图匹配入门专题1】B
- bootstrap轮播图简单使用,liMarquee文字跑马灯的简单使用
- Andrew Ng机器学习课程笔记--week7