进程状态

进程调度就是让进程从一种状态切换到另一种状态。Linux中进程的主要状态如下,

状态

缩写

含义

0

TASK_RUNNING

R

正在运行或可运行

1

TASK_INTERRUPTIBLE

S

可中断的休眠

2

TASK_UNINTERRUPTIBLE

D

不可中断的休眠

4

__TASK_STOPPED

T

停止状态,当进程接收到SIGSTOP等signal信息

8

__TASK_TRACED

t

跟踪状态,进程被debugger程序暂停,比如使用ptrace()调试

16

EXIT_ZOMBIE

Z

僵尸状态,进程结束时调用do_exit()先进入僵尸状体

32

EXIT_DEAD

X

死亡状态,父进程使用waitpid()或wait4()回收死亡的子进程后,状态由EXIT_ZOMBIE转换为EXIT_DEAD

下图粗略的展示了进程状态的切换,可以更加直观的理解各种进程状态。

上图中需要补充说明的是,进程正在”占有CPU执行“时应该处于TASK_RUNNING状态。EXIT_ZOMBIE状态应该是很短暂的,父进程需要使用wait类系统调用回收子进程,回收后进程状态就转变为EXIT_DEAD,如果父进程一直不回收,子进程就变为僵尸进程。__TASK_TRACED状态只有在使用debugger是才会出现,例如使用gdb设置断点,进程在断点上暂停时就处于跟踪状态。

调度器

系统中包含许多进程,内核有责任让所有进程都得到运行,并让重要的进程获得更多的运行。这就需要一种机制管理所有的进程,在内核中安排进程执行的模块被称为调度器(scheduler)。

调度器从处于就绪状态的进程中挑选一个,并分配CPU时间片让它运行。

当进程运行的时间片耗尽时,调度器会将其转换为就绪状态,插入到准备执行的进程队列。

进程在放弃CPU进入睡眠或暂停状态后,如果被唤醒,调度器也会将其插入到准备队列。

所以,调度器将解决两个核心的问题:分配合适的时间片和合理安排进程执行顺序。最原始的调度策略是按照优先级排列好进程,等到一个进程运行完了再运行优先级较低的一个,但这种策略完全无法发挥多任务系统的优势。因此,随着时间推移,操作系统的调度器也多次进化。

Linux 2.4内核推出了O(n)调度器,O(n)调度器把时间分成大量的微小时间片(Epoch)。在每个时间片开始的时候,调度器会检查所有处在就绪状态的进程。调度器计算每个进程的优先级,然后选择优先级最高的进程来执行。一旦被调度器切换到执行,进程可以不被打扰地用尽这个时间片。如果进程没有用尽时间片,那么该时间片的剩余时间会增加到下一个时间片中。O(n)调度器在每次使用时间片前都要检查所有就绪进程的优先级。这个检查时间和进程中进程数目n成正比,这也正是该调度器复杂度为O(n)的原因。当计算机中有大量进程在运行时,这个调度器的性能将会被大大降低。

为了解决O(n)调度器的性能问题,O(1)调度器被发明了出来,并从Linux 2.6内核开始使用。O(1)调度器的创新之处在于,它会把进程按照优先级排好,放入特定的数据结构中。在选择下一个要执行的进程时,调度器不用遍历进程,就可以直接选择优先级最高的进程。O(1)调度器会用两个队列来存放进程。一个队列称为活跃队列,用于存储那些待分配时间片的进程。另一个队列称为过期队列,用于存储那些已经享用过时间片的进程。O(1)调度器把时间片从活跃队列中调出一个进程。这个进程用尽时间片,就会转移到过期队列。当活跃队列的所有进程都被执行过后,调度器就会把活跃队列和过期队列对调,用同样的方式继续执行这些进程。

Linux 2.6.23版本起,完全公平调度器(CFS,Completely Fair Scheduler)取代了O(1)调度器。CFS调度器不对进程进行任何形式的估计和猜测。这一点和O(1)区分互动和非互动进程的做法完全不同。CFS调度器增加了一个虚拟运行时(virtual runtime)的概念。每次一个进程在CPU中被执行了一段时间,就会增加它虚拟运行时的记录。在每次选择要执行的进程时,不是选择优先级最高的进程,而是选择虚拟运行时最少的进程。完全公平调度器用一种叫红黑树的数据结构取代了O(1)调度器的140个队列。红黑树可以高效地找到虚拟运行最小的进程。CFS调度器会根据进程的优先级来计算一个时间片因子。同样是增加250纳秒的虚拟运行时,优先级低的进程实际获得的可能只有200纳秒,而优先级高的进程实际获得可能有300纳秒。这样,优先级高的进程就获得了更多的计算资源。

