linux 博客园,linux最好用的系统
老铁们,大家好,相信还有很多朋友对于linux 博客园和linux最好用的系统的相关问题不太懂,没关系,今天就由我来为大家分享分享linux 博客园以及linux最好用的系统的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
linux线程调度策略
从Linux 2.6.23起,默认调度器为CFS(Completely Fair Scheduler),取代了O(1)调度器。CFS调度策略的详细信息可在sched-design-CFS中查阅,且cgroup的CPU调度为CFS扩展的一部分。
内核使用调度器决定下一个CPU周期执行的线程。每个线程包含调度策略与静态优先级sched_priority,调度器基于系统上所有线程的策略与优先级来决定调度。
对于SCHED_OTHER、SCHED_IDLE、SCHED_BATCH策略的线程,sched_priority不影响调度结果,且必须设为0。实时策略SCHED_FIFO与SCHED_RR线程的sched_priority取值为1至99,实时线程优先级高于普通线程。
调度器为每个sched_priority维护运行线程列表。调度器查看非空且优先级最高的列表,选择首部元素作为下个执行线程。
调度策略决定了如何根据静态优先级将线程插入相同优先级的线程列表,以及如何调整线程位置。所有调度具有抢占性,较高优先级线程准备运行时会抢占当前线程,并返回到相同优先级的等待列表。
进程调度包括两个队列:进程初始进入ready队列等待调度,遇到I/O阻塞、子进程结束或软中断等会进入wait队列,阻塞解除后返回ready队列。
SCHED_FIFO:First in-first out调度策略适用于静态优先级大于0的线程,线程立即抢占所有运行的SCHED_OTHER、SCHED_BATCH或SCHED_IDLE线程。不使用时间片,SCHED_FIFO策略线程应遵守规则。
SCHED_RR:轮询调度策略增强SCHED_FIFO,每个线程允许在最大时间段内运行。运行超过该时间段的SCHED_RR线程会被放置在优先级列表末尾。被更高优先级线程抢占后恢复运行,将在未过期时间段内继续。
SCHED_DEADLINE:结合GEDF与CBS的调度策略,适用于短任务模型。每个任务有相对截止时间与计算时间,使用sched_setattr(2)设置Runtime、Deadline与Period。内核要求参数至少1024,小于2^63。
CBS确保任务间不干扰,当SCHED_DEADLINE线程不可运行时,内核阻止其运行,执行准入测试确保修改可行。总的CPU利用率应小于可用CPU。使用SCHED_DEADLINE策略的线程优先级最高,会抢占其他策略下的线程。
使用SCHED_DEADLINE策略的线程fork(2)返回EAGAIN错误,除非设置reset-on-fork标记。调用sched_yield(2)停止当前任务,等待新周期。
SCHED_OTHER:默认Linux分时调度策略,静态优先级为0(普通线程)。动态优先级基于nice值,决定选择运行的线程。
SCHED_BATCH:用于静态优先级为0的批量处理进程,调度类似SCHED_OTHER,考虑CPU密集型行为,避免交互引起的抢占。
SCHED_IDLE:用于非常低优先级任务,nice值不影响此策略。
设置子进程的调度策略可使用reset-on-fork标识,fork(2)后子进程会disable此标识。
在Linux 2.6.12前,只有拥有特权的线程可设置非0静态优先级。后续版本仅非特权线程在调用者有效用户ID与目标线程一致时设置SCHED_OTHER策略。
设置或修改SCHED_DEADLINE策略需特权线程,RLIMIT_RTPRIO定义非特权线程设置SCHED_RR与SCHED_FIFIO策略的静态优先级上限。
实时进程与SCHED_FIFO、SCHED_RR中无限循环处理可能阻塞其他线程。从Linux 2.6.25起,通过RLIMIT_RTTIME限制实时进程CPU使用上限。
从Linux 2.6.25起,为非实时进程保留CPU时间,shell可停止进程以释放资源。
子进程通过fork(2)继承调度策略与参数,使用execve(2)可保存策略与参数。
SCHED_FIFO、SCHED_RR或SCHED_DEADLINE策略下调度的非阻塞无限循环可能导致系统冻结。从Linux 2.6.25起,通过RLIMIT_RTTIME限制实时与deadline进程使用CPU。
autogroup特性从Linux 2.6.38起提供,提升多进程与CPU密集型负载的交互式桌面性能。设置CONFIG_SCHED_AUTOGROUP启用特性,通过文件/proc/sys/kernel/sched_autogroup_enabled控制。autogroup允许进程以组形式调度,提升CPU分配效率。
nice值影响调度,SCHED_FIFO、SCHED_RR与SCHED_DEADLINE策略下,nice值仅影响同一任务组内的线程调度。
autogroup与cgroups CPU控制器可分别设置进程占用的CPU,cgroup配置覆盖autogroup。
从Linux 2.6.18起,Linux逐渐具备实时功能,部分依赖realtime-preempt补丁集。在补丁合并主线前,实时性能需通过安装补丁实现。
在/proc/sched_debug查看CPU核心调度情况,如docker服务在core1上的调度;/proc/$pid/sched查看特定进程调度情况。
详细信息参考原文作者charlieroro的博客园文章。
Linux里面export PATH作用是什么
题主你好,
export PATH是用来给环境变量PATH赋值的,而PATH理论上来说存放的是由冒号分隔的一系列路径:
而PATH这个变量的作用通常是提供搜索路径,这么说不直观,举个例子来说吧:
我们可以在命令行中直接使用find命令进行文件的查找,但你有没有想过,为啥你可以直接使用find命令呢?
原因一,肯定find这个可执行文件要存在于linux中;
原因二,我们还要将find可执行文件的路径添加到PATH中;
也就是说我们每次在黑乎乎的命令行中输入命令时,它都会去PATH中指定的一系列路径下去找,如果找到就按步就班的执行,如果没找到就会报错.
-----
举个更现实一点的例子,比如说我自己写了一个脚本名叫hi,内容为:
我是直接在家目录下新建的这个脚本,
此时我执行"hi friend",看看有什么情况发生:
它会告诉你,hi这个命令没找到,原因是PATH这个环境变量里的路径,不包含我的家目录,因此它找不到.
下面我们将家目录放到PATH中,再执行一遍命令看一下:
可以看到,正确输出了结果.
-----
希望可以帮到题主,欢迎追问.
Linux 进程调度
Linux的调度策略区分实时进程和普通进程,实时进程的调度策略是SCHED_FIFO和SCHED_RR,普通的,非实时进程的调度策略是SCHED_NORMAL(SCHED_OTHER)。
实时调度策略被实时调度器管理,普通调度策略被完全公平调度器来管理。实时进程的优先级要高于普通进程(nice越小优先级越高)。
SCHED_FIFO实现了一种简单的先入先出的调度算法,它不使用时间片,但支持抢占,只有优先级更高的SCHED_FIFO或者SCHED_RR进程才能抢占它,否则它会一直执行下去,低优先级的进程不能抢占它,直到它受阻塞或自己主动释放处理器。
SCHED_RR是带有时间片的一种实时轮流调度算法,当SCHED_RR进程耗尽它的时间片时,同一优先级的其它实时进程被轮流调度,时间片只用来重新调用同一优先级的进程,低优先级的进程决不能抢占SCHED_RR任务,即使它的时间片耗尽。SCHED_RR是带时间片的SCHED_FIFO。
Linux的实时调度算法提供了一种软实时工作方式,软实时的含义是尽力调度进程,尽力使进程在它的限定时间到来前运行,但内核不保证总能满足这些进程的要求,相反,硬实时系统保证在一定的条件下,可以满足任何调度的要求。
SCHED_NORMAL使用完全公平调度算法(CFS),之前的算法直接将nice值对应时间片的长度,而在CFS中,nice值只作为进程获取处理器运行比的权重,每个进程都有一个权重,nice优先级越高,权重越大,表示应该运行更长的时间。Linux的实现中,每个进程都有一个vruntime字段,vruntime是经过量化的进程运行时间,也就是实际运行时间除以权重,所以每个量化后的vruntime应该相等,这就体现了公平性。
CFS当然也支持抢占,但与实时调度算法不同,实时调度算法是根据优先级进行抢占,CFS是根据vruntime进行抢占,vruntime小就拥有优先被运行的权利。
为了计算时间片,CFS算法需要为完美多任务中的无限小调度周期设定近似值,这个近似值也称作目标延迟,指每个可运行进程在目标延迟内都会调度一次,如果进程数量太多,则时间粒度太小,所以约定时间片的默认最小粒度是1ms。
进程可以分为I/O消耗型和处理器消耗型,这两种进程的调度策略应该不同,I/O消耗型应该更加实时,给对端的感觉是响应很快,同时它一般又不会消耗太多的处理器,因而I/O消耗型需要调度频繁。相对来说,处理器消耗型不需要特别实时,应该尽量降低它的调度频度,延长其运行时间。
参考: linux内核分析——CFS(完全公平调度算法)-一路向北你好-博客园