linux设备驱动归纳总结(四):3.抢占和上下文切换

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

上一节介绍了进程调度的一些基本概念,并简单介绍了在没有抢占的情况下,CFS调度的是如何分配进程的优先级和时间片。但是,内核并不会只是单一地分配时间片让进程运行。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

一、什么是上下文切换

上下文切换,是指从一个可执行的进程切换到另外一个可执行的进程。在linux内核中,上下文的切换有两种方式:第一种是进程主动让出CPU,这样的操作成为“让步”。第二种是由内核调度程序决定进程运行时间,在在运行时间结束(如时间片耗尽)或者需要切换高优先级进程时强制挂起进程,这样的操作叫“抢占”。

抢占是我一直误解的概念,我一直以为抢占是一个进程强制切换到另一进程。最近才知道,执行抢占的是内核,并不是进程。

抢占分为两种:用户抢占和内核抢占。下面将一一介绍。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

二、用户抢占

如果只是靠每个进程主动放弃CPU,这是相当不明智的做法,所以,内核使用need_resched标志(在每个进程对应的thread_info结构体内)来表示进程是否需要被调度。当一个进程的时间片耗尽,或者有更高优先级的进程进入可执行队列,当前运行的进程对应的need_reched标志会被设置。

在内核即将要返回用户空间的时候,如果need_resched标志被设置,内核会在继续执行原来的进程之前调用调度程序,此时就会发生用户抢占。

要注意,用户抢占是发生在即将返回用户空间前,内核调用调度程序,重新选择一个更加合适的进程来运行(如高优先级),当然也可以是原来的程序。

总的来说,在以下情况下会发生用户抢占:

、从系统调用返回用户空间。

、从中断处理程序返回用户空间。

类比一下生活,其实这个很容易理解。如有人占用着厕所解大手时,有人进来需要解小手,或者允许他解大手的时间已经用完了,管厕所的人兄就会做个标记。等解大手的人兄冲完厕所了,管厕所的人兄看到自己做的标记,马上把解大手的人兄赶出来,把厕所让给解小手的人兄。

用户抢占并不是2.6内核的新特征,它只是一种进程调度的策略。内核返回用户空间后,每个进程有独立的4G虚拟空间,这时的进程调度并不会出现内核资源的争夺。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

三、内核抢占

内核抢占是2.6内核的新特征,在之前的内核中,调度程序是不能调度正在运行在内核中的进程,即使时间片已经用完,只有在进程返回用户空间或者阻塞,才能进行进程的调度。

在2.6内核中,内核提供了为高优先级进程抢占正在内核运行的进程的机会。但是,对于多个同时运行的进程,内核空间的资源的共享的。所以,内核在抢占并且调度进程的时候,必须要保证调度是安全的。所谓的安全,就是不会因为新进程的调度导致一些共享资源的错乱,这就是下一节要讨论的内核同步。

内核进程可以调用函数来禁止内核抢占,在禁止这段时间内,抢占是不允许的,这样也是保护内核共享资源的一种方法。

所以,内核抢占发生在以下时候:

、当终端处理程序将要执行完毕,返回内核空间之前。

、执行在可以抢占的代码的时候。

、内核进程让出CPU后,如阻塞。

生活上的例子我就不举了,描述拉到一半的过程实在恶心,有兴趣的自己联想。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

四、总结

今天介绍了抢占的概念,这些都是我的理解,并不能确保一定正确,同时我把书上这么长的介绍压缩成短短的几句话,必然有很多不足的地方,希望大家能够指正。

在很多的书籍中描述的抢占大多数都是多内核抢占,并不是说用户抢占,用户抢占可以理解为一种进程调度的方式。

而由于内核抢占的出现,内核用共享资源的保护显得尤为重要,这是因为所有的进程都进入内核运行,稍不留神就会把另一个进程的资源更改掉,下节就是要介绍如何实现内核资源的保护。

同时需要强调的是,进程调度的介绍并没有涉及中断,一般的,只要中断产生,内核就会马上相应,不管进程在内核还是用户空间,所以这也是内核资源保护的内容之一。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

【Linux开发】linux设备驱动归纳总结(四):3.抢占和上下文切换的更多相关文章

  1. 【Linux开发】linux设备驱动归纳总结(四):5.多处理器下的竞态和并发

    linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  2. 【Linux开发】linux设备驱动归纳总结(四):4.单处理器下的竞态和并发

    linux设备驱动归纳总结(四):4.单处理器下的竞态和并发 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  3. 【Linux开发】linux设备驱动归纳总结(四):1.进程管理的相关概念

    linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  4. 【Linux开发】linux设备驱动归纳总结(四):2.进程调度的相关概念

    linux设备驱动归纳总结(四):2.进程调度的相关概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  5. linux设备驱动归纳总结(四):5.多处理器下的竞态和并发【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-67673.html linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxx ...

  6. linux设备驱动归纳总结(四):4.单处理器下的竞态和并发【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-67005.html linux设备驱动归纳总结(四):4.单处理器下的竞态和并发 xxxxxxxxxx ...

  7. linux设备驱动归纳总结(四):1.进程管理的相关概念【转】

    本文转载自;http://blog.chinaunix.net/uid-25014876-id-64866.html linux设备驱动归纳总结(四):1.进程管理的相关概念 xxxxxxxxxxxx ...

  8. 【Linux开发】linux设备驱动归纳总结(六):1.中断的实现

    linux设备驱动归纳总结(六):1.中断的实现 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. 【Linux开发】linux设备驱动归纳总结(六):2.分享中断号

    linux设备驱动归纳总结(六):2.分享中断号 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

随机推荐

  1. maven打断点报错

  2. java内存区域以及GC回收

    参考资料: http://www.cnblogs.com/zhguang/p/3257367.html 概要: Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执 ...

  3. ga

    https://developers.google.com/analytics/devguides/collection/gtagjs/events ga 添加事件示例: 在代码中指定您自己的值,就可 ...

  4. noi.ac #535 生成树

    题目链接:戳我 我们考虑按照编号依次加点,然后维护一个栈. 预设生成树的颜色为color. 对于当前点x,如果它和栈首的点连边颜色相同,那么他们的连边可以作为生成树上面的边,点i已经连接,直接brea ...

  5. 灵魂拷问:Java如何获取数组和字符串的长度?length还是length()?

    限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个 ...

  6. 创建虚拟机,安装操作系统,xshell6远程链接

    一.创建虚拟机 1. 首先安装vmware,注意在安装中,下面的两项不要勾选,一路下一步 2.完成安装打开之后,创建新的虚拟机 3.虚拟机创建完成,需要改配置 4.然后设置网段 5.查看服务,在运行状 ...

  7. Spring Boot教程(三十四)使用Redis数据库(2)

    除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作.但是Spring ...

  8. 当 springboot 部署war包,tomcat报一堆无法解决的问题时

    直接打包 jar即可,这样就可以解决这些问题了.

  9. vue中如何刷新页面

    vue中刷新页面的方法 1. 不能使用 this.$router.go(0) 或者 window.reload() 不起作用还特别恶心 这个才是有效果的刷新页面,只要照图敲,就能有效果 我们在 app ...

  10. Java——重写hashCode()和euqals()方法

    1.顺序表的问题 查找和去重效率较低 对于这样的顺序表来说,如果需要查找元素,就需要从第一个元素逐个检查,进行查找.对于需要去重的存储来说,每次存入一个元素之前,就得将列表中的每个元素都比对一遍,效率 ...