《Linux内核设计与实现》读书笔记 第四章 进程调度

第四章进程调度

进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统。调度程序是多任务操作系统的基础。通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的效果。

最大限度地利用处理器时间的原则是,只要有可以执行的进程,那么总会有进程在执行。

4.1多任务

多任务操作系统就是能同时并发地交互执行多个进程的操作系统。多任务能使多个进程处于堵塞或者睡眠状态。就是任务位于内存内但是不被执行,直到某一事件发生。

分类:

l  非抢占式:除非进程自己主动停止运行,否则就一直执行。进程主动挂起自己的操作叫让步。缺点:进程独占的时间可能超乎想想。绝不让步的进程会崩溃。

l  抢占式:(Linux提供)由调度程序来决定什么时候停止一个进程,以便其他进程能够得到执行。进程在被抢占之前能够运行的时间是固定的,叫时间片。有效管理时间片能使调度程序从系统全局的角度做出调度决定,可以避免个别进程独占系统资源。

4.2 Linux的进程调度

版本2.4之前,Linux调度程序相当简陋。2.5开发系列的内核中,开始采用O(1)调度程序。O(1)对时间敏感的程序却有先天不足。O(1)调度程序虽然对于大服务器的工作负载很理想,但是在有很多交互程序要运行的桌面交互程序的调度性能引入了新的进程调度算法。为了提高交互程序调度,该算法吸取队列理论,将公平调度的概念引入了Linux调度程序。“完全公平调度算法”,简称CFS。

4.3策略

I/O消耗和处理器消耗型的进程:前者指进程大部分时间用来提交I/O请求,或等待I/O请求。后者进程把时间大多用在执行代码上,除非被抢占,否则一直运行。对于这类进程,调度策略是尽量降低它们的调度频率。调度策略通常要在两个矛盾的目标中寻找平衡。

进程优先级:调度算法中最基本的一类是基于优先级的调度。Linux采用了两种不同的优先级范围。第一种用nice(-20~+19),越大的nice值意味更低的优先级(反比)。第二种范围是实时优先级(默认0~99)其值可配置,值与优先级成正比。

时间片:表明进程在被抢占前所能持续运行的时间。调度策略必须规定一个默认时间片。时间片过长会导致系统对交互的响应表现欠佳,太短会明显增大进程切换带来的处理器消耗。I/O消耗性不需要长时间片,处理去则需要越长越好。

调度策略活动:理想情况下,调度程序应该给予文编编辑程序相比视频编码程序更多的处理器时间。需要依靠系统分配给文本编辑器比视频解码程序更高的优先级和更多的时间片。

4.4 Linux调度算法

调度器类:Linux是以模块方式提供的,目的是允许不同类型的进程可以针对性地选择调度算法。完全公平调度(CFS)是一个针对普通进程的调度类。

Unix系统中的进程调度:具有高优先级的进程将运行得更频繁,也会被赋予更多时间片,UNxi上优先级以nice值形式输出给用户空间,这样会导致进程切换无法最优化进行。相对nice值,nice值得变化带来的效果很大取决于nice的初始值。如果执行nice值到时间片的映射,我们需要能分配一个绝对的时间片,这要求时间片必须是定时器节拍的整数倍,这样。

公平调度:CFS出发的理念:进程调度的效果应如同系统具有一个理想中的完美多任务处理器。每个进程能获得1/n的处理器时间。但这只是理想状态。但还是需要周期尽量小。CFS的做法是允许每个进程运行一段时间、循环论转、选择运行最少的进程作为下一个运行进程。当进程数量趋于无限,周期则趋于零那么切换消耗则无法接说,所以有最小粒度,就是最小时间片,默认是1ms。

4.5Linux调度的实现

相关代码在kernel/sched_fair.c,有四个组成部分:时间记账,进程选择,调度器入口,睡眠和唤醒。

时间记账:所有调度器都必须对进程运行时间做记账。CFS以此保证公平。

进程选择:CFS会挑具有最小vruntime的进程。CFS用红黑树(自平衡二叉树)来组织可运行进程队列,并在其中迅速找到vruntime最小的进程。

调度器入口:进程调度的主要入口是函数schedule()。

睡眠和唤醒:进程休眠机制,进程标记为休眠,就会从红黑树中移出。唤醒则相反。

4.6抢占和上下文切换

上下文切换:从一个可执行进程切换到另一个可执行进程。

用户抢占:内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用,此时就会发生用户抢占。在以下情况下产生,从系统调返回用户空间时,从中断处理程序返回用户空间时。

内核抢占:Linux完整地支持内核抢占。只要重新调度室安全的,内核就可以在任何时间抢占正在执行的任务。如何是安全:只要没有持有锁就行。

时间: 2024-10-08 19:54:02

《Linux内核设计与实现》读书笔记 第四章 进程调度的相关文章

Linux内核设计与实现读书笔记——第三章

