开发人员眼中的Linux 2.6内核

深入解析Linux内核5.4中的Utilization Clamping机制及其在任务调度中的应用 本文深入解析了Linux内核5.4版本引入的Utilization Clamping(uclamp)机制。该机制允许用户或系统管理员为任务设置CPU利用率的最小和最大限制,从而精细地影响调度器的任务放置与CPU调频决策,以优化系统性能与功耗。文章详细阐述了其数据结构、核心函数(如uclamp_rq_inc_id)及在EAS调度和schedutil调频器中的应用,并提供了通过cgroup进行配置的实战指南。 阅读详情
开发人员眼中的Linux 2.6内核
2004-07-13    李庆明 张静       点击: 48
开发人员眼中的Linux 2.6内核
Linux 2.6内核的推出,无论是巩固Linux在服务器领域的主流地位,还是推进它在桌面操作系统领域的推广进程,都将起到不可估量的作用。开发人员更应从深层次的角度来考察Linux 2.6内核为应用开发带来的新变化。

内核是一个操作系统最核心的部分,它完成操作系统最基本的功能,包括进程调度、磁盘管理、设备管理、网络管理等,其实现算法或方式的优劣将直接影响到整个操作系统的性能,甚至未来在该操作系统上开发的应用程序的性能。

那么对于开发人员,新内核中的哪些特性需要特别关注呢?

内存

1.抢占式内存

和其它大多数操作系统一样,2.6版本以前的Linux内核是不允许一个被系统调用并处于运行状态的进程进行调度的。这意味着一旦系统调用中有某个任务正在执行,那么该任务会控制处理器直到系统调用结束,而不管其使用处理器时间的长短。这种设计简单,但在很多时候会导致一些重要任务在等待系统调用完成的过程中被耽搁。

2.6版内核中内存是可抢占的。这将显著地降低用户交互式应用程序、多媒体应用程序等类似程序的延迟。这一特性对实时系统和嵌入式系统来说特别有用。

可抢占式内存使Linux 2.6内核在一些时效性较强的事件中比2.4版内核具有更好的响应能力。为实现抢占式内存,Linux 2.6内核中的代码被设置了抢占点,这意味着调度程序会中止正在运行的进程,而来执行优先级更高的进程。在系统调用过程中,Linux 2.6内核会定时地检查抢占点,以避免不合理的延迟发生。而在检查过程中,调度进程很可能就会中止当前进程来让另一个进程运行。

不是所有的内核代码段都可以被抢占。用户可以锁定内核代码的关键部分,不允许其被抢占。锁定可以确保每个CPU的数据结构和状态始终受到保护而不被抢占。

2.引入内存池机制

2.6版内核的开发过程引入了内存池以满足不间断地进行内存分配。其思想是预先分配一个内存池,并保留到真正需要的时候。

3.改善虚拟内存

2.6版内核融合了Rik van Riel的r-map(Reverse Mapping,反向映射)技术,将显著改善虚拟内存在一定程度负载下的性能。

Linux内核工作于虚拟内存模式时,每一个虚拟页对应一个相应系统内存的物理页。虚拟页和物理页之间的地址转换由硬件页表来完成。但是这种“虚拟到物理”的页映射不总是一一对应的,多个虚拟页有可能指向同一个物理页。这种情况下,内核想要释放特定的物理页就必须遍历所有的进程页表记录来查找指向这个物理页的引用,只有在引用数达到0时才能释放该物理页。负载较高时,这会让虚拟内存变得非常慢。

反向地址映射补丁通过在结构页引入一个叫做pte_chain的数据结构来解决这一问题。

不过,这种方法存在一个指针开销问题。系统中的每一个结构页都必须有一个额外的、用于pte_chain的结构。一个256MB内存的系统有64K个物理页,这就需要有64KB*(sizeof(struct pte_chain))的内存被分配用于pte_chain的结构,这是一个很可观的数字。

尽管如此,r-map的性能,尤其是高负载的高端系统,相对于2.4版内核的虚拟内存系统还是有了显著地提高。

4.共享内存的改进

