当前位置:必发365电子游戏 > 操作系统 > 会存在多个进程处于内核态的情况
会存在多个进程处于内核态的情况
2019-12-19

linux内核中有多样内核锁,内核锁的功用是:

多核微型机下,会存在多个经过处于内核态的情事,而在内核态下,进程是可以访谈具备内核数据的,因而要对分享数据开展保险,即互斥管理;

 

linux内核锁机制有信号量互斥锁自旋锁还有原子操作

 

一、信号量(struct semaphore):

是用来消除进程/线程之间的一齐和排斥难题的生龙活虎种通讯机制,是用来保管五个或三个重点代码不被冒出调用。

非确定性信号量(Saphore)由贰个值和三个指针组成,指针指向等待该非确定性信号量的进度。时限信号量的值表示相应财富的使用状态。实信号量S>=0时,S表示可用能源的数目。施行一回P操作意味着乞请分配叁个能源,因而S的值减1;当S<0时,表示早就远非可用能源,S的断然值表示近日守候该财富的进度数。乞请者必得等待其余进度释放该类能源,技术三番四次运维。而试行三个V操作意味着释放二个能源,因而S的值加1;若S<0,表示有几许进程正在守候该财富,由此要提醒三个守候意况的进度,使之运转下去。 

时域信号量是筛选睡眠的章程来对分享职业告生机勃勃段落访谈的。

相当于说功率信号量通过PV操作同步裁撤了经过/线程对临界财富选用的冲突难点;

 

二、互斥锁:(mutex_lock)

互斥锁肖似也是对线程间(不可能对进度)同步和排挤的后生可畏种另后生可畏种机制。

互斥锁越多的是重申对分享资源的锁定作用,当贰个线程占用了现阶段分享能源,使用互斥锁将其lock住之后,其余线程就无法访问,必需等到unlock之后,别的线程工夫使用分享财富里面包车型客车剧情;

 互斥锁是选项睡眠的措施来对分享职业截至访谈的。

也正是说互斥锁通过对分享财富的锁定和排挤扑灭选拔财富矛盾难点;

 

 

 三、自旋锁(spin_lock):

是为贯彻爱抚分享能源而提出后生可畏种锁机制。其实,自旋锁与排挤锁比较像样,它们皆认为着减轻对某项财富的排挤使用。无论是互斥锁,依旧自旋锁,在任哪天刻,最七只可以有三个保持者,也就说,在任曾几何时刻最六只好有五个实行单元获得锁。不过两岸在调解机制上略有两样。对于互斥锁,即使能源已经被占有,财富申请者只好步向睡眠状态。可是自旋锁不会挑起调用者睡眠,假如自旋锁已经被别的实施单元保持,调用者就径直循环在那边看是否该自旋锁的保持者已经释放了锁,"自旋"大器晚成词正是因而而得名。

 

 

四、原子操作:

Reference:

4.1、Linux原子概念:

所谓原子操作,正是“不可中断的叁个或豆蔻年华四种操作”。

原子操作,就是不能够被越来越高阶段中断抢夺优先的操作。你既然提那个题目,作者就说深一点。由于操作系统超过八分之30日子处在开中断状态,所以,贰个主次在实施的时候只怕被先行级越来越高的线程中断。而有个别操作是不能被搁浅的,不然晤面世不可能恢复的后果,那时候,这个操作就须要原子操作。便是不可能被搁浅的操作。

硬件级的原子操作:在单微处理器系统(UniProcessor)中,能够在单条指令中做到的操作都能够以为是“原子操作”,因为中断只发生在命令边缘。在多微机布局中(Symmetric Multi-Processor)就分化了,由于系统中有多个Computer独立运作,就算能在单条指令中达成的操作也是有相当大只怕面对苦闷。在X86平台湾学子,CPU提供了在指令实施时期对总线加锁的一手。CPU上有生龙活虎根钢针#HLOCK pin连到北桥,如若汇编语言的前后相继中在一条指令后边加上前缀"LOCK",经过汇编以往的机器代码就使CPU在实行那条指令的时候把#HLOCK pin的电位拉低,持续到这条指令甘休时松手,进而把总线锁住,那样相像总线上别的CPU就一时无法经过总线访问内部存款和储蓄器了,保险了这条指令在多微型机处境中的原子性。对于别的平台的CPU,完结各不相近,有的是通过关中断来达成原子操作(sparc),有的通过CMPXCHG体系的通令来落到实处原子操作(IA64)。本文首要研究X86平台下原子操作的得以完成。

 

 