进程优先级

进程优先级影响调度器的时间片分配和进程执行顺序。Linux根据进程特性,在优先级上把进程分为两大类:实时进程和普通进程。

实时进程(Real-Time Process):优先级高、需要尽快被执行的进程。它们一定不能被普通进程所阻挡,例如视频播放、各种监测系统。

普通进程(Normal Process):优先级低、更长执行时间的进程。例如文本编译器、批处理一段文档、图形渲染。

实时进程也并不是真正的实时,同样需要经过进程调度,只是会先级于普通进程运行。进程的优先级是一个0到139的整数。数字越小,优先级越高。其中,优先级0到99留给实时进程,100到139留给普通进程。普通进程的默认优先级时120,可以通过nice命令来修改进程的默认优先级。下面的命令表示将默认优先级改为(120-20)。

$nice -n -20 ./app

普通进程的默认优先级称为静态优先级,进程运行时实际采用的是动态优先级。调度程序通过增加或减少进程静态优先级的值来奖励IO消耗型进程或惩罚cpu消耗型进程,调整后的优先级称为动态优先级。动态优先级的计算公式如下。

动态优先级 = max(100 , min(静态优先级 – bonus + 5 ,139))

bonus是范围0~10的值,值小于5表示降低动态优先级以示惩罚,值大于5表示增加动态优先级以示奖赏。

调度策略

Linux系统中,实时进程和普通进程采取了不同的调度策略。实时进程使用是实时调度策略,有三种:SCHED_FIFO,SCHED_RR,SCHED_DEADLINE。

SCHED_FIFO:先进先出的实时进程。当调度器把CPU分配给进程的时候,它把该进程描述符保留在运行队列链表的当前位置。如果没有其他可运行的更高优先级实时进程,进程就继续使用CPU,想用多久就用多久,即使还有其余具有相同优先级的实时进程处于可运行状态。由RT调度器实现。

SCHED_RR:时间片轮转实时进程。当调度程序把CPU分配给进程的时候,它把该进程的描述符放在运行链表的末尾。这种策略保证对所有具有相同时间优先级的SCHED_RR实时进程公平地分配CPU时间。由RT调度器实现。

SCHED_DEADLINE:新支持的实时进程调度策略,针对突发型计算,且对延迟和完成时间高度敏感的任务适用。基于Earliest Deadline First (EDF) 调度算法。由DL调度器实现。

实时进程使用0~99的优先级,就绪进程使用队列的方式组织。相同优先级的实时进程都保存在一个列表中,再根据优先级排列起来。调度器总是先选取优先级最高的进程来运行。实时进程在下列情况下可以让出CPU,

进程被更高优先级的实时进程抢占。

进程进入休眠状态或暂停状态。

进程调用sched_yield()自愿放弃CPU。

使用SCHED_RR策略时,进程的时间片耗光。

普通进程的调度策略有三种,由CFS调度器实现,分别是:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE。

SCHED_NORMAL:(也叫SCHED_OTHER)用于普通进程,通过CFS调度器实现。

SCHED_BATCH:SCHED_NORMAL策略的分化版本,采用分时策略,根据动态优先级分配CPU运算资源。

SCHED_IDLE:优先级最低,在系统空闲时才跑这类进程。

调度设置函数

Linux进程调度的介绍就简单说这些,主要是概念普及,实用为主。下面简单列举一下调度相关的函数。

nice():调整普通进程的优先级,nice值从-20到19。

getpriority()/setpriority():获取/设置线程的优先级。

sched_getscheduler()/sched_setscheduler():获取/设置线程的调度策略。

sched_getparam()/sched_getparam():获取/设置线程的调度参数,参数由struct sched_param描述。

sched_get_priority_max()/sched_get_priority_min():获取指定策略的最大/最小优先级。

sched_rr_get_interval():获取SCHED_RR策略下实时进程的时间片长度。

sched_getattr()/sched_setattr():获取/设置调度策略和属性。这个接口是其他调度函数的超集。

sched_getaffinity()/sched_setaffinity():获取/设置线程的CPU亲和性(affinity)。

sched_yield():当前线程主动让出CPU,让其他线程执行。

Affinity表示CPU的亲和性,就是让进程在指定的CPU上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性。再简单的点的描述就将指定的进程或线程绑定到相应的CPU上。在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息。如果进程被调度到其他CPU上,cache命中率就会降低。当绑定CPU后,程序就会一直在指定的CPU上运行,不会被调度到其他CPU上,可以提高性能。

参考文章:

linux进程调度采取的是,Linux进程调度相关推荐

  1. linux 进程调度 内存,linux学习的任督二脉-进程调度和内存管理

    转自 宋宝华老师的博客 原文:https://blog.csdn.net/21cnbao/article/details/77505330 内功心法 学习或遇到问题时,反过来主动思考如果我是设计者,我 ...

  2. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构

    作者:蜗蜗 发布于:2014-2-21 13:23 分类:Linux内核分析 1. 前言 本文是"Linux内核分析"系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内 ...

  3. linux 内核round-robin scheduler代码,LINUX源代码阅读报告

    进程调度代码分析 --关于LINUX源代码中进程调度部分的读书报告 在多进程的操作系统中,进程调度是一个全局性.关键性的问题,它对系统的总体设计.系统的的实现.功能设置以及各个方面的性能都有着决定性的 ...

  4. linux游戏欢迎界面,制作Linux登录欢迎界面

    1.登录提示语: 将提示语写入/etc/motd 文件 _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ ...

  5. linux由哪些部分组成,linux内核处于什么位置?,为你介绍一些Linux操作系统的基础知识(一)...

    今天小编为大家带来的文章是关于Linux操作系统的一些基础知识.喜欢Linux的小伙伴们快来看一看吧. Q1.什么是GNU?Linux与GNU有什么关系? A: 1)GNU是GNU is Not Un ...

  6. linux查看睡眠进程,关于 Linux 进程的睡眠和唤醒 ,来看这篇就够了~

    1 Linux 进程的睡眠和唤醒 在 Linux 中,仅等待 CPU 时间的进程称为就绪进程,它们被放置在一个运行队列中,一个就绪进程的状 态标志位为 TASK_RUNNING.一旦一个运行中的进程时 ...

  7. linux系统基础与应用,Linux操作系统:基础、原理与应用

    <Linux操作系统:基础.原理与应用> 第1部分基础篇 第1章操作系统概述/3 1.1认识操作系统3 1.1.1操作系统的概念3 1.1.2操作系统的功能4 1.2操作系统的发展与现状5 ...

  8. 给大家推荐一个优质Linux内核技术公众号-Linux阅码场

    作为一个Linux 技术公众号的作者,我觉得有义务推荐优秀的公众号,推广内容,希望对大家的学习有所帮助~ Linux阅码场是一个专注Linux内核和系统编程与调试调优技术的公众号,它的文章云集了国内众 ...

  9. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  10. linux线程调度与rtos,实时Linux和RTOS的基本特性及技术进行比较

    体系结构异同 对实时操作系统(RTOS)特性进行比较和分析.对于我们刚接触这个操作系统时一定要对他们要有一定的了解,我们先对实时操作系统来了解下,它就是指当外界事件或数据产生时,能够接受并以足够快的速 ...

最新文章

  1. UA MATH571A 多元线性回归V 自相关与非线性模型简介
  2. Fastjson 爆出远程代码执行高危漏洞,更新版本已修复
  3. BZOJ 2957 楼房重建-线段树
  4. Java面向对象第二章课后习题
  5. 在centos6.5中安装reids
  6. RTCM3.3电文信号,消息类型GPS MSM4的解码
  7. Ubuntu安装Yafu方法及资料
  8. 前端页面劫持和反劫持
  9. 北大中文核心期刊目录2021年 电工技术
  10. 我是如何同时在字节和微信成功拿到实习转正offer!
  11. 【目标检测】目标检测算法-从OverFeat到YOLO
  12. 2.4G频段的无线收发芯片 SI24R1 问题汇总解答
  13. SQL Server - 无法将数据库从SINGLE_USER模式切换回MULTI_USER模式(Error 5064)
  14. 奇迹暖暖服务器不稳定,奇迹暖暖怎么换服务器
  15. ionic 下拉刷新 — ion-refresher
  16. 2021年国庆节假期三亚游客离岛免税购物热情高涨、偏爱高端酒店与景点新玩法...
  17. 2017计算机开机号202,福彩3D2017第202期彩吧3D开机号429
  18. 计算机用户密码在哪里设置,电脑开机密码在哪里设置?怎么设置?
  19. alipay 证书 java_alipay-sdk-java
  20. 题解 CF442A 【Borya and Hanabi】

热门文章

  1. 【vue】 vue2 实现飘窗效果
  2. vue实现web端飘窗组件
  3. 使用vue自定义分页器
  4. Dubbo:基本原理机制。
  5. [Linux基础与服务管理——常用集群高可用软件 Keepalived]
  6. 【远程连接 多个SQL SERVER数据库实例】
  7. mysql 5.6 federated_Mysql 开启Federated引擎以及使用
  8. Log4j的扩展-支持设置最大日志数量MaxFileSize的DailyRollingFileAppender
  9. 北京2008年奥运会奖牌设计公布
  10. java jhat_JVM学习笔记——jhat的使用