对于嵌入式系统开发人员而言,嵌入式系统往往是一个有多个处理器的设备,比如电信网络或大型存储系统中都是如此。不论是均衡或是松散连接的多处理器,一般都是共享内存的。均衡多进程的设计使所有的处理器都对内存有均等使用权,而限制使用内存的决定性因素是进程的效率。

Linux 2.6内核为多程序提供了一种不同的途径,即NUMA(Non Uniform Memory Access)。这种方法中,内存和处理器是相互连接的,但对于每一个处理器,某些内存是“关闭”的,而某些内存则“更远”。这意味着当内存竞争出现时,“更近”的处理器对就近的内存有更高的使用权。2.6版内核提供了一套功能来定义内存和处理器之间的拓扑关系。调度程序可以利用这些信息来为任务分配本地内存。这样将减少内存竞争造成的瓶颈,提高吞吐量。

驱动程序

1.中断例程的改进

2.6版内核的中断处理程序内部经历了许多变化,但是绝大部分对于普通的驱动程序开发者来说没有影响。不过,还是有一些重要的变化会影响到驱动程序开发者。在2.6版内核中,驱动程序如果要从一个设备上发出中断需要返回IRQ_HANDLED,否则返回IRQ_NONE。这样可以帮助内核的IRQ层清楚地识别出哪个驱动程序正在处理哪个特定的中断。

如果一个中断请求不断到来,而且没有注册那个设备的处理程序,内核就会忽略来自该设备的中断。

2.驱动程序移植

相对于2.4版内核来说,2.6版内核改进了内核编译系统,从而获得更快的编译速度。2.6版内核的编译系统加入了改进的图形化工具make xconfig(需要Qt库)和make gconfig(需要Gtk库)。

内核模块加载器也在2.6版内核中被完全实现,使得模块编译机制相对于2.4版内核有了很大的不同。原来2.4版内核中的模块工具不能用来加载或卸载2.6版内核的模块,需要一组新的模块工具来完成模块的加载和卸载。这个新的模块加载工具会尽量减少在一个设备仍被使用的情况下,相应的模块却被卸载的冲突发生,而是在确认这些模块已经没有任何设备在使用后再卸载掉。产生这种冲突的原因之一是,模块使用计数是由模块代码自己来控制的。在2.6版内核中,模块不再需要对引用计数进行加减,这些工作将在模块代码外部进行。

进程管理

1.新调度器算法

2.6版本的Linux内核使用了新的调度器算法,称为O(1)算法,它在高负载的情况下执行得非常出色,并在有多个处理器时能够很好地扩展。

2.4版本的调度器中,时间片重算算法要求在所有的进程都用尽它们的时间片后,新时间片才会被重新计算。在一个多处理器系统中,当进程用完它们的时间片后不得不等待重算,以得到新的时间片,从而导致大部分处理器处于空闲状态,影响SMP的效率。此外,当空闲处理器开始执行那些时间片尚未用尽的、处于等待状态的进程时,会导致进程开始在处理器之间“跳跃”。当一个高优先级进程或交互式进程发生跳跃时,整个系统的性能就会受到影响。

新调度器解决上述问题的方法是,基于每个CPU来分布时间片,并取消全局同步和重算循环。调度器使用了两个优先级数组,即活动数组和过期数组,可以通过指针来访问它们。活动数组中包含所有映射到某个CPU且时间片尚未用尽的任务。过期数组中包含时间片已经用尽的所有任务的有序列表。如果所有活动任务的时间片都已用尽,那么指向这两个数组的指针互换,包含准备运行任务的过期数组成为活动数组,而空的活动数组成为包含过期任务的新数组。数组的索引存储在一个64位的位图中,所以很容易找到最高优先级的任务。

新调度器的主要优点包括:

◆ SMP效率 如果有工作需要完成,所有处理器都会工作。

◆ 等待进程 没有进程需要长时间地等待处理器,也没有进程会无端地占用大量的CPU时间。

◆ SMP进程映射 进程只映射到一个CPU,而且不会在CPU之间跳跃。

