当前位置: 首页 > 编程日记 > 正文

(转)Linux进程调度时机

转自:http://oss.org.cn/kernel-book/ch05/5.3.2.htm

调度程序虽然特别重要,但它不过是一个存在于内核空间中的函数而已,并不神秘。Linux的调度程序是一个叫Schedule()的函数,这个函数被调用的频率很高,由它来决定是否要进行进程的切换,如果要切换的话,切换到哪个进程等等。我们先来看在什么情况下要执行调度程序,我们把这种情况叫做调度时机。

Linux调度时机主要有:

1、进程状态转换的时刻:进程终止、进程睡眠;

2、当前进程的时间片用完时(current->counter=0);

3、设备驱动程序

4、进程从中断、异常及系统调用返回到用户态时;

时机1,进程要调用sleep()或exit()等函数进行状态转换,这些函数会主动调用调度程序进行进程调度;

时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4是一样的。

时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。在每次反复循环中,驱动程序都检查need_resched的值,如果必要,则调用调度程序schedule()主动放弃CPU。

时机4,如前所述,不管是从中断、异常还是系统调用返回,最终都调用ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调用调度程序。那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完。

对 于直接执行调度程序的时机,我们不讨论,因为后面我们将会描述调度程序的工作过程。前面我们讨论了时钟中断,知道了时钟中断的重要作用,下面我们就简单看 一下每个时钟中断发生时内核要做的工作,首先对这个最频繁的调度时机有一个大体了解,然后再详细讨论调度程序的具体工作过程。

每个时钟中断(timer interrupt)发生时,由三个函数协同工作,共同完成进程的选择和切换,它们是:schedule()、do_timer()及ret_form_sys_call()。我们先来解释一下这三个函数:

schedule():进程调度函数,由它来完成进程的选择(调度);

do_timer():暂且称之为时钟函数,该函数在时钟中断服务程序中被调用,是时钟中断服务程序的主要组成部分,该函数被调用的频率就是时钟中断的频率即每秒钟100次(简称100赫兹或100Hz);

ret_from_sys_call():系统调用返回函数。当一个系统调用或中断完成时,该函数被调用,用于处理一些收尾工作,例如信号处理、核心任务等等。

这三个函数是如何协调工作的呢?

前面我们看到,时钟中断是一个中断服务程序,它的主要组成部分就是时钟函数do_timer(),由这个函数完成系统时间的更新、进程时间片的更新等工作,更新后的进程时间片counter作为调度的主要依据。

在时钟中断返回时,要调用函数ret_from_sys_call(),前面我们已经讨论过这个函数,在这个函数中有如下几行:

cmpl $0, _need_resched

jne reschedule

……

restore_all:

RESTORE_ALL

reschedule:

call SYMBOL_NAME(schedule)

jmp ret_from_sys_call

这几行的意思很明显:检测 need_resched 标志,如果此标志为非0,那么就转到reschedule处调用调度程序schedule()进行进程的选择。调度程序schedule()会根据具体的标准在运行队列中选择下一个应该运行的进程。当从调度程序返回时,如果发现又有调度标志被设置,则又调用调度程序,直到调度标志为0,这时,从调度程序返回时由RESTORE_ALL恢复被选定进程的环境,返回到被选定进程的用户空间,使之得到运行。

以上就是时钟中断这个最频繁的调度时机。讨论这个的主要目的使读者对时机4有个大致的了解。

最后要说明的是,系统调用返回函数ret_from_sys_call()是从系统调用、异常及中断返回函数通常要调用的函数,但并不是非得调用,对于那些要经常被响应的和要被尽快处理的中断请求信号,为了减少系统开销,处理完成后并不调用 ret_from_sys_call()(因为很显然的,从这些中断处理程序返回到的用户空间肯定是那个被中断的进程,无需重新选择),并且,它们作的工作要尽可能少,因为响应的频率太高了。

Linux 调度程序和其他的UNIX调度程序不同,尤其是在“nice level”优先级的处理上,与优先权调度(priority高的进程最先运行)不同,Linux用的是时间片轮转调度(Round Robing),但同时又保证了高优先级的进程运行的既快、时间又长(both sooner and longer)。而标准的UNIX调度程序都用到了多级进程队列。大多数的实现都用到了二级优先队列:一个标准队列和一个实时(“real time”)队列。一般情况下,如果实时队列中的进程未被阻塞,它们都要在标准队列中的进程之前被执行,并且,每个队列中,“nice level”高的进程先被执行。

总体上,Linux 调度序程在交互性方面表现很出色,当然了,这是以牺牲一部分“吞吐量”为代价的。

