linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍
第四章 进程调度
- 进程调度程序是一个内核子系统
- 分配有限的处理器时间和资源
- 最大限度利用时间的原则(只要有可执行的进程,那么总会有进程执行)
基本工作:从一组处于等待(阻塞)状态的可执行进程中选择一个执行
4.1多任务
概念
能同时并发地交互执行多个程序的操作系统。(单处理机和多处理机上都可以实现)
多任务
抢占式任务
-进程调度程序能强制挂起正在执行的程序
-非抢占式任务
-除非进程自己主动停止运行,否则它一直运行4.2Linux的进程调度
- O(1)调度器
Linux2.5采用的新调度程序:不管输入有多大,调度程序都可以在恒定的时间完成工作。但是它在多交互进程运行的系统中表现不佳。 CFS完全公平调度程序
Linux2.6.23开始采用的调度程序。前身是RSDL“反转楼梯最后期限调度算法”。吸取了队列理论,加入了公平调度的概念。4.3策略
调度程序的策略决定在何时让什么进程运行
4.3.1I/O消耗型和处理器消耗型的进程
进程可以分为两类:
- I/O消耗型
经常处于可运行的状态,花更多的时间等待I/O请求。满足这类进程,可以提高系统的响应速度,有更好的用户体验。 - 处理器消耗型
大多数时间花在执行代码上。满足这类进程,策略往往是降低它们调度的频率,延长运行时间。 调度策略
需要在这两类矛盾的目标中寻找平衡:响应迅速和最大系统吞吐量。4.3.2进程优先级
优先级调度算法:优先级高的先执行。相同优先级轮转调度。
Linux采用两种优先级范围- nice值。(-20~+19),值越低优先级越高。Mac OS X系统中nice值表示时间片的绝对值;Linux系统中,nice值表示时间片的比例。
ps -el
这个命令可以查看系统中的进程列表,NI标记那一列为nice值 实时优先级。(0~99),值越高优先级越高。任何适合进程的优先级都高于普通进程。
ps -eo state,uid,pid,ppid,rtprio,time,comm.
查看进程列表,实时优先级在RTPRIO那一栏。4.3.3时间片
表明进程在被抢占前所能持续运行的时间。
- 一般操作系统设置默认的时间片10ms.一个进程是否能抢占当前进程,由优先级和是否有时间片来决定。
Linux的CFS(完全公平调度程序)调度器是将使用比划分给进程。这个比例值并不是固定不变的,它还会受nice值来做调整。一个进程是否能抢占当前进程,是由使用比来决定。如果一个进程消耗的使用比比当前进程小,则立刻抢占。
4.3.4调度策略的活动
例如文本编辑器和视频处理器,前者是I/O消耗型,后者需要从磁盘读原始数据流,然后处理原始数据流,是CPU消耗型。在Linux系统中,假如这两者是仅有的两个进程,又有相同的nice值,那么它们两得到使用比为50%和50%。文本编辑器更多的时间实在等待用户输入,所以它的时间用得相当少,当它一旦被唤醒的时候,就能立刻抢占视频处理器的进程。这样,系统就能很好的处理响应速度和吞吐量的问题了。
4.4Linux调度算法
4.4.1调度器类
- 分类的目的:为了让不同类型的进程可以有针对性地选择调度算法。
- Linux调度器以模块的方式提供,允许动态添加的调度算法共存,调度属于自己范畴的进程,每个调度器有一个优先级,按照优先级遍历,最高的调度器类去选择下一个执行的程序。
CFS属于普通进程的调度类。
4.4.2Unix系统中的进程调度
这是在CFS之前的传统的调度过程。
Unix系统中,优先级以nice值的形式输出给用户空间。存在以下几个问题:- nice值直接对应处理器的时间不合理。
- nice值的相对值不合理
- nice值映射时间片,就要求时间片必须是定时器节拍的整数倍。(这点才是引入CFS的原因。)
基于优先级的调度器优化交互任务来唤醒进程。给一些进程提供了后门,损害了其他进程的利益。
在优化传统的调度器的过程中确实解决了很多问题,但是都回避了一个实质性的问题:分配绝对的时间片引发的固定切换频率,给公平性造成了很大的变数。4.4.3公平调度
进程获得的处理器的时间是有nice值得几何加权决定的,分配的是处理器的使用比。这样提高了公平性,CFS不是完美的公平,但是几乎完美的多任务。
CFS允许每个进程运行一段时间,循环轮转,选择最少的进程作为下一个运行进程。在无限小调度周期设立一个目标(目标延迟),调度周期越小交互性越好。但是切换的代价更高,系统吞吐量能力更差。(例如目标延迟为20ms,2个优先级相同的任务,每个运行10ms)另外设置一个最小粒度,默认为1ms。即每个程序执行的最短时间为1ms.4.5Linux调度的实现
4.6抢占和上下文切换
上下文切换时,schedule()会调用函数完成两个任务:
- switch_mm()负责把虚拟内存从上一个进程映射切换到新内存中
switch_to()负责从上一个进程的处理器状态切换到新进程的处理器状态。
内核必须知道什么时候调用schedule,具体方式是使用need_reasched标志。4.6.1用户抢占
以下时机:
- 从系统调用返回用户空间时
- 从中断处理程序返回用户空间时
-#### 4.6.2内核抢占 - 中断处理程序正在执行,且返回内核空间之前
- 内核代码再一次具有可抢占的时候
- 如果内核中的任务显示地调用schedule()
如果内核中的任务阻塞
4.7实时调度策略
两种实时策略:(优先级范围0~99)
- SCHED_FIFO先进先出
- SCHED_RR带有时间片的先进先出
一种非实时策略(优先级范围100~139) SCHED_NORMAL
linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍的更多相关文章
- linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍
<linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功 ...
- linux及安全《Linux内核设计与实现》第二章——20135227黄晓妍
第二章:从内核出发 2.1获取源代码 2.1.1使用git Git:内核开发者们用来管理Linux内核源代码的控制系统. 我们使用git来下载和管理Linux源代码. 2.1.2安装内核源代码(如果使 ...
- linux及安全《Linux内核设计与实现》第三章——20135227黄晓妍
第三章 (由于linux不区分进程和线程,所以它们在linux中被称为task,也叫任务) 总结:本章主要包括进程以及线程的概念和定义,Linux内核如何管理每个进程,他们在内核中如何被列举,如何创建 ...
- linux及安全期中总结——20135227黄晓妍
Linux及安全期中总结 黄晓妍 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...
- linux及安全第三周总结——20135227黄晓妍
总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init 内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...
- Linux内核设计与实现 第四章
1. 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程). 这个管理程序就是调度程序,功能: 决定哪些进 ...
- Linux基础入门学习笔记20135227黄晓妍
学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用L ...
- linux及安全第八周总结——20135227黄晓妍
实验部分 实验环境搭建 -rm menu -rf git clone https://github.com/megnning/menu.git cd menu make rootfs qemu -ke ...
- linux及安全第七周总结——20135227黄晓妍
实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...
随机推荐
- PHP MySQL Insert Into
INSERT INTO 语句用于向数据库表中插入新记录. 向数据库表插入数据 INSERT INTO 语句用于向数据库表添加新记录. 语法 INSERT INTO table_name VALUES ...
- 什么是"抓包"?怎样"抓包"?
你是网络管理员吗?你是不是有过这样的经历:在某一天的早上你突然发现网络性能急剧下降,网络服务不能正常提供,服务器访问速度极慢甚至不能访问,网络交换机端口指示灯疯狂地闪烁.网络出口处的路由器已经处于满负 ...
- 网络子系统45_ip协议tos处理
//ip报头tos字段,一个字节 // 二进制位:[0 1 2] [3] [4] [5] [6] [7] // 1.[0 1 2] 表示优先级: // 000 路由 // 001 优先级 // 010 ...
- maven安装和与IDE集成
第一部分:maven的基本信息和安装,配置 maven是一个项目构建和管理的工具,提供了帮助管理 构建.文档.报告.依赖.scms.发布.分发的方法.可以方便的编译代码.进行依赖管理.管理二进制库等 ...
- ionic开发过程中遇到的一些坑!
总结一些:在使用 ionic 开发过程中所遇到的问题. 问题一:Cannot find module '@ionic/app-scripts' 描述:使用 ionic start 项目的时候,项目安装 ...
- 170524、java.lang.IllegalArgumentException: No converter found for return value of type异常解决
错误原因及解决步骤 1.原因:这是因为springmvc默认是没有对象转换成json的转换器的,需要手动添加jackson依赖. 2.解决步骤: 手动添加jackson依赖到pom.xml文件中 &l ...
- 徐州网络赛J-Maze Designer【最小生成树】【LCA】
After the long vacation, the maze designer master has to do his job. A tour company gives him a map ...
- ora-00600错误解决一枚
今天网友遇到ora-600错误,这里把这个ora-600错误的解决方法详细记录一下. 最初报错信息如下: ora-600-图1 ora-600-图2 图3 这里我们可以看到报错控制文件版本不一致,要求 ...
- Ubuntu安装pycurl
转自:https://blog.csdn.net/qq_23729557/article/details/78836547 在Ubuntu 16.04上安装pycurl时大致会遇到一下两个问题: 在使 ...
- python的pip的配置文件路径在哪里?如何修改pypi源?
官方文档: https://pip.pypa.io/en/stable/user_guide/#configuration 举个例子: Windows用户想要更改pypi源,可以在%APPDATA%目 ...