◆ 优先级 非重要任务的优先级低,反之亦然。

◆ 负载平衡 调度器会降低那些超出处理器负载能力的进程的优先级。

◆ 交互性能 即使在高负载的情况下,系统花费很长时间来响应鼠标点击或键盘输入的情况也不会再发生。

2.高效的调度程序

2.6版内核中,进程调度经过重新编写,调度程序不需每次都扫描所有的任务,而是在一个任务变成就绪状态时将其放到一个名为“当前”的队列中。当进程调度程序运行时,只选择队列中最有利的任务来执行。这样,调度可以在一个恒定的时间里完成。当任务执行时,它会得到一个时间段,或者在其转到另一线程之前得到一段时间的处理器使用权。当时间段用完后,任务会被转移到另一个名为“过期”的队列中。在该队列中,任务会根据其优先级进行排序。

从某种意义上说,所有位于“当前”队列的任务都将被执行,并被转移到“过期”队列中。当这种事情发生时,队列就会进行切换,原来的“过期”队列成为“当前”队列,而空的“当前”队列则变成“过期”队列。由于在新的“当前”队列中,任务已经被排列好,调度程序现在使用简单的队列算法,即总是取当前队列的第一个任务进行执行。这个新过程要比老过程快得多。

3.新的同步措施

多进程应用程序有时需要共享一些资源,比如共享内存或设备。为了避免竞争的出现,程序员会使用一个名为互斥的功能来确保同一时刻只有一个任务在使用资源。到目前为止,Linux还是通过一个包含在内核中的系统调用来完成互斥的实现,并由该系统调用决定一个线程是等待还是继续执行。

Linux 2.6内核支持FUSM(Fast User-Space Mutex)。这个新功能会检查用户的空间,查看是否有等待的情况出现,并且只有在线程需要等待时才进行系统调用。这样当不需要等待时,就会避免不必要的系统调用,以节约时间。该功能也使用优先级调度,以便在出现竞争时决定哪一个线程可以被执行。

综上所述,2.6版内核对于开发人员提供了更加快捷、方便的接口,从而可以开发出更加快速、高效的应用。同时,2.6版内核也解决了一些在2.4版内核中因为内核瓶颈造成的不便,比如实时性问题等。Linux还会不断地发展,这也将促使应用开发不断地发展进步。
Linux2.6内核总结 Linux2.6内核总结,供大家学习参考。。 立即下载

相关推荐

linux内核2.6linux内核4.0的区别

这种方法的好处是,它允许同一个 Makefile 在两个不同的上下文中工作:一次是作为一个外部模块的构建脚本,一次是作为内核构建系统的一部分。总之,从 2.6 到 4.0,Linux 内核经历了巨大的发展,不仅在性能和稳定性上有所提高,还引入了许多新的功能和技术。指向的是你当前运行的 Linux 内核版本的源代码目录。是在 Linux 内核构建过程中设置的一个变量,它包含了正在构建的内核的版本。综上所述,这个命令的作用是:在当前目录中查找源代码,然后在内核构建系统的上下文中编译这些源代码为内核模块。

Ecoman123的博客 1298

