Linux内核设计基础(九)之进程管理和调度

在Linux中进程用结构体task_struct来管理一个进程所需的所有信息(所以一般较大,在32位机上,大约有1.7KB)。为了提高效率,Linux使用了一些卓越的技术。

  • 通过slab分配task_struct结构

Linux创建进程迅速,正是因为slab分配器预先分配和重复使用task_struct,这样就避免了动态分配和释放所带来的资源消耗(毕竟一个task_struct较大,而且内核中进程的创建和消除很频繁)。

  • 将task_struct放置在内核栈的尾端

这样做是为了让那些像x86那样寄存器较少的硬件体系结构只需通过栈指针就能计算出它的位置,而避免使用额外的寄存器专门记录。由于linux使用slab动态给一个进程分配task_struct,所以linux在栈底(向下增长的栈,如图,高地址在上,且栈从高地址向低地址延伸)用一个数据结构指向slab中为之分配的task_struct,而这个数据结构是结构体thread_info,它的一个成员是指向task_struct的指针。

  • 写时拷贝

Linux创建一个进程要依次调用fork()和exec()。fork()创建子进程时,父进程和子进程共享同一份资源(以只读的方式共享),而只有当需要写入时,数据才会被复制,从而使各个进程拥有各自的拷贝,这种将拷贝推迟到实际发生写入时的技术称为写时拷贝。但对于那些fork()后立即调用exec()的就不用复制了(与父进程共享一份资源即可),因为这时不会发生写入,而大多数情况下,进程创建后会马上运行一个可执行的文件,所以这种写时拷贝可以避免拷贝大量根本就不会被使用的数据。这也是Linux能快速执行进程的原因。

  • 强大的进程调度算法

多任务给Linux的效率提出了严峻的挑战。既要有并发的效果,又要保证公平。当代多数现代操作系统是在时间片和抢占上下功夫,从全局的角度让每个进程获得各自理想的时间片。但Linux独树一帜,它并没有采取时间片达到公平调度。

(1)O(1) 调度:不管输入有多大,调度程序都可以在恒定时间内完成工作,这对于大服务器的工作负载很理想。但在有很多交互程序要运行的桌面环境表现不佳。为此,2.6内核的开发人员引入了著名的”反转楼梯最后期限调度算法“,也就是后来的完全公平调度算法CFS。

(2)CFS(完全公平调度):允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,而不再采用分配给每个进程时间片的做法,CFS在所有可运行进程总数基础上计算出一个进程应该运行多久,而不是依靠优先级(nice值)来计算时间片,nice值在CFS中被作为进程获得处理器运行比的权重——更低的nice值(优先级越高)的进程获得更高的处理器使用权重。简而言之一句话,以权重来代替实际的时间片。而这个调度周期则由CFS来定,为了较好的交互性,可以设置越小的调度周期,但同时要承受更高的切换代价和更差的系统总吞吐能力。但当进程趋于无穷时,高昂的切换开销肯定不可接受,为此CFS引入最小粒度1ms——即每个进程最少能获得1ms的运行时间,确保切换开销被限制在一定范围内。但这样就产生了不公平,因为会有一些进程在这个周期内得不到时间片,所以CFS并非是一个完美的公平调度(实际上,我个人认为不存在绝对公平的调度),不过通常情况下系统只会有几百个可运行进程,所以CFS还是相当公平的:)

Linux内核设计基础(九)之进程管理和调度

时间: 2024-10-11 05:48:29

Linux内核设计基础(九)之进程管理和调度的相关文章

linux内核学习笔记-2.进程管理

部分内容来自:Linux Kernel Development(Third Edition),Robert Love,陈莉君等译. 1.进程 进程是正在执行的程序代码的实时结果,包含打开的文件.挂起的信号等.线程是进程中的活动的对象,内核调度的对象是线程.在Linux内核对线程与进程并不加以区分,线程只不过是一种特殊的进程. 2.进程描述符 内核把进程的信息存放在task list的双向循环链表中,链表中的每一项都是类型为task_struct.成为进程描述符的的结构,包含一个具体进程的所有信息

Professional Linux Kernel Architecture - 学习笔记.进程管理和调度