转载于:https://www.cnblogs.com/yysblog/archive/2012/11/12/2766298.html

相关文章:

python 字符编码问题

字符编码 一、字符编码的演进 ASCIIGB2312 GBK1.0 GB18030Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。Unicode(统一码、万国码)规定所有的…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 6. 神经网络

Datawhale南瓜书是经典机器学习教材《机器学习》(西瓜书)的公式推导解析指南,旨在让在学习西瓜书的过程中,再也没有难推的公式,学好机器学习。 以往内容: 西瓜书公式推导讲解来了!0. 导学1. 一…

Python培训常识:Python面试中常被问到的几种设计模式要知道

学习Python技术大家都是为了日后能够找到适合自己的工作岗位,那么除了要学习好Python技术外,对于面试环节的问题也要有所了解,本期小编为大家介绍的Python培训教程就算关于Python面试中常被问到的几种设计模式,希望能够给带来帮助…

ThinkPHP 框架学习

学习内容全部参考开发手册 建议收藏网页 https://www.kancloud.cn/manual/thinkphp/1696 一、几个概念 应用:基于同一个入口文件访问的项目称之为一个应用 模块:一个应用下面可以包含多个模块。每个模块在应用目录下面都是一个独立的子目录 控制器&…

【青少年编程】【三级】克隆猫游戏

「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档&…

想转行学软件测试要注意哪些问题

软件测试的快速发展,让很多人都红了眼,大家都想转行学软件测试,那么想转行学软件测试要注意哪些问题呢?大家是否考虑过自己是否合适呢?那么我们来看看下面的介绍吧。 想转行学软件测试要注意哪些问题?据数据显示,今年毕业生首选…

SpringMVC学习二

使用POJO作为参数 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app version"3.0" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio…

使用CInternetSession和CHttpFile读取网页内容

参考网址&#xff1a;http://www.398588.com/Article/T9/78.aspx读取网页的内容可以类比本地的文件一下&#xff0c;代码如下&#xff1a;#include <afxinet.h> CString url; GetDlgItemText(IDC_EDIT1,url); CInternetSession Sess; CHttpFile*cFile (CHttp…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 7. 支持向量机

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

Python培训分享:Python发展前景怎么样?

最近学习Python技术的同学越来越多&#xff0c;大家对于Python技术比较关注的两个点&#xff0c;就是Python技术好不好学&#xff0c;Python就业前景好不好&#xff0c;那么本文针对Python发展前景怎么样这个问题为大家做下详细的介绍。 Python培训分享&#xff1a;Python发展前…

处理器拦截器(HandlerInterceptor)详解

处理器拦截器&#xff08;HandlerInterceptor&#xff09;详解 编程界的小学生 关注 2017.04.06 15:19* 字数 881 阅读 657评论 0喜欢 4简介SpringWebMVC的处理器拦截器&#xff0c;类似于Servlet开发中的过滤器Filter&#xff0c;用于处理器进行预处理和后处理。 应用场景1、日…

Datawhale组队学习周报(第018周)

文章目录本周结营的开源内容即将结营的开源内容正在进行的开源内容七月排期的开源内容希望排期的开源内容每周号外Whalepaper 招新公告本周&#xff08;06月14日~06月20日&#xff09;&#xff0c;第 25 期组队学习一共有 3 门开源课程&#xff0c;共组建了 3 个学习群&#xf…

【原创】多台电脑如何公用一个键盘鼠标进行操作 - Mouse with Borders 软件

搞程序开发的同事经常会碰到类似的情况&#xff0c;桌子有多台设备&#xff0c;笔记本&#xff0c;台式机了&#xff0c;经常需要来回切换操作&#xff0c;桌子上摆满了键盘和鼠标&#xff0c;如果要是用同一个键盘或者鼠标&#xff0c;操作这些设备那就很便利了。 给大家推荐一…

Python培训教程分享:如何实现pygame的初始化和退出操作?

本期小编为大家介绍的Python培训教程是关于“如何实现pygame的初始化和退出操作?”的内容&#xff0c;pygame模块针对不同的开发需求提供了不同的子模块&#xff0c;例如显示模块、字体模块、混音器模块等&#xff0c;一些子模块在使用之前必须进行初始化&#xff0c;比如字体…

PLSQL的 dynamic sql小例子