Linux内核学习(三)—— 进程调度(基于Linux 2.6内核

所有的调度器必须堆进程运行时间做记账,CFS虽然不再有时间片的概念,但是它也必须维护每个进程的运行时间记账,每次系统时钟节拍发生时,时间片都会被减少一个节拍周期,当一个进程的时间片被减少到 0 时,它就会被另一个尚未减到 0 的时间片可运行进程抢占。因此这种进程所需要占用处理器运行的时间很短,因为他们在等待I/O时最后总会自己阻塞(这里说的I/O指任何类型的可阻塞资源,如键盘输入,或网络I/O,实际处理输入的时间很少,大部分时间都在等待输入的到来)。

欢迎一起交流问题! 1666

Linux内核学习(包含Linux 2.6内核编译安装流程)

Linux内核官方网站为:http://www.kernel.org或者使用git将源码clone下来(我这里使用的版本为2.6): clone下来的源码目录结构如下: 其中比较重要的目录的官方描述如下: 对应的中文描述如下: 2、升级GCC版本 由于腾讯云初始gcc版本为4.8.5,而编译内核需要的最低版本为5.1.0,所以需要安装高于5.1.0版本的gcc。 设置devtoolset-7 为默认的gcc编译器 : 再用gcc -v指令查看gcc版本可以看到已经升级到7.3.1了

欢迎一起交流问题! 4145

linux-2.6.22.6内核i2c驱动框架源码分析

接下来就是发数据了,这个过程是由8个数据位和一个ack位组成,如果是读,这8位数据由从机驱动,第9位ack由主机发出(因为此时是主机向从机读数据,主机需要确认是否收到数据),如果是写,则这8位由主机驱动,第9位ack由从机发出,发数据这个过程是可以反复进行的,一旦发送或者读取完成,主机就会发出一个停止信号(SDA由低变高)来结束通信,这所有的过程都是在SDA上进行的。开发一个i2c驱动时,我们只需关心从设备部分,主要提供主机控制器操作所需要的从设备信息,这就是另一部分。i2c框架主要分为两大部分,

qq_34429554的博客 695

mini2440 + Linux-2.6.38.2内核移植USB驱动挂载U盘

mini2440 + Linux-2.6.38.2内核移植USB驱动挂载优盘

wuhuiskt的博客 986

Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)

最近一头扎进了 Linux 内核的学习中,Linux 内核的学习,需要的基础知识太多太多了:C 语言、汇编语言、数据结构算法、操作系统原理、计算机组成原理、计算机体系结构。在囫囵吞枣补完一些计算机基础知识后,还是在一开始就被一个小小的 offsetof 宏搞晕了。 文末附上小编整理Linux内核开发学习知识点总结以及思维导图,供参考 offsetof 宏 先来看看offsetof宏是什么,这是定义在 <linux/stddef.h>中的一个宏,用来计算一个 struct 结构体中某个成员

Linuxhus的博客 1799

心中的Linux内核 —— 在阅读内核代码之前先理解内核 专栏

这并非一部教你编写内核代码的指南,而是一场探寻Linux内核设计思维的思想之旅。在系统编程的世界里,人们常常迷失于符号定义、头文件结构与实现细节的丛林中。然而剥离代码表象,内核实则是一个井然有序的响应式系统——它受上下文环境所规约,以分离原则为基石,从内存管理到任务调度的每一处设计,都浸透着精准的设计意图。本系列内容专为那些渴望在内核源码之外构建内核运行心智模型的探索者而作。无论你是初次叩响Linux内核内部机制的大门,还是带着全新思考重返这片领域,我们聚焦的核心始终是行为逻辑,而非语法细节。

左雪菲的专栏 937

曾遭 Linus 炮轰“很烂”的 C++,现受开发者支持:Linux 内核应从 C 转到 C++!

C 和 C++ 已经天差地别。“我是作为内核中大量宏和内联汇编 Hacks 的作者才这么说的”,H. Peter Anvin 说道,“让我有此感觉的真正原因是,Linux 最近提出的许多针对 GCC 扩展的要求,其实在标准 C++ 中很容易实现,而且在许多情况下,无需修改全局代码即可改进基础架构。H. Peter Anvin 认为,自 1999 年以来,C 和 C++ 都有了长足的发展,而站在其视角,他发现 C++ 终于“长大”了,对于操作系统内核所体现的嵌入式编程而言,它是一种更好的 C 语言。

m0_46163918的博客 6092

眼中的git

其实,对于我来说,虽然已经学习了快6年的信息工程,但我还没有涉及Git这个方面,但我对于它还是有些了解的!第一次听到这个名词还是在半年前吧!当时老师在课堂上对我们说了这个单词,我当时不是很懂,就想认识一下这个朋友。百度上说:Git是一种控制类型的系统,可以快速的去处理各种复杂的工作!我想Git的读音应该是盖特吧。 Torvalds 开始着手开发 Git 是为了作为一种过渡的手段来替代 BitKe...

