首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux O(n)调度器

前面我们学习了调度器的设计需要关注的几个点,在这里复习下: 吞吐量(对应的是CPU消耗型进程) 响应速度(对应的是IO消耗型进程) 公平性,确保每个进程都可以有机会运行到 移动设备的功耗 Linux中调度器的设计...实时进程采用两种调度策略SCHED_RR或者SCHED_FIFO 普通进程采用nice值进行动态调整普通进程的优先级 经常睡眠的进程尝试增大下优先级,经常长占CPU的适当减少优先级 本节我们先来学习Linux...早期的调度算法的设计,先从最早的调度器算法开始,此调度器时间复杂度是O(n),所以也可以称为O(n)调度算法。...我们选择的内核版本是linux-2.4.19。 O(n)调度器的实现原理 O(n)代表的是寻找一个合适的进程的时间复杂度。...总之O(n)调度器有很多问题,不过有问题肯定要解决的。所以在Linux2.6引入了O(1)的调度器。

3.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

谈谈调度 - Linux O(1)

约莫十五年前,当我刚刚开始参加工作时,赶上 Linux 发布划时代的 2.6 内核。在这个大家都翘首期盼的内核版本中,最令人兴奋的便是 O(1) scheduler。本文来谈谈这个算法是如何实现的。...2.4 scheduler 的问题 Linux 2.4 scheduler 支持 SMP(Symmetric Multi-Processing),然而,由于只用一个 global runqueue,各个...谈到搜索,大家第一反应是 hash table 是 O(1) 时间复杂度的。然而,它在最坏情况下是 O(N) 的。除此之外,没有任何算法能在最坏情况下 search 也是 O(1)。...linked list,stack,queue 在平均和最坏情况下都是 O(1),而大家脑海里的 hash table,同样的,虽然平均是 O(1),但最坏情况是 O(N)。...在其刚问世时,很多 linux 发行版就迫不及待将其移植回 2.4 kernel。而程序君整个职业生涯中接触过的一些调度器中,都能见到 bitarray + priority queue 的身影。

1.8K80

Linux O(1)调度器

O(n)调度器的种种问题,linux内核社区则在2.6内核版本引入了O(1)调度器,当然了引入的目的也正是要解决O(n)调度器面临的问题。...我们这片文章以Linux2.6.2版本来学习,在Linux内核文档中有一篇关于O(1)调度器的目的,如何设计的,以及实现有一个详细的介绍:sched-design.txt文档,有兴趣的可以去阅读。...从以上几点来看,可以看出O(1)的算法的改进都是针对O(n)算法存在的问题来修改的。...总结: O(1)调度器的引入主要是为了解决O(n)调度器的不足 O(1)调度器在赏罚机制上比O(n)调度器考虑的因素比较多,不再时像O(1)那样直接考时间片的大小来调度 但是O(n)和O(1)调度算法上核心还是通过判断一个进程的行为...如果去看O(1)调度器的实现,没有O(n)算法那么简单明了,O(1)中加了需要时间的判断,各种情况的考虑,导致代码的阅读性很差,读起来很费劲。

2.8K21

Linux进程调度之 - O(1)调度算法

Linux是一个支持多任务的操作系统,而多个任务之间的切换是通过 调度器 来完成,调度器 使用不同的调度算法会有不同的效果。...Linux2.4版本使用的调度算法的时间复杂度为O(n),其主要原理是通过轮询所有可运行任务列表,然后挑选一个最合适的任务运行,所以其时间复杂度与可运行任务队列的长度成正比。...而Linux2.6开始替换成名为 O(1)调度算法,顾名思义,其时间复杂度为O(1)。...虽然在后面的版本开始使用 CFS调度算法(完全公平调度算法),但了解 O(1)调度算法 对学习Linux调度器还是有很大帮助的,所以本文主要介绍 O(1)调度算法 的原理与实现。...由于在 Linux 内核中,任务和进程是相同的概念,所以在本文混用了任务和进程这两个名词。

4.6K81

linux下的so、o、lo、a、la文件的区别

o: 编译的目标文件 a: 静态库,其实就是把若干o文件打了个包 so: 动态链接库(共享库) lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息 la: 使用libtool编译出的库文件...当编译过程到link阶段的时候,如果有下面的命令: $libtool –mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la libtool会到/...比如上面那个例子, $libtool –mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la 如果liba.so不是使用libtool工具生成的,...$ unicore32-Linux-gcc –o myprog /usr/lib/liba.so \ -Wl,–rpath-link -Wl,/home/UNITY_float/install/usr/...libtool中有一个变量“hardcode_libdir_flag_spec”,该变量本来是传递“-rpath”选项的,但我们可以修改它,添加我们需要的路径,传递给unicore32-linux-gcc

8.5K30

xmake从入门到精通9:交叉编译详解

例如: arm-linux-armeabi-ar arm-linux-armeabi-as arm-linux-armeabi-c++ arm-linux-armeabi-cpp arm-linux-armeabi-g...,那么我们可以追加--cross=配置编译工具前缀名,例如: $ xmake f -p linux --sdk=/usr/toolsdk --bin=/opt/bin --cross=armv7-linux...- 设置c/c++编译器 如果还要继续细分选择编译器,则继续追加相关编译器选项,例如: $ xmake f -p linux --sdk=/user/toolsdk --cc=armv7-linux-clang...设置c/c++连接器 如果还要继续细分选择链接器,则继续追加相关链接器选项,例如: $ xmake f -p linux --sdk=/user/toolsdk --ld=armv7-linux-clang...++ --sh=armv7-linux-clang++ --ar=armv7-linux-ar ld指定可执行程序链接器,sh指定共享库程序链接器,ar指定生成静态库的归档器。

1.6K30

动态库与静态库优缺点比较分析_c静态库和动态库的区别

linux下的静态库和动态库为例我们研究一下,首先我们看一下他们的生成方式 静态库: 首先将源文件编译成目标文件:gcc –c a.c b.c 生成静态库:ar –rc libstatic.a a.o...4.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步 Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库...中编译静态库(.a)和动态库(.so)的基本方法 (四) 静态库 在linux环境中, 使用ar命令创建静态库文件.如下是命令的选项: d —–从指定的静态库文件中删除文件...m —–把文件移动到指定的静态库文件中 p —–把静态库文件中指定的文件输出到标准输出 q —–快速地把文件追加到静态库文件中 r —–把文件插入到静态库文件中...比如创建一个静态库文件的命令如下: ar r libapue.a error.oerrorlog.o lockreg.o 这样就了libapue.a静态库文件, 可以用 t 选项显示包含在库中的文件

3.1K20

Makefile学习1

Linux环境下,安装了GCC编译器,在程序的安装目录下面会有各种二进制可执行文件: cpp:预处理器 ccl:编译器 as:汇编器 ld:链接器 ar:静态库制作工具 程序在编译过程中会分别使用这些工具...Makefile命令 命令一般由shell命令(echo、ls)和编译器的一些工具(gcc、ld、ar、objcopy等)组成,使用tab键缩进。 命令是make在编译程序时真正要执行的部分。...= arm-linux-gnueabi-gcc #不执行 $(BIN): $(OBJS) @echo $(CC) $(CC) -o $(BIN) $(OBJS) 追加赋值是指一个变量,以前已经被赋值...,现在想给它增加新的值,此时可以使用+=追加赋值。...当一个追加变量在定义时使用了override,后续对它的值进行追加时,也需要使用带有override指示符的追加方式。否则对此变量值的追加不会有效。

30610
领券