在Linux中进程用结构体task_struct来管理一个进程所需的所有信息(所以一般较大,在32位机上,大约有1.7KB)。为了提高效率,Linux使用了一些卓越的技术。
Linux创建进程迅速,正是因为slab分配器预先分配和重复使用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内核简介,进程管理,进程调度等等,是ppt
Linux内核进程调度与控制 本文档详细说明了Linux内核进程调度与控制
北航软件学院Linux内核分析课程课件 进程与进程调度部分
简短的LINUX内核的进程调度策略分析,内容包括调度时机、调度方式、调度策略。
Linux内核2.6进程调度分析与改进.pdf
纲要 1、linux进程管理的模块组织框架 2、相关数据结构。 ... 进程调度和中断处理交接 进程管理涉及的内核机制:bottom-half处理,等待队列 Linux/SMP的进程管理和调度技术 7、概述2.4的新特点
LINUX2.6内核进程调度策略分析.pdf
Linux内核的进程调度原理及改进算法研究.pdf
Linux 2.6内核进程调度策略与算法分析.pdf
linux内核进程调度.doclinux内核进程调度.doclinux内核进程调度.doclinux内核进程调度.doc
Linux内核进程调度与控制的实现.pdf
基于X86平台Linux2.6.26内核进程调度部分代码,刨析Linux进程调度算法,对算法的原理,实现和复杂度进行了分析并提出了算法改进措施。
Linux内核中进程调度的分析.PDF
第二个层次讨论了内核中系统初始化、系统调用、中断处理、进程管理及调度、内存管理、文件系统以及设备驱动等主要部分,目的是希望读者以兴趣为导向,寻找一个子系统或模块,对其代码深入钻研和分析。第三个层次介绍...
《Linux内核API完全参考手册》中分析的内核API模块包括:内核模块机制API、进程管理内核API、进程调度内核API、中断机制内核API、内存管理内核API、内核定时机制API、内核同步机制API、文件系统内核API和设备驱动及...
进程调度中的所谓调度就是从就绪队列中选择一个进程投入CPU运行,则调度的主战场就是就绪队列,核心是调度算法,实质性的动作是进程的切换。 对于以时间片为主的调度,时钟中断就是驱动力,确保每个进程在CPU上运行...
所有的现代操作系统都能够同时运行若干进程,至少用户错觉上是这样的。如果系统只有一个处理器,那么在给定时刻只有一个程序可以运行。
《Linux内核API完全参考手册》中分析的内核API模块包括:内核模块机制API、进程管理内核API、进程调度内核API、中断机制内核API、内存管理内核API、内核定时机制API、内核同步机制API、文件系统内核API和设备驱动及...
内存管理 涉及到 物理内存管理 和 虚拟内存管理 , 是 Linux 内核中 最复杂的模块 ; 虚拟内存管理 包括 : 反向映射 , KSM , MMAP 映射 , 缺页中断 , 共享内存 , 进程虚拟地址空间管理 , 页面回收 ; 物理内存管理 ...