weixin_34043301的博客 82

程序员眼中最好的十大Linux发行版

程序员最喜欢的Linux发行版是什么?相信每个程序员都会有自己的选择。首先Linux发行版必须允许你微调开发环境,并可以编写代码。今天,就帮大家推荐10款2018年最佳的Linux发行版,当然是针对程序员的!1. Arch LinuxArch Linux在安装过程中提供强大的自定义级别,允许你仅下载和安装所需的软件包。虽然这绝对不适合新手编程,但你可以使用Arch Build System和Arc...

weixin_33937913的博客 3289

Linus收敛火爆脾气,谈内核社区“老龄化”问题

例如,在驱动程序方面,你会更容易找到年轻人,而这也是我们培养大量维护者的传统方式,包括 Greg。就经常被提及的内核维护人员疲态和压力问题,Linus 首先否认了维护者必须是一个 “无所不能的超级开发者” 角色的说法,“要成为一名维护者,你必须有一定的品味来评判其他人的代码。对我来说,Rust 是具有技术意义的事物之一,但对我个人来说,更重要的是作为内核开发人员,我们不能停滞不前。但问题在于,大家基本需要保持一个随时在线的工作状态,无法自由的安排假期,除非是可以找到能换班的其他维护者。

IT界那些事儿 139

眼中的 Docker(一)docker、vm、lxc

前言 docker 是什么?docker 能干什么?docker 为什么这么火?相信不少人都有这个疑问。我也有。觉得 docker 涉及到的技术太多了,从 linux 内核到各种云计算的解决方案,对于我来说实在是有点艰难的。然而学了一个月的 docker 相关的东东,还是想简单谈谈,说一下我的理解,希望对 docker 的初学者有所帮助。

Just Coding! 9338

聊聊 Linux 的内存统计

点击上方“小强的进阶之路”,选择“星标”公众号优质文章,及时送达预计阅读时间: 18分钟写在前面本文主要分析 Linux 系统内存统计的一些指标以及进程角度内存使用监控的一些方法。开始阅...

weixin_31351409的博客 622

拔开云雾的linux网络

拔开云雾的linux网络

landyjzlai的博客 573

32linux进程线程在内存中的样子

如下图,没有线程概念的时候,只有进程的概念,系统以进程为调度单位。此时进程相当于单线程的进程(创建进程时,里面有一个函数入口称之为主线程),可以这么来理解。 后来出现了线程概念,为啥?因为多核心的出现,为了更好的发挥多核心的能力,榨干cpu。为啥出现多核心?因为主频提升遇到了瓶颈,现在3GHz等已经好多年了,你有见过10GHz,100GHz主频的cpu么?估计几百年都难哩。那主频遇到了瓶颈,该咋提高soc性能呢?那就数量来凑,于是多核心时代来临。那么为啥主频能提高性能呢?因为主频越高,单位时间内执行的指令就

huibin.yun的博客 364

大数据基础教程:Linux如何理解

大数据基础教程:Linux如何理解 Linux是一种计算机操作系统。Linux和Windows操作系统是现在使用最广泛的两种操作系统,安卓操作系统也是基于Linux内核开发而来的。那么,今天小编将带领大家来认识一下Linux操作系统,赶快来学习下吧! 1、Linux是免费的 Linux内核是由芬兰人李纳斯·托瓦兹编写的,后来又经过全世界各地的程序开发人员的努力,共同开发的一款免费的操作系统。Linux操作系统是GPL协议的,这意味着任何人都可以免费使用该软件,而且不必支付费用。 2Linux是一个面向程

qq_38397646的博客 128

即使在微软 Azure 上,Linux 也大有一统天下之势!

【CSDN编者按】微软曾一度视Linux之父Linus为眼中钉,Linux从一开始就开源。而微软在开源的大门外徘徊多年,终于叩开开源之门。但是即便如此,微软的Azure相...

CSDN资讯 1700
上一篇: 基于Linux的实时系统
下一篇: 用GDB调试 GCC 程序
sah
sah
博客等级 码龄23年 21粉丝 8原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值