Linux内核之 进程管理】的更多相关文章

如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停切换做到的.由此,以下两个问题必须由内核解决:除非明确要求,否则应用程序不能彼此干扰:CPU时间必须在各种应用程序之间尽可能公平共享(一些程序可能比其他程序更重要).本篇博文主要涉及内核共享CPU时间的方法以及如何在进程之间切换(内核为各进程分配时间,保证切换之后从上次撤销其资源时执行环境完全相同)…
五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进程分别计算时间片,使进程运行直至时间片用尽,所有进程的所有时间片用完时,需要重新计算.相比之下,CFS只考虑进程等待时间,即进程在就绪队列(run_queue)中已等待的时间,对CPU时间需求最严格的进程被调度执行.每次调度器会挑选具有最高等待时间的进程提供CPU,如此进程的不公平等待不会被积累,而…
正如上一篇我们提到过,进程是Linux系统中仅次于文件的基本抽象概念.正在运行的进程不仅仅是二进制代码,而是数据.资源.状态和虚拟的计算机组成.我们今天主要介绍进程的概念,组成,运行状态和生命周期等. 1.进程的概念 进程就是处于执行器的程序(目标代码放在某种存储介质上). 但进程并不仅仅局限于一个可执行程序代码,通常还要包含其他资源,比如: 打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间,一个或多个可执行线程,存放全局变量的数据段等. 内核需要有效而又透…
内核版本:linux-2.6.11 在Linux中,有多种执行体(指令流.执行单位),它们是CPU调度和分配资源的基本单位,它们是内核态可见的,即内核态下,每一种执行体都有对应的唯一数据结构task_struct来存储它的执行上下文. 它们分别是进程.轻量级进程.内核线程,创建一个执行体的方法是基于调用clone()函数并指定flags参数来完成. 通过指定不同的flags参数,可以规定新建的执行体的共享资源量.执行状态等,也正是于此来区分不同的执行体并控制不同执行体的运行开销.切换开销. ta…
内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你这一切. 线性区 一个可执行程序,是经过编译器处理后的遵守一定规则的数据.符号表和指令序列的组合,当linux加载一个可执行程序的时候,会为其创建一个新的进程,其对应的进程描述符task_struct中会保存许多资源的描述符,其中的mm_struct就是这个进程的内存描述符,用来管理该进程拥有的所有…
昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内存和内核的可用内存,还会讲到内核对内存分类的方式以及如何决定分配和释放内存,内存管理是应用程序通过软硬件协助来访问内存的一种方式,这里我们主要是介绍操作系统正常运行对内存的管理.插个话题,刚才和姐姐聊天,她快结婚了,说起了自己的初恋,可能是一句很搞笑的话,防火防盗防初恋,,嘎嘎,这个好像是的吧,尽管…
Linux内核之进程和系统调用 什么是系统调用 在Linux的世界里,我们经常会遇到系统调用这一术语,所谓系统调用,就是内核提供的.功能十分强大的一系列的函数.这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现.系统调用是用户程序和内核交互的接口. 为什么要有系统调用 系统调用在linux系统中发挥着巨大的作用,如果没有系统调用,那么应用程序就失去了内核的支持. 我们在编程时用的很多函数,如fork.open等这些函数最终都是在系统调用里…
Linux内核之内存管理 Linux利用的是分段+分页单元把逻辑地址转换为物理地址; RAM的某些部分永久地分配给内核, 并用来存放内核代码以及静态内核数据结构; RAM的其余部分称动态内存(dynamic memory); 整个系统的性能取决于如何有效的管理动态内存; 尽力优化对动态内存的使用, 尽量做到需要时使用, 不需要时释放; 内核如何给自己分配动态内存: 页框管理和内存区管理对连续内存去处理的两种不同的技术; 非连续区的管理是处理不连续内存去的一种技术; 内存管理必须知道的几个主题技术…
都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲的全是进程,这点在大二的时候就困惑了我,结果那个时候我就止步不前了,这里主要讲的是为何引入进程.进程在Linux空间是如何实现的,并且描述了所有与进程执行相关的数据结构,最后还会讲到异常和中断等异步执行流程,它们是如何和Linux内核进行交互的,下面我就来具体介绍一下进程的奥妙. 首先我们要明确一个概念,我们说的程序是指由一组函数组成的可执行文…
Linux内核之进程地址空间 内核中的函数以相当直接了当的方式获得动态内存: __get_free_pages 或 alloc_pages从分区页框分配器中获得页框; kmem_cache_alloc或kmalloc使用slab分配器为专用或通用对象分配块; vmalloc获得一块非连续的内存块; 返回一个页描述符地址或线性地址; 内核是操作系统中优先级最高的成分; 内核信任自己; 内核总是尽量推迟给用户态进程分配动态内存; 内核必须能随时准备捕获用户态进程引起的所有寻址错误; 当用户态进程请求…