内核在微观上,把CPU的运行时间分成许多分,然后安排给各个进程轮流运行,造成宏观上所有的进程仿佛同时在执行。双核CPU,实际上最多只能有两个进程在同时运行,大家在top、vmstat命令里看到的正在运行的进程,并不是真的在占有着CPU哈。

所以,一些设计良好的高性能进程,比如nginx,都是实际上有几颗CPU,就配几个工作进程,道理就在这。比如你的服务器有8颗CPU,那么nginx worker应当只有8个,当你多于8个时,内核可能会放超过多个nginx worker进程到1个runqueue里,会发生什么呢?就是在这颗CPU上,会比较均匀的把时间分配给这几个nginx worker,每个worker进程运行完一个时间片后,内核需要做进程切换,把正在运行的进程上下文保存下来。假设内核分配的时间片是100ms,做进程切换的时间是5ms,那么进程性能下降还是很明显的,跟你配置的worker有关,中老年女装越多下降得越厉害。

当然,这是跟nginx的设计有关的。nginx是事件驱动的全异步进程,本身设计上就几乎不存在阻塞和中断,nginx的设计者就希望每一个nginx worker可以独占CPU的几乎全部时间片,这点就是nginx worker数量配置的依据所在。

当然,实际的运行进程里,大部分并不是nginx这种希望独占CPU全部时间片的进程,许多进程,比如vi,它在很多时间是在等待用户输入,这时vi在等待IO中断,是不占用时间片的,内核面对多样化的进程,就需要技巧性的分配CPU时间片了。

内核分配时间片是有策略和倾向性的。换句话说,内核是偏心的,它喜欢的是IO消耗型进程,因为这类进程如果不能及时响应,用户就会很不爽,所以它总会下意识的多分配CPU运行时间给这类进程。而CPU消耗进程内核就不太关心了。这有道理吗?太有了,CPU消耗型慢一点用户感知不出来,电信号和生物信号运转速度差距巨大。虽然内核尽量多的分配时间片给IO消耗型进程,但IO消耗进程常常在睡觉,给它的时间片根本用不掉。很合理吧?

那么内核具体是怎么实现这种偏心呢?通过动态调整进程的优先级,以及分配不同长短的CPU时间处来实现。先说内核如何决定时间片的长度。

对每一个进程,有一个整型static_prio表示用户设置的静态优先级,内核里它与nice值是对应的。看看进程描述结构里的static_prio成员。

nice值是什么?其实就是优先级针对用户进程的另一种表示法,nice的取值范围是-20到+19,-20优先级最高,+19最低。上篇曾经说过,内核优先级共有140,而用户能够设置的NICE优先级如何与这140个优先级对应起来呢?看代码:

可以看到,MAX_PRIO就是140,也就是内核定义的最大优先级了。

而MAX_USER_PRIO就是40,意指,普通进程指定的优先级别最多40,就像前面我们讲的那样-20到+19。

nice值是-20表示最高,对应着static_prio是多少呢?NICE_TO_PRIO(0)就是120,NICE_TO_PRIO(-20)就是100。

当该进程刚被其父进程fork出来时,是平分其父进程的剩余时间片的。这个时间片执行完后,就会根据它的初始优先级来重新分配时间片,优先级为+19时最低,只分配最小时间片5ms,优先级为0时是100ms,优先级是-20时是最大时间片800ms。我们看看内核是如何计算时间片长度的,大家先看下task_timeslice时间片计算函数:

转载于:https://www.cnblogs.com/zhanglixina/p/9584126.html

linux内核调度算法(2)--CPU时间片如何分配相关推荐

  1. Linux内核架构:CPU架构详细介绍(图例解析)

    一. 概述 CPU架构是CPU商给CPU产品定的一个规范,主要目的是为了区分不同类型的CPU.目前市场上的CPU分类主要分有两大阵营,一个是intel.AMD为首的复杂指令集CPU,另一个是以IBM. ...

  2. linux 内核空间占用cpu百分比过高,linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  3. linux 内核空间占用cpu百分比过高,线上linux系统故障排查之一:CPU使用率过高

    摘自: 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环. 下面我们将一步步定位问题,详尽的介绍每一步骤的相关知识. 一.通过top命令定位占用cpu高的进程 执行top ...

  4. Linux内核如何查看cpu位数,查看linux系统内核、CPU内存、系统位数的相关命令

    查看linux系统内核.CPU内存.系统位数的相关命令 以我的笔记本为例,看看相关命令. HP-NX6120,赛扬1.5G,2根内存条(1G + 512M),操作系统Ubuntu8.04. 查看Lin ...

  5. Linux内核地址空间的内存分布及分配

    虚拟地址空间0~3G用于应用层 虚拟地址空间3~4G用于内核层 内核又将3~4G的虚拟地址空间,划分为如下几个部分: 896MB又可以细分为ZONE_DMA和ZONE_NORMAL区域. 低端内存(Z ...

  6. linux内核怎么配置cpu为arm

    配置内核时,执行以下命令: make menuconfig ARCH=arm

  7. linux内核中的每cpu变量

    一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...

  8. 【Linux 内核】进程管理 ( Linux 中进程的 CPU 资源调度 | 进程生命周期 | 创建状态 | 就绪状态 | 执行状态 | 阻塞状态 | 终止状态 | 进程生命周期之间的转换 )

    文章目录 一.Linux 中进程的 CPU 资源调度 二.进程生命周期 三.进程生命周期之间的转换 一.Linux 中进程的 CPU 资源调度 Linux 操作系统 是 多任务系统 , 可以 同时运行 ...

  9. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

最新文章

  1. 转iOS性能优化:Instruments使用实战
  2. Java基础:常用IO流
  3. AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——14:20-15:00方方教授《Maps and Functions of Human Attention》
  4. python 复制dict_超全的Python 字典(Dictionary)介绍
  5. 互掐!美团“抛弃”支付宝,背后的真相到底是啥?
  6. mysql 联合索引 性能_mysql:联合索引及优化
  7. C#中的泛型化方法的实现
  8. mysql主从同步错误记录。
  9. 敏捷开发系列学习总结(7)——敏捷开发的10大指导原则
  10. Spring注入方式及用到的注解 -----@Component,@Service,@Controller,@Repository
  11. 华为手机助手 for Mac(华为手机管理软件)中文版
  12. 首页增加了“阅读排行”
  13. Jmeter测试——java测试脚本编写
  14. C语言入门知识集合。
  15. HTML5 Canvas 画钟表
  16. e470c拆机图解全拆 thinkpad_THINKPAD e470硬盘拆解教程是?
  17. php 闭合标记,什么叫自闭合标签?自闭标签有什么用
  18. MATLAB矩阵的基本运算及操作
  19. WIN7双系统卸载与重装Ubuntu
  20. mongodb慢日志

热门文章

  1. oracle+连接数sessionn,Oracle进程连接数过多时的Statspack分析报告
  2. php 生成随机数组,利用php如何获取随机数组列表
  3. Python 数据类型 布尔类型
  4. JavaScript中用var和不用var的区别
  5. 服务器 自检 修改,检查多台服务器初始密码是否修改的shell脚本
  6. 两台电脑怎么共享_怎么在电脑上创建共享文件(必须是在同一个网段)
  7. layui表格取消横向滚动条_layui滑动条如何隐藏
  8. 我的世界服务器自定义怪物怎么用,我的世界 教你自定义怪物属性
  9. oracle内存参数越大越好吗,什么是Oracle内存参数调优技术?
  10. 快速排序菜鸟python_python菜鸟教程学习13:文件操作