开始 SET serveroutput ON;DECLAREp_tab_name varchar2(20);cursor_name INTEGER;p_rows_del INTEGER; BEGINp_tab_name : EMP_CPY;cursor_name : DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(cursor_name, DELETE FROM ||p_tab_name, DBMS_SQL.NATIVE);DBMS_OUTPUT.PUT_LINE(p_tab_n…

【青少年编程】陈晓光:打靶游戏

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Phpcms V9手机门户设置教程:怎么用PC V9做手机网站

一、在PHPcms V9管理后台设置手机门户 1.1、开启手机网站。位置&#xff1a;模块 》手机门户 》 添加手机站点&#xff0c;具体设置可参照截图&#xff1a; 填写站点名和LOGO文件相对位置&#xff0c;绑定用于手机网站的二级域名m.cmsyou.com&#xff0c;域名以http://开头。 1…

参加软件测试培训需要学习哪些知识

软件测试在互联网行业的发展前景非常好&#xff0c;很多人都想学习软件测试&#xff0c;其中有很多都是零基础学员&#xff0c;那么参加软件测试培训需要学习哪些知识?零基础是否能学会呢?来看看下面的详细介绍吧。 参加软件测试培训需要学习哪些知识?下面给大家简单说下软件…

C#用XmlDocument操作XML

1.加载xml文件 string xmlPath AppDomain.CurrentDomain.BaseDirectory"xml/test.xml"; XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(xmlPath);//这里是xml文件的路径 string xmlString"<books><book>test</book></books>…

【第20周复盘】转换思路,让更多的小朋友们参与进来!

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

篇三:XPath--解析Html

篇三&#xff1a;XPath--解析Html

Python培训教程:什么是Python全局解释器锁(GIL)?

本期Python培训教程小编为大家带来的是关于“什么是Python全局解释器锁(GIL)?”的问题&#xff0c;全局解释器锁是计算机程序设计语言解释器用于同步线程的工具&#xff0c;使得在同一进程内任何时刻仅有一个线程在执行&#xff0c;常见的有CPython、Ruby MRI。 Python培训教程…

Datawhale组队学习周报(第019周)

本周&#xff08;06月21日~06月27日&#xff09;&#xff0c;第 25 期组队学习一共有 3 门开源课程&#xff0c;共组建了 3 个学习群&#xff0c;参与的学习者有 292 人&#xff0c;其中 web开发入门教程、数据挖掘实战&#xff08;异常检测&#xff09; 已经结营&#xff0c;另…

git ingore添加忽略文件无较的解决方法

一、启动Git Bash并切换到项目目录下 二、执行下列语句&#xff1a; git rm -r --cached . git add . git commit -m update .gitignore 三、OK。

01、WPF 中 URI 解析

WebBrowser 控件导航到包中的 html 文件,首先把该文件 (bland.html) 的属性设置为 "Resource"、“始终复制”&#xff0c; 然后在 C# 页面可以导航到该文件。 webView.Navigate(new Uri(System.Environment.CurrentDirectory "/Assets/bland.html", UriK…

现在参加软件测试培训就业难度大不大?

软件测试对于IT行业来说&#xff0c;入门是相对比较简单的&#xff0c;所以学习起来是非常快的&#xff0c;零基础也可以在短时间内学会&#xff0c;那么现在参加软件测试培训就业难度大不大呢?看出来大家主要关心的是就业问题&#xff0c;来看看下面小编的详细介绍就知道了。…

ABP理论学习之数据传输对象(DTO)

本篇目录 为何需要DTO 领域层抽象数据隐藏序列化和懒加载问题DTO惯例和验证 DTO和实体的自动映射 使用特性和扩展方法进行映射帮助接口DTO用于应用层和 展现层间的数据传输。 展现层调用具有DTO参数的应用服务方法&#xff0c;然后应用服务使用领域对象来执行一些特定的业务逻辑…

Linux如何查看当前目录下文件的个数

查看当前目录下文件的个数 ls -l | grep "^-" | wc -l 查看当前目录下文件的个数&#xff0c;包括子目录里的。 ls -lR| grep "^-" | wc -l 查看某目录下文件夹&#xff08;目录&#xff09;的个数&#xff0c;包括子目录里的。 ls -lR| grep "^d&quo…

迟语寒:组队学习的那些事

很开心又拿到了优秀船员&#xff0c;其实这已不是我第一次参加组队学习了&#xff0c;4月份的二手车是我第一次接触到DataWhale&#xff0c;那次课程结束后&#xff0c;马老师找到我让我分享一下心得&#xff0c;但是我觉得第一次坚持下来不算什么&#xff0c;于是我答应他如果…

Python培训教程分享:Python模块如何导入__all__属性?

本期小编为大家带来的Python培训教程是关于“Python模块如何导入__all__属性?”的内容&#xff0c;后面在工作中是会遇到Python模块这个工作内容的&#xff0c;Python模块的开头通常会定义一个__all__属性&#xff0c;该属性实际上是一个元组&#xff0c;该元组中包含的元素决…