Linux内核设计与实现读书笔记——第三章 进程管理 20135111李光豫 3.1进程 1.进程即处于执行期的程序,并不局限于一个可执行的代码,是处于执行期程序以及其相关资源的总称. 2.Linux系统中,对于进程和线程并没有明显的区分,线程是一种特殊的进程. 3.Linux系统中,常用fork()进程创建子进程.调用fork()进程的成之为其子进程的父进程. 4.fork()继承实际上由clone()系统调用实现.最后通过exit()退出执行. 3.2任务描述符及任务结构 1.任务队列实质上

Linux内核设计与实现 读书笔记 转

Linux内核设计与实现  读书笔记: http://www.cnblogs.com/wang_yb/tag/linux-kernel/ <深入理解LINUX内存管理> http://blog.csdn.net/yrj/article/category/718110 Linux内存管理和性能学习笔记(一) :内存测量与堆内存 第一篇 内存的测量 2.1. 系统当前可用内存 # cat /proc/meminfoMemTotal:        8063544 kBMemFree:       

Linux内核设计与实现 读书笔记

第三章 进程管理 1. fork系统调用从内核返回两次: 一次返回到子进程,一次返回到父进程 2. task_struct结构是用slab分配器分配的,2.6以前的是放在内核栈的栈底的:所有进程的task_struct连在一起组成了一个双向链表 3. 2.6内核的内核栈底放的是thread_info结构,其中有指向task_struct的指针: 4. current宏可以找到当前进程的task_struct:X86是通过先找到thread_info结构,而PPC是有专门的寄存器存当前task_s

Linux内核设计与实现读书笔记——第十八章

第18章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点,相比于用户级开发,内核调试的难度确实要艰苦得多.更可怕的是,它带来的风险比用户级别更高,内核的一个错误往往立刻就能让系统崩溃. 18.1 准备开始 一个bug.听起来很可笑,但确实需要一个确定的bug.如果错误总是能够重现的话,那对我们会有很大的帮助(有一部分错误确实如此).然而不幸的是,大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本.如果你知道这个bug最早出现在哪个内核版本中那就再理想不过了.

《Linux内核设计与实现》课本第四章学习总结

进程调度 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 多任务系统分为两种: 抢占式多任务:Linux提供了抢占式的多任务模式,由调度程序来决定什么时候停止一个进程的运行. 现代操作系统提供:动态时间片计算的方式:可配置的计算策略 非抢占式多任务:除非进程自己主动停止运行,否则会一直执行. 调度程序无法躲每个进程该执行多长时间作出统一规定,所以进程独占的处理器时间可能会超过用户的预料 4.2 Linux的进程调度 O(1)调度器:对大服务器的工作负载很理想:但是缺少

《Linux内核设计与实现读书笔记之系统调用》

1.系统调用的概念 为了和用户空间上运行的进程进行交互,内核提供了一组借口.透过该接口,应用程序可以访问硬件设备和其他操作系统资源.这组借口在应用程序和内核之间扮演着使者的角色.同时,这组接口也保证了系统稳定可靠,避免应用程序肆意妄行,惹出麻烦.Linux系统的系统调用作为C库的一部分提供,其调用过程中的实例如下图所示: 从程序员的角度看,系统调用无关紧要,他们只需要跟API打交道就可以了.相反,内核只跟系统调用打交道,库函数以及应用程序是怎么使用系统调用不是内核所关心的. 2.系统调用的处理程

Linux内核设计与实现——读书笔记2:进程管理

1.进程: (1)处于执行期的程序,但不止是代码,还包括各种程序运行时所需的资源,实际上进程是正在执行的 程序的实时结果. (2)程序的本身并不是进程,进程是处于执行期的程序及其相关资源的总称. (3)两个或两个以上并存的进程可以共享诸如打开的文件,地址空间等共享资源. (4)在Linux中通常是调用fork()系统函数的结果,通过复制一个现有的进程来创建一个新的子进程. fork()系统函数 (5)fork在这个系统调用结束时,在同一位置上返回两次(从内核返回两次),父进程恢复运行,子进程开始

《Linux内核设计与实现》笔记-1-linux内核简介

一.Linux内核相对于传统的UNIX内核的比较: (1):Linux支持动态内核模块.尽管Linux内核也是整体式结构,可是允许在需要的时候动态哦卸除(rmmod xxx)和加载内核模块(insmod  xxx.ko). (2):Linux支持对称多处理(SMP)机制,尽管许多UNIX的变体也支持SMP,但是传统的UNIX并不支持这种机制. (3):Linux内核可以抢占(preemptive).在Linux 2.4以及以前的版本都是不支持内核抢占的,在Linux 2.6以及以后就支持了. (

《Linux内核设计与实现》第一、二章学习笔记

<Linux内核设计与实现>第一.二章学习笔记 姓名:王玮怡  学号:20135116 第一章 Linux内核简介 一.关于Unix ——一个支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统 1.主要发展过程   1969年,贝尔实验室的程序员们设计了一个文件系统原型,最终发展演化成了Unix 1971年,Unix被移植到PDP-11型机中 1973年,整个Unix系统使用C语言进行重写,为后来Unix系统的广泛移植铺平了道路 Unix第六版(V6)被贝尔实