版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/BlueCloudMatrix/article/details/30799225

在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) 调度:无论输入有多大,调度程序都能够在恒定时间内完毕工作,这对于大server的工作负载非常理想。但在有非常多交互程序要执行的桌面环境表现不佳。

为此,2.6内核的开发者引入了著名的”反转楼梯最后期限调度算法“,也就是后来的全然公平调度算法CFS。

(2)CFS(全然公平调度):同意每一个进程执行一段时间、循环轮转、选择执行最少的进程作为下一个执行进程,而不再採用分配给每一个进程时间片的做法。CFS在全部可执行进程总数基础上计算出一个进程应该执行多久,而不是依靠优先级(nice值)来计算时间片,nice值在CFS中被作为进程获得处理器执行比的权重——更低的nice值(优先级越高)的进程获得更高的处理器使用权重。简而言之中的一个句话,以权重来取代实际的时间片。而这个调度周期则由CFS来定。为了较好的交互性。能够设置越小的调度周期,但同一时候要承受更高的切换代价和更差的系统总吞吐能力。但当进程趋于无穷时,高昂的切换开销肯定不可接受,为此CFS引入最小粒度1ms——即每一个进程最少能获得1ms的执行时间,确保切换开销被限制在一定范围内。

但这样就产生了不公平。由于会有一些进程在这个周期内得不到时间片,所以CFS并不是是一个完美的公平调度(实际上。我个人觉得不存在绝对公平的调度),只是通常情况下系统仅仅会有几百个可执行进程,所以CFS还是相当公平的:)

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

  1. [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】

     作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...

  2. Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记

    进程优先级 硬实时进程 软实时进程 普通进程 O(1)调度.完全公平调度器 抢占式多任务处理(preemptive multitasking):各个进程都分配到一定的时间段可以执行.时间段到期后,内核 ...

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

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  4. Linux高级调试与优化——进程管理和调度

    进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...

  5. linux内核设计与实现--进程管理

    进程就是出于执行期的程序.进程的另一个名字是任务. 执行线程,简称线程(thread),是在进程中活动的对象.每个线程都有一个独立的程序计数器.进程栈和一组进程寄存器.内核调度的对象是线程,而不是进程 ...

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

    如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

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

    转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

  8. 第六周——分析Linux内核创建一个新进程的过程

    "万子恵 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 &q ...

  9. Linux内核分析-创建新进程的过程

    分析Linux内核创建一个新进程的过程 task_struct结构体分析 struct task_struct{ volatile long state; //进程的状态 unsigned long ...

  10. Linux内核分析— —创建新进程的过程

    分析Linux内核创建一个新进程的过程 实验过程 要求:使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环 ...

随机推荐

  1. 往MySQL数据库datetime类型字段中插入数据库的当前时间

    代码: StringBuilder sb = new StringBuilder(); sb.append(" insert into uosdetailfile ("); sb. ...

  2. Centos 7 搭建OpenStack 私有云——(1)基础环境配置

    1.简介: OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack是一个开源的云计算管理 ...

  3. Win7如何配置java环境变量,运行环境

    直接运行eclipse,弹出错误提示.   1 确保你安装了JDK,安装之后文件夹示例如下(jdk1.x.x取决于你安装的JDK版本)   2 系统,高级系统设置,高级,环境变量新建一个JAVA_HO ...

  4. Win7提示1970-01-01 000000 is not a valid data怎么办.

    1 单击屏幕右下角的时间按钮   2 选个更改日期和时间,更改日历设置   3 把短日期改成"yyyy-m-d"   4 确定即可.发现日期的表示形式变了.

  5. Effective C++ 条款17

    以独立语句将newed对象置入智能指针 本节我们须要学习的知识核心是注意编译器在同一语句中,调用次序具有不确定性,不同语句中,调用次序确定. 上面的话什么意思? 请看下面代码: int priorit ...

  6. 【转载】Loadrunner实现Android / IOS 手机APP压力测试

    随着手机APP用户量的增大,大的手机APP一般都需要进行压力测试,这几天用了loadrunner 12进行了手机APP的压力测试,整理了下,大家可以参考参考怎样给Andorid / IOS手机APP进 ...

  7. Spring 中的Null-Safety

    之前一直在某些代码中看到过使用@Nullable 标注过的注释,当时也没有在意到底是什么意思,所以这篇文章来谈谈Spring中关于Null的那些事. 在Java中不允许让你使用类型表示其null的安全 ...

  8. Amzaon EC2虚拟化技术演进:从 Xen 到 Nitro

      今年2月,由光环新网运营的 AWS 中国(北京)区域和由西云数据运营的 AWS 中国 (宁夏)区域发布新的实例类型,新的实例类型包括 C5.C5d.R5.R5d.除了这四种之外,在AWS国外部分区 ...

  9. entity framework core 调用存储过程和方法

    目前EF Core调用存储过程,限制很多,比如返回结果必须是定义好的DbSet<>等等.这里用一种曲线救国的方式,自定义两个方法,用原始ado.net解决问题.以MySql数据库为例,代码 ...

  10. 使用Application Loader上传APP流程解读[APP公布]

    本文仅仅是提供一个公布流程的总体思路.假设没有公布经验.建议阅读苹果官方公布文档或者Google搜索具体教程. 1.申请开发人员账号:99美金的(须要信用卡支付),详细流程网上有非常多样例.自行搜索. ...