浅析Linux下进程的调度策略与优先级

作者&投稿:弋强 (若有异议请与网页底部的电邮联系)
~

在 Linux 中,线程是由进程来实现的,可以认为线程就是一个轻量级的进程,因此,线程调度是按照进程调度的方式来进行的。这样设计,线程调度流程可以直接复用进程调度流程,没必要再设计一个进程内的线程调度器了。

在 Linux 中,进程调度器是基于进程的调度策略与调度优先级来决定调度哪个进程运行。

调度策略主要包括:

调度优先级的范围是 0~99,数值越大,表示优先级越高。

其中,SCHED_OTHER、SCHED_IDLE、SCHED_BACH 为非实时调度策略,其调度优先级为 0。而 SCHED_FIFO、SCHED_RR 是实时调度策略,其调度优先级范围为 1~99。

实时调度策略的进程总是比非实时调度策略的进程优先级高。

在 Linux 内部实现中,调度器会为每个可能的调度优先级维护一个可运行的进程列表,以最高优先级列表头部的进程作为下一次调度的进程,所有的调度都是抢占式的,如果一个具有更高调度优先级的进程转换为可运行状态,那么当前运行的进程将被强制进入其等待的队列中。

SCHED_OTHER

该调度策略是默认的 Linux 分时调度策略,该调度策略为非实时的,其调度优先级总是为 0。

对于该调度策略类型的进程,调度器是基于动态优先级来调度的。动态优先级跟属性 nice 有关,nice 的值会随着进程的运行时间而动态改变,以确保所有具有 SCHED_OTHER 策略的进程公平地得到调度。

在 Linux 中,nice 的值范围为-20 ~ +19,默认值为 0。nice 值越大,则优先级越低,因此相对较低 nice 值的进程可以获得更多的处理器时间。

通过命令 ps -el 查看系统中的进程列表,其中 NI 列就是进程对应的 nice 值。

使用 top 命令,看到的 NI 列也是进程的 nice 值。

调整 nice 值,可以通过 shell 命令 nice ,该命令可以按照指定的 nice 值运行 cmd ,命令的帮助信息为:

重新调整已运行进程的 nice 值,可通过 renice 命令实现,命令的帮助信息为:

另外,可以执行 top 命令,输入 r ,根据提示输入进程的 pid ,再输入 nice 数值,也可以调整进程的 nice 值。

SCHED_FIFO

该调度策略为先入先出调度策略,简单概括,就是一旦进程占用了 CPU,则一直运行,直到有更高优先级的任务抢占,或者进程自己放弃占用 CPU。

SCHED_RR

该调度策略为时间片轮转调度策略,该调度策略是基于 SCHED_FIFO 策略的演进,其在每个进程上增加一个时间片限制,当时间片使用完成后,调度器将该进程置于队列的尾端,放在尾端保证了所有具有相同调度优先级的进程的调度公平。

使用 top 命令,如果 PR 列的值为 RT ,则说明该进程采用的是实时调度策略,其调度策略为 SCHED_FIFO 或者 SCHED_RR,而对于非实时调度策略的进程,该列的值为 NI + 20 。

可以通过命令 ps -eo state,uid,pid,ppid,rtprio,time,comm 来查看进程对应的实时优先级,实时优先级位于 RTPRIO 列下,如果进程对应的列显示为 - ,说明该进程不是实时进程。

chrt 命令可以用来很简单地更改进程的调度策略与调度优先级。在 Linux 下查看 chrt 命令的帮助信息:

比如,获取某个进程的调度策略,使用如下命令:

在比如,设置某个进程的调度策略为 SCHED_FIFO,调度优先级为 70,使用如下命令:




简要剖析Linux系统的进程管理机制
在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识,它们的大小是有限制的,最大ID为32768,用UID和GID分别表示启动这个进程的用户和用户组。所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程,因而,这个进程是linux下所有进程的父进程,用PPID表示父进程。所以如果init进程被kill,则...

Linux进程内存用量分析之堆内存篇
深入Linux进程内存分析,我们聚焦于堆内存的管理与监控,特别是ptmalloc的内核。Esearch采用的glibc ptmalloc内存策略,其内存分配与回收机制灵活而高效。在内存管理的探索中,我们找到了关键的工具——core_analyzer,它由Michael Yan开发,针对glibc 2.3-223版本的ptmalloc提供了深度剖析功能。在core_analyzer...

linux进程分析工具linux进程分析
1.多态性从诞生、运行,直至消灭 2.多个不同的进程可以包括相同的程序 3.三种基本状态它们之间可进行转换 4.并发性并发执行的进程轮流占用处理器 linux进程调度原理:调度程序运行时,要在所有可运行状态的进程中选择最值得运行的进程投入运行。在每个进程的task_struct结构中有以下四项:policy、priority、c...

浅析Linux下进程的调度策略与优先级
在 Linux 中,线程是由进程来实现的,可以认为线程就是一个轻量级的进程,因此,线程调度是按照进程调度的方式来进行的。这样设计,线程调度流程可以直接复用进程调度流程,没必要再设计一个进程内的线程调度器了。在 Linux 中,进程调度器是基于进程的调度策略与调度优先级来决定调度哪个进程运行。调度策略...

深入解析Linux系统下的进程切换
(1). command 让进程在后台运行 (2). jobs –l 查看后台运行的进程 (3). fg %n 让后台运行的进程n到前台来 (4). bg %n 让进程n到后台去;PS:"n"为jobs查看到的进程编号。1、执行命令切换至后台 在Linux终端运行命令的时候,在命令末尾加上符号,就可以让程序在后台运行 代码...

浅析linux环境下一个进程最多能有多少个线程
默认情况下Linux环境下一个进程最多能有多少个线程?:主线程+自己的线程382 = 383 这我自己已经验证过,测试程序在后面。据说可以设置线程数目:据说是可以设置的,但本人还没有验证!不知道可否。下面是测试程序,可以验证,在默认情况下一个进程同时最多可以存在的线程数目。include <stdio.h> includ...

浅析linux环境下一个进程最多能有多少个线程
默认情况下:主线程+辅助线程 +<253个自己的线程<=255含主线程和一个辅助线程,最多255个,即你自己只能生成253个线程。据说可以设置线程数目:据说是可以设置的,但本人还没有验证!不知道可否。在你的shell中键入limit命令,里面有descriptor的数目,就是你的进程可以创建的最大线程数目。可以通过...

Linux进程的内存使用解析
进程XXX占用了多少内存?这是个经常被问到,也经常被答错的问题。linux进程的内存分配是个比较复杂的话题,而linux上的工具往往把这个问题过分简单化,因此引出不少误解和困惑。首先把ps,top这类工具扔掉,然后看这么一个简单程序:[root@pczou pczou]cat .\/prog.c#i nclude#i nclude#i nclude#i nc...

如何详解 Linux 命令之 top 命令?
深入解析Linux界面上不可或缺的神器——top命令,它是监控系统运行状态的实时工具,让你能够实时洞察CPU、内存占用情况以及进程管理。掌握top的基本操作,将使你对系统性能如数家珍。首先,让我们了解其基础用法:使用-hv|-bcHiOSs选项,如显示命令行或切换到批处理模式,以及灵活的参数-n、-d、-u,...

linux named 什么进程
是一个名字为bind的dns软件提供的进程,是域名解析服务。

你可能想看的相关专题

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网