Linux内核开发之并发控制(一)
1)设置位 void set_bit(nr, void *addr); //设置addr地址的第nr位,所谓设置位即将位写为1 2)清除位 void clear_bit(nr,void *addr); //清除addr地址的第nr位,所谓清除位即将位写为0 3)改变位 void change_bit(nr,void *addr); //对addr地址的第nr位反置 4)测试位 void test_bit(nr, void *addr); //返回addr地址的第nr位 5)测试并操作位 int test_and_set_bit(nr, void *addr); int test_and_clear_bit(nr, void *addr); int test_and_change_bit(nr, void *addr); 光说不练,不是好汉。这谁说的呢,咋就是记不得呢,看段代码: static atomic_t ato_avi = ATOMIC_INIT(1); //定义原子变量 static int ato_open(struct inode *inode, struct file *filp) { ... if (!atomic_dec_and_test(&ato_avi)) { atomic_inc(&ato_avi); return = - EBUSY; //已经打开 } .. return 0; //已经打开 } static int ato_release(struct inode *inode, struct file *filp) { atomic_inc(&ato_avi); return 0; } 出招表三:自旋锁。正如其名,CPU上将要执行的代码将会执行一个测试并设置某个内存变量的原子操作,若测试结果表明锁已经空闲,则程序获得这个自旋 锁继续运行;若仍被占用,则程序将在一个小的循环内重复测试这个"测试并设置"的操作.这就是自旋。 使用方法:1)spinlock_t spin; //定义自旋锁 2)spin_lock_init(lock); //初始化自旋锁 3)spin_lock(lock); //成功获得自旋锁立即返回,否则自旋在那里直到该自旋锁的保持者释放 spin_trylock(lock); //成功获得自旋锁立即返回真,否则返回假,而不是像上一个那样"在原地打转" 4)spin_unlock(lock);//释放自旋锁 自旋锁一般像下边这样使用: spinlock_t lock; spin_lock_init(&lock); spin_lock (&lock); ....//临界区 spin_unlock(&lock); 还记的前边说的第一招:中断屏蔽中致命的弱点步,自旋锁就是针对SMP或单个CPU但内核可抢占的情况,对于但CPU和内核不可抢占的系统,自旋锁退化为空操作。还有就是自旋锁解决了临界区不受别的CPU和本CPU内的抢占进程打扰,但是得到锁的代码路径在执行临界区的时候还可能受到中断和底半部的影响。 那咋办呢,天要下雨,娘要嫁人,可二郎神的就是比你孙悟空多了一变,你能咋办,打一架?打不过..所以说嘛,Linux社区的开发者们早想到了办法:在自旋锁的基础上进行衍生,具体是怎么回事,且听下回分解(每次说这句话是感觉好爽,这难道就是高手耍酷的乐趣..)..
- REDIce-Linux--灵活的实时Linux内核(11-12)
- linux文件系统基础(02-09)
- Linux标准趋向统一(11-12)
- linux基础技术(02-09)
- LINUX的目录树(02-09)
- 在Windows下启动Linux(02-09)