1.相关概念. 1.程序.进程.线程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次执行活动,属于动态概念.允许多个程序同时加载到内存中,在操作系统的调度下,可以实现并发地执行.这是这样的设计,进程的出现让每个用户感觉到自己独享CPU. 线程是进程的一个实体, 是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,

Linux内核设计基础(五)之内存管理

我感觉学习操作系统首先要从内存分配和管理入手.首先我们应该知道现代操作系统是以页为单位进行内存管理的,32位体系结构支持4KB的页,而64位体系结构支持8KB的页.页是用来分配的,如何才能进行高效和充分的利用,这是内存管理单元(MMU)应当仔细考虑的. 页分配 内核用结构体struct page表示每个物理页.内核用这一结构来管理系统中所有的页,因为内核需要知道一个页是否空闲(也就是页有没有被分配),如果页已经被分配,内核需要知道谁拥有这个页,拥有者可能是用户空间进程.动态分配的内核数据.静态内

Linux内核——进程管理与调度

进程的管理与调度 进程管理 进程描述符及任务结构 进程存放在叫做任务队列(tasklist)的双向循环链表中.链表中的每一项包含一个具体进程的所有信息,类型为task_struct,称为进程描述符(process descriptor),该结构定义在<linux/sched.h>文件中. Linux通过slab分配器分配task_struct结构,这样能达到对象复用和缓存着色(cache coloring)的目的.另一方面,为了避免使用额外的寄存器存储专门记录,让像x86这样寄存器较少的硬件体

深入Linux内核架构——进程管理和调度(上)

如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停切换做到的.由此,以下两个问题必须由内核解决:除非明确要求,否则应用程序不能彼此干扰:CPU时间必须在各种应用程序之间尽可能公平共享(一些程序可能比其他程序更重要).本篇博文主要涉及内核共享CPU时间的方法以及如何在进程之间切换(内核为各进程分配时间,保证切换之后从上次撤销其资源时执行环境完全相同)

【读书笔记】《Linux内核设计与实现》进程管理与调度

大学跟老师做嵌入式项目,写过I2C的设备驱动,但对Linux内核的了解也仅限于此.Android系统许多导致root的漏洞都是内核中的,研究起来很有趣,但看相关的分析文章总感觉隔着一层窗户纸,不能完全理会.所以打算系统的学习一下Linux内核.买了两本书<Linux内核设计与实现(第3版)>和<深入理解Linux内核(第3版)> 0x00 一些废话 面向对象思想. Linux内核虽然是C和汇编语言写的,没有使用面向对象的语言,但里面却包含了大量面向对象的设计.比如可以把内核中的进程

Linux进程管理与调度-之-目录导航【转】

转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http://blog.csdn.net/gatieme 目录(?)[-] 项目链接 进程的描述 进程的创建 进程的加载与运行 进程的退出 进程的调度 调度普通进程-完全公平调度器CFS 日期 内核版本 架构 作者 GitHub CSDN 2016-07-21 Linux-4.6 X86 & arm gatieme

Linux内核设计基础(十)之内核开发与总结

(1)Linux层次结构: (2)Linux内核组成: 主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET)和进程间通信(IPC)等5个子系统组成. (3)与Unix的差异: Linux支持动态加载内核模块 支持对称多处理(SMP)机制 Linux内核可以抢占 Linux内核并不区分线程和其他的一般进程 Linux提供具有设备类的面向对象的设备模型.热插拔事件,以及用户空间的设备文件系统(sysfs) (4)内核开发的特点: 内核编程时既不能访问C库也不能访

Linux内核设计基础(六)之块I/O层

块设备是指能随机访问固定大小数据片的设备,如硬盘:字符设备(如串口和键盘)是按照字符流的方式有序访问.区别在于是否可以随机访问数据--也就是能否在访问设备时随意地从一个位置跳转到另一个位置.我们可以感觉到块设备的控制要比字符设备复杂多,实际上内核在块设备上下了大工夫--块I/O层. 基础概念 块设备中最小的可寻址单元是扇区. 文件系统的最小寻址单元是块. 所谓的缓冲区是块在内存中的表示. 对于一个缓冲区(块),内核需要知道它的控制信息,这时需要一个结构进行描述--缓冲区头. I/O调度机制 首先