4.2、Linux内核两组原子操作接口:

1、原子整数操作

原子操作常常针对int或bit类型的数额,可是Linux并不可能一向对int实行原子操作,而必须要通过atomic_t的数据布局来展开。

定义于#include<asm/atomic.h>

图片 1

图1.1      内核中的整数原子操作函数

 

2、内核中提供的片段关键位原子操作函数。同时内核还提供了生机勃勃组与上述操作对应的非原子位操作函数,名字前多两下划线。由于不保险原子性,由此进程或然施行越来越快。

定义于#include<asm/bitops.h>

图片 2

图1.2      内核中的位原子操作函数

 

 1 void atomic_set(atomic_t *v,int i);    //设置原子变量v的值为i
 2 atomic_t v = ATOMIC_INIT(0);     //定义原子变量v,并初始化为0;
 3 
 4 atomic_read(atomic_t* v);     //返回原子变量v的值;
 5 
 6 void atomic_add(int i, atomic_t* v);     //原子变量v增加i;
 7 void atomic_sub(int i, atomic_t* v);    
 8 
 9 void atomic_inc(atomic_t* v);     //原子变量增加1;
10 void atomic_dec(atomic_t* v);     
11 
12 int atomic_inc_and_test(atomic_t* v);        //先自增1,然后测试其值是否为0,若为0,则返回true,否则返回false;
13 int atomic_dec_and_test(atomic_t* v);       //先自减1,然后测试其值是否为0,若为0,则返回true,否则返回false 
14 int atomic_sub_and_test(int i, atomic_t* v);     //先减i,然后测试其值是否为0,若为0,则返回true,否则返回false;
15 //注意:只有自加,没有加操作
16 
17 int atomic_add_return(int i, atomic_t* v);   //v的值加i后返回新的值;
18 int atomic_sub_return(int i, atomic_t* v);  
19 int atomic_inc_return(atomic_t* v);     //v的值自增1后返回新的值;
20 int atomic_dec_return(atomic_t* v);    

 

实例代码:

在scull_open 函数和scull_close函数中:

如果并未有经过应用该驱动 ,原子变量值 为 1 ,将原子变量减 一 为 0 ,函数重回 true ,再 !true 为 假 ,if 里面的代码不实践这般张开了、并利用该驱动, 原子变量变为 0;

倘诺再有经过来张开驱动程序,0-1 = 负1,重回 false ,if 条件创建,运维里面包车型地铁代码,将原子变量加二回复到  0,程序重临;

最后, 在应用程序退出时 close 函数, 自增 苏醒原子变量值为 1:

 1 static atomic_t scull_available = ATOMIC_INIT(1);      //init atomic
 2 
 3 int scull_open(struct inode *inode, struct file *filp)
 4 {
 5     struct scull_dev *dev;         // device information
 6 
 7     dev = container_of(inode->i_cdev, struct scull_dev, cdev);
 8     filp->private_data = dev;         // for other methods 
 9     if(!atomic_dec_and_test(&scull_available)){
10         atomic_inc(&scull_available);
11         return -EBUSY;
12     }
13     return 0;         // success 
14 }
15 
16 int scull_release(struct inode *inode, struct file *filp)
17 {
18     atomic_inc(&scull_available);
19     return 0;
20 }

 

 

 

 

 

如上海市总计几点:

互斥锁与时域信号量的差距:

1、随机信号量日常以协作的艺术对分享财富举办调整,而互斥锁通过互斥的不二等秘书籍对分享财富对其开展支配;

2、非确定性信号量能够对进程的分享财富实行支配,而互斥锁不行;

3、时限信号量的值为非负整数,而互斥锁的值只可以为0或1;

4、互斥量的加锁和解锁必需由同一线程分别对应使用,实信号量能够由三个线程释放,另四个线程得到;

 

会存在多个进程处于内核态的情况。自旋锁与互斥锁的分别:

1、因为自旋锁不会引起调用者睡眠,所以成效比较高

2、自旋锁比较适用于锁使用者保持锁时间十分的短的情景。

3、自旋锁轻易形成死锁,所以须要安全使用它;