主要讨论的是单核 CPU 的情况下,进行调度的一些算法和思路。讨论都是基于单核 CPU 的条件下进行。

在内存中,无论对于用户而言有多少个进程,但在 CPU 运行的时候,总是只有只执行一个进程。进程调度的方式有很多,传统的算法有 FIFO,SJF(shortest job first),多级队列反馈调度。但是由于多进程的出现,必然不会采用单个进程依次执行的情况,所以现在的 CPU 都是对多个进程同时运行,把时间分摊到每个进程上,这样,对于用户而言,可以感受到多个进程并行的错觉。

CPU 在对于每个进程进行分摊的时候,在每次运行一段程序的时候,采用了时间片的概念,即这个时候 CPU 会运行这个程序一个时间段的长度。kernel 进行调度的时候,就是通过动态计算时间片来进行控制和调度选择的。

一般而言,进程可以分为两类,将进程分类是有必要的,不同的进程由于其需要的资源不同,可以分为 IO 消耗和处理器消耗两类。对于这两类进程的区分,可以有效避免 CPU 的资源的浪费,IO 消耗可能在 IO 时间或者等待用户输入的时间多一些,那么他们需要的 CPU 进行计算的时间相比之下就少,这种分类可以有效的避免资源的浪费。

调度策略的核心就是在 CPU 进行效应运行和尽可能的让系统利用率,吞吐量之间做 tradeoff。

进程由于其作用的不同,相应的就有不同的重要性。对于不同的进程,我们可以划分一个不同的优先级,对于优先级比较高的进程先运行,而优先级比较低的程序后运行。对于相同优先级的进程,我们可以按照轮转的方式,依次进行。这样就形成了一个多级优先级,轮转调度的算法。

现在的 Kernel 主要采用的最基本的调度是完全公平调度 (CFS)的算法进行调度程序。这里并没有时间片的概念,只有程序的等待时间。即这个程序在就绪队列中等待了多久。

对于相同优先级的进程而言,我们应该尽可能的保证花在每个进程的时间均匀。即每个进程使用的资源一样多。在理想状态下,我们可以把时间划分成无穷小量,每个进程都运行相同的无穷小量,然后在进程之间做没有 cost 的进程切换,这样,我们就可以将资源平均的花在每个进程上。但是现实的困难是,在进行进程切换的时候,往往会有cost的存在,同时,cpu 的 cache 缓存也会受到影响。

CFS 的做法是对每个进程运行一个时间段,然后选择运行最少的进程作为下一个的进程。对于每个进程应该运行多久,依靠的是其进程的重要性的差值在所对应的运行总时间的比重。即越重要的进程,所获得的时间就越多。同时,每个进程在运行的时候,总是要有一个最小的运行粒度,不仅可以避免饥饿现象的出现,还要避免频繁的调度导致的大量的 cost 。

Linux 进程调度笔记(一)的更多相关文章

  1. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  2. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  3. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  4. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  5. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  6. 跟着鸟哥学Linux系列笔记2-第10章VIM学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...

  7. 跟着鸟哥学Linux系列笔记0-如何解决问题

    跟着鸟哥学Linux系列笔记0-扫盲之概念 在发生问题怎么处理: 1.  在自己的主机.网络数据库上查询How-To或FAQ -Linux 自身的文件数据: /usr/share/doc -CLDP中 ...

  8. 跟着鸟哥学Linux系列笔记1

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 装完linux之后,接下来一步就是进行相关命令的学习了 第五章:首次登录与在线求助man page 1. X ...

  9. linux进程调度之 FIFO 和 RR 调度策略

    转载 http://blog.chinaunix.net/uid-24774106-id-3379478.html    linux进程调度之 FIFO 和 RR 调度策略 2012-10-19 18 ...

随机推荐

  1. HDU 6521 K-th Closest Distance (主席树+二分)

    题意: 给你一个数组,q次询问,每次问你[l,r]范围内与p距离第k大的元素的与p的距离,强制在线 思路: 主席树提取出[l,r]内的权值线段树,然后二分与p的距离mid ask该权值线段树里[p-m ...

  2. LAMP: 分布式 HTTP 2.4.25 + PHP 5.4.13 + MySQL 5.5.28 分离部署

    目录 A. 环境说明:B. 效果截图:C. HTTP编译安装D. MySQL二进制安装E. PHP源码编译安装F. PHP连接HTTPG. PHP支持扩展功能xcacheH. PHP连接MySQLI. ...

  3. meta 的作用 搜集

    Meta标签中的format-detection属性及含义   format-detection翻译成中文的意思是“格式检测”,顾名思义,它是用来检测html里的一些格式的,那关于meta的forma ...

  4. golang 自定义结构体(与其他语言对象类似)

    /* 结构体变量: 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存, 因此必须在定义结构体并实例化后才能使用结构体的字段. type 类型名 struct { 字段1 字 ...

  5. 使用GitHub+Travis-CI+Docker打造自动化流水线

    全文采用的是阿里云的ESC服务器,系统是CentOS 7 示例项目是NodeJS编写,本文主要是Docker的使用,在文章前2/3都是Docker命令介绍,最后我们会完成一个自动化的示例. 准备 注册 ...

  6. Linux相关知识笔记

    Quagga要在linux下编译并配置运行,所有,学习一点linux的基础知识. 安装的Ubuntu,用户名linux,密码1 使能Ubuntu的IP转发功能,需要修改etc/sysctl.conf和 ...

  7. MyBatis 与Ibatis 区别

    Ibatis 是 Mybatis 的前身,两者都是优秀的持久层框架. 区别: 1.mybatis 实现接口绑定,不需要具体接口实现类.但是需要在xml文件中 的 namespace 绑定具体的接口. ...

  8. Day3前端学习之路——CSS基本知识

    课程目标 初步了解什么是CSS,掌握基本的CSS概念,语法,针对选择器特殊性的计算处理,以及学习如何设置一些简单的样式 任务一:回答问题 1.什么是CSS,CSS是如何工作的? CSS 指层叠样式表 ...

  9. 在命令提示符中的有关mysql命令

    -h:当连接MySQL服务器不在同台主机时,填写主机名或IP地址 -u:登录MySQL的用户名 -p:登录MySQL的密码 注意:密码如果写在命令行的时候一定不能有空格.如果使用的系统为linux并且 ...

  10. 为什么我不建议在C#中用下划线_开头来表示私有字段

    我在C#官方文档的使用属性里看到这种代码: public class Date { private int _month = 7; // Backing store public int Month ...