网站开发需要什么知识,成都市建设部官方网站,wordpress 教程 知乎,群辉wordpress汉化抢占式内核和非抢占式内核Linux 内核有两个空间#xff0c;一个是内核空间一个是用户空间#xff0c;如果一个进程正在内核态执行的时候#xff0c;允许内核打断他的执行#xff0c;让另一个进程执行#xff0c;那么这个内核就是可抢占式内核。还有一种情况就是#xff0… 抢占式内核和非抢占式内核Linux 内核有两个空间一个是内核空间一个是用户空间如果一个进程正在内核态执行的时候允许内核打断他的执行让另一个进程执行那么这个内核就是可抢占式内核。还有一种情况就是进程执行到内核态的时候不允许进程切换就是说一定要等到进程自己释放CPU使用权这个内核就是非抢占式内核。抢占式内核的优点非常明显就是可以优先让那些优先级大的任务先执行可以打断低优先级的进程但是缺点也比较明显就是内核抢占导致的问题就是要保护全局变量静态变量因为这些变量存在全局区很有可能被打断后导致全局变量被修改。非抢占式内核的缺点也很明显不能让高优先级进程优先执行我都拉肚子了你还不让我上厕所不得憋死我啊优点也是很明显非抢占式内核也不担心函数的可重入问题因为一个时间片只有一个进程在内核空间执行全局变量也不会被未知的纂改。非抢占式内核的任务调度逻辑抢占式内核的任务调度逻辑内核抢占的设计逻辑内核做什么事情呢内核的主要工作就是分配CPU时间给各个进程使用并执行处于就绪态的最高优先级的进程我们知道进程有三种状态一个是就绪态一个时执行态一个时阻塞态阻塞也就是睡觉了他自己没事情干了就睡觉了就绪就是早上起床去排队准备上地铁成功上了地铁其实就是进入了执行态了。Linux 的调度是基于分时技术因为CPU的时间被分成时间片给每个就绪态的进程分一个时间片调度算法不会在意那些阻塞的进程的毕竟你们都睡觉了我就不给你们准备午饭了就调度这些就绪的进程好了。那什么时候可以被调度呢中断和系统调用中断执行结束后内核调度器如果只是说内核的话有点笼统内核里面有一个调度器专门用来调度进程的这个内核调度器就去判断当前是不是需要重新调度系统调度也是一样Linux 内核有无数个系统调度函数而且系统调度会阻塞阻塞的时候CPU如果没事干会非常闲那就需要调度到其他进程上去执行。关于调度的知识后面再继续说明我们先通过CPU的调度说明一个问题因为多进程调度的原因肯定会存在一个问题就是资源竞态。什么是资源竞态呢就是有多个进程去操作一个资源可以是一个文件一个变量等待造成的结果就是不符合预期结果。什么是内核同步我们在上一章说了原子操作如果多进程对同一个资源操作就有可能造成这个变量的不确定性内核同步就是为了解决这种不确定的问题而出现的。举个例子有一个房间A里面放了一个篮球房间没有锁小明喜欢打篮球这一天他没有上课来到了A房间拿走了篮球小龙也喜欢打篮球这一天小龙也没有上课小龙也想去A房间拿篮球发现篮球没有了所以小龙就没有篮球打了小龙很生气就跟老师说为什么谁拿走了篮球也不知道被偷了都不懂为什么不给房间上个锁然后学校的老师听了小龙的建议在A房间上了个锁锁的钥匙就老师自己拿着然后又来了小明又想去A房间拿篮球这时候发现房间上锁了就只好去找老师拿钥匙小明拿了钥匙过来开锁拿走了篮球然后把A房间锁上了。这时候小龙也想去打篮球了小龙就去找老师老师说钥匙已经被小明拿走了要等小明把钥匙还回来你才可以拿到钥匙小龙就在旁边看书等着这时候小明把钥匙还回来了老师把钥匙给了小龙小龙就拿着钥匙开心的去A房间开房拿篮球了。内核同步的方法内核信号量老师突然发现我应该给那些公共场所的教室都上锁这样才能安全一些嗯就应该这么办但是电脑室有十几台电脑只配一把钥匙感觉不够用所以老师就配了和电脑数量一样的钥匙拿到钥匙的同学才可以开门进去使用电脑没有钥匙的同学要先去老师那里申请钥匙。这个就是Linux 内核里面的信号量内核信号量是一种睡眠的锁如果有一个任务试图获得一个不可用的信号量时信号量就会把这个任务放到一个等待队列里面让这个任务睡眠等这个信号量可以用后再把这个任务唤醒。信号量这个代码往上就很多了我建议大家看代码最好是直接用内核源码来看分开看很多东西都不是很明白作为一个Linux 开发者自己下载一份Linux源码应该是标配了吧毕竟是开源的。互斥锁信号量可以用很多把钥匙钥匙资源只有一个那么就只能配一把钥匙这时候就是二值信号量也叫做互斥锁。自旋锁自旋锁和上面的最大区别就是自旋锁等待的时候不会睡眠会继续使用CPU时间会不断的查询锁的状态直到获取锁所以我们如果使用自旋锁的时候应该使用在那些临界区时间片非常短的资源上要不然长时间占用CPU这是对CPU性能的一大挑战。至于这几个的代码实现方式想放到下个章节再说明我认为理解其中的原理比如何实现更加重要除了这些还有有读写锁等等技术说明适用范围每CPU变量在CPU之间复制数据结构所有CPU原子操作对一个计数器原子地“读-修改-写”的指令所有CPU内存屏障避免指令重新排序本地CPU或所有CPU自旋锁加锁时忙等所有CPU信号量加锁时阻塞等待所有CPU顺序锁基于访问计数器的锁所有CPU本地中断的禁止禁止单个CPU上的中断处理本地CPU本地软中断的禁止禁止单个CPU上的可延迟函数处理本地CPU读-复制-更新RCU通过指针而不是锁来访问共享数据结构所有CPU插播一个招聘