Linux进程管理策略
Linux中的进程调度技巧使用nice和renice命令进行优先级调整

Linux中的进程调度技巧使用nice和renice命令进行优先级调整在Linux操作系统中,进程调度是一项至关重要的任务。
通过合理地调整进程的优先级,可以实现对系统资源的有效管理和任务的顺利执行。
在Linux中,可以使用nice和renice命令来进行进程的优先级调整。
本文将介绍Linux中的进程调度技巧以及如何使用nice和renice命令进行优先级调整。
一、进程调度技巧的重要性在多任务操作系统中,同时有多个进程运行,各个进程之间需要共享和竞争系统资源。
为了保证系统的稳定性和响应性,操作系统需要合理地分配和调度这些进程。
进程调度策略的好坏直接影响到系统的效率和性能。
在Linux中,进程调度技巧有很多,包括进程优先级的调整、调度策略的设置等。
其中,使用nice和renice命令来进行进程的优先级调整是一种较为常见和方便的方式。
二、nice命令的使用1. 什么是nice命令nice命令是Linux中用来设置进程调度优先级的命令。
通过nice命令可以为某个进程设置一个优先级值,优先级值越低,进程的优先级越高。
2. nice命令的语法nice命令的基本语法如下:nice [OPTION] [COMMAND [ARG]...]其中,OPTION为可选参数,COMMAND为要执行的命令,ARG 为命令的参数。
3. nice命令的实例下面是几个使用nice命令的实例:- 将进程的优先级设置为10:```nice -n 10 command```- 将进程的优先级设置为-10:```nice -n -10 command```- 将进程的优先级设置为默认值:```nice --adjustment 0 command三、renice命令的使用1. 什么是renice命令renice命令是Linux中用来修改已运行进程优先级的命令。
通过renice命令可以为已运行的进程重新设置一个优先级值。
2. renice命令的语法renice命令的基本语法如下:renice [OPTION] [-g|-p|-u] PRIORITY [PID...]其中,OPTION为可选参数,-g、-p、-u用于指定设置优先级的方式(组、进程、用户),PRIORITY为优先级值,PID为进程ID。
理解Linux的进程调度和优先级

理解Linux的进程调度和优先级Linux是一种广泛使用的开源操作系统,它采用了多任务处理的方式,能够同时运行多个进程。
进程调度是Linux操作系统中非常重要的一部分,它决定了进程之间如何共享CPU资源,使得操作系统能够高效地运行。
进程调度是操作系统的核心功能之一,它负责按照一定的调度算法从就绪队列中选择一个进程并将其分配给CPU执行。
Linux操作系统采用了时间片轮转法作为默认的调度算法,即每个进程被分配一个时间片,当时间片用完之后,如果进程还未执行完毕,就会被挂起,将执行机会分配给下一个就绪进程。
这样可以保证多个进程之间的平等性,防止某个进程长时间占用CPU资源。
除了时间片轮转法,Linux操作系统还支持其他的调度算法,如优先级调度、实时调度等。
优先级调度是一种根据进程的优先级来进行调度的方法,优先级高的进程会优先获得CPU执行权。
在Linux中,每个进程都有一个静态优先级和一个动态优先级,静态优先级由进程创建时指定,而动态优先级会根据进程执行情况进行动态调整。
实时调度是一种对实时任务进行优先调度的方法,可以保证实时任务的响应时间。
Linux操作系统中,进程的优先级范围是-20到19,数值越小表示优先级越高。
根据进程的优先级,Linux操作系统按照先运行高优先级进程的原则来进行调度。
当有多个具有相同优先级的进程时,Linux会采用时间片轮转法来进行调度。
通过灵活调整进程的优先级,可以合理分配CPU资源,提高系统的整体性能和响应速度。
除了优先级调度算法外,Linux操作系统还支持实时调度算法。
实时任务对响应时间要求非常高,需要保证任务在规定的时间内完成。
为了实现实时调度,Linux操作系统引入了实时进程和实时调度策略。
实时进程是一类对时间敏感的进程,它们可以获得更高的执行优先级和更快的响应时间。
实时进程的调度策略有FIFO(先进先出)调度、循环调度等。
理解Linux的进程调度和优先级对于系统管理员和开发人员来说非常重要。
请描述linux下常见的调度策略及调度原理

请描述linux下常见的调度策略及调度原理在Linux下,常见的进程调度策略包括:1.CFS(Completely Fair Scheduler)完全公平调度器:CFS是Linux内核默认的调度策略。
它通过使用红黑树数据结构来维护进程队列,以确保公平分配CPU时间片。
CFS基于进程的虚拟运行时间(vruntime)进行调度,根据进程的优先级和历史执行情况来分配CPU时间。
2.实时调度策略:Linux提供了多种实时调度策略,包括先来先服务(FIFO)和轮转(Round Robin)调度策略。
实时任务具有较高的优先级,可以实时响应系统事件,适用于对时间敏感的应用,如嵌入式系统和实时视频处理等。
3.基于优先级的调度策略:Linux还支持基于静态优先级和动态优先级的调度策略。
这些策略根据进程的优先级决定调度顺序,优先级较高的进程将获得更多的CPU时间。
调度原理是指操作系统如何决定哪个进程获得CPU资源的分配。
Linux的调度器使用时间片轮转和优先级调度等策略来实现公平和高效的调度。
调度器会根据不同的调度策略和优先级,分配给每个进程一定的CPU时间片。
时间片指定了进程能够运行的时间段。
当一个进程的时间片用完或发生了阻塞事件时,调度器会将CPU 分配给下一个就绪状态的进程。
CFS调度器基于虚拟运行时间(vruntime)来分配CPU时间。
vruntime表示进程所需的实际运行时间,CFS通过比较进程的vruntime来决定下一个运行的进程。
较长时间没有运行的进程会被赋予更长的时间片,以实现公平调度。
实时调度策略将优先级更高的实时任务放在优先级队列的前面,以确保它们及时地响应系统事件。
在实时任务运行期间,其他普通优先级的任务将被暂时挂起。
总的来说,Linux的调度器通过多种调度策略和优先级,根据不同类型的任务和进程的要求,合理分配CPU资源,以实现公平、高效和响应及时的调度。
这样可以确保系统的正常运转并提高性能。
linux schedutil策略 -回复

linux schedutil策略-回复Linux Schedutil策略: 简介、工作原理和性能优化在Linux操作系统中,进程调度是一个重要的任务。
它决定了进程如何分配CPU资源,以及如何有效地利用系统资源。
为了提高系统的性能和响应能力,Linux内核采用了不同的调度策略,其中之一就是Schedutil策略。
Schedutil是Linux内核中的一个动态调度器,它的设计目标是实时反馈地根据系统负载和需求动态地调整CPU频率和性能状态。
这样可以在不影响系统稳定性的前提下,最大限度地减小能源消耗,并提高系统的响应速度。
工作原理:Schedutil策略主要通过主动反馈和对CPU性能状态的调整来实现其目标。
以下是Schedutil策略的一般工作原理:1. 加载并编译: 当启动系统时,Schedutil策略会加载并编译相关的调度器代码,并初始化其参数和功能。
2. 系统负载检测: Schedutil会周期性地监测系统的负载情况。
这个过程主要通过检查CPU的使用率、负载平均数等指标来完成。
3. CPUPower调整: 基于系统负载检测的结果,Schedutil会使用CPUPower框架,动态地调整CPU的频率和性能状态。
CPUPower框架是一个用于管理CPU功耗和性能状态的工具集。
4. 选择最佳性能状态: Schedutil在调整CPU性能状态时,会根据当前系统负载和需求选择最佳性能状态。
较低的系统负载可能导致CPU进入较低的性能状态,以减少能耗。
而较高的系统负载则可能导致CPU进入较高的性能状态,以提供更高的处理能力。
5. 响应反馈: Schedutil会根据系统的实时反馈,及时调整CPU的性能状态。
这个反馈主要包括CPU的使用率、任务提交速率、响应延迟等指标。
6. 参数自适应: Schedutil策略还具有自适应的能力,能够根据系统的实际需求自动调整其内部参数和算法,以获得更佳的性能。
性能优化:为了获得最佳的系统性能,我们可以通过以下方法来优化Schedutil策略:1. 核心配置参数调整: Schedutil策略有一些核心的配置参数,如采样间隔、负载平均数的权重等,可以通过修改这些参数来调整策略的行为。
Linux命令行的进程管理与问题解决办法

Linux命令行的进程管理与问题解决办法一、进程的基本概念进程是 Linux 系统中正在运行的程序的实例。
每个进程都有自己的进程标识符(PID)、内存空间、系统资源等。
了解进程的状态对于有效的进程管理至关重要。
进程通常有以下几种状态:1、运行态(Running):进程正在 CPU 上执行。
2、就绪态(Ready):进程已准备好运行,等待CPU 分配时间片。
3、阻塞态(Blocked):进程由于等待某些资源(如I/O 操作完成)而暂时无法运行。
二、查看进程的命令1、`ps` 命令`ps` 命令是最常用的查看进程的命令之一。
它可以提供关于进程的各种信息,如 PID、CPU 使用率、内存使用情况等。
例如,使用`ps aux` 命令可以显示系统中所有进程的详细信息,包括用户、CPU 使用率、内存使用等。
2、`top` 命令`top` 命令提供了一个动态的、实时的进程查看界面。
它不仅显示进程的信息,还能按照 CPU 使用率、内存使用率等进行排序。
在`top` 界面中,可以通过按键来进行交互操作,例如按`P` 键按照 CPU 使用率排序,按`M` 键按照内存使用率排序。
三、进程的控制命令1、`kill` 命令当需要终止一个进程时,可以使用`kill` 命令。
通过指定进程的PID,向进程发送指定的信号来终止它。
例如,`kill 1234` 会向 PID 为 1234 的进程发送默认的终止信号(SIGTERM)。
如果进程没有响应,可以使用`kill -9 1234` 发送强制终止信号(SIGKILL),但这种方式可能会导致数据丢失或其他不可预期的后果,应谨慎使用。
2、`killall` 命令如果需要根据进程的名称来终止多个相关进程,可以使用`killall` 命令。
例如,`killall firefox` 会终止所有名为`firefox` 的进程。
四、进程的优先级调整1、`nice` 命令在启动进程时,可以使用`nice` 命令来设置进程的优先级。
Linux终端中的进程管理和监控

Linux终端中的进程管理和监控在Linux终端中,进程的管理和监控是系统管理者和开发人员必备的技能之一。
通过合理的进程管理和监控,可以保证系统的稳定性和正常运行。
本文将介绍Linux终端中进程管理和监控的相关知识,并提供一些实用的命令和工具供读者参考。
一、进程管理在Linux系统中,每个正在运行的程序都是一个进程。
进程管理的任务包括启动、停止、监控和调整进程的运行状态等。
下面是一些常用的进程管理命令及其功能:1. ps命令:用于查看当前系统中运行的进程信息。
通过不同的选项,可以显示进程的PID(进程ID)、状态、内存占用等详细信息。
2. kill命令:用于终止指定的进程。
可以通过进程ID(PID)或进程名来指定要终止的进程。
3. top命令:用于实时监控系统中的进程状态。
它可以显示当前运行的进程列表,并实时更新进程的CPU利用率、内存占用等信息。
4. renice命令:用于调整进程的优先级。
可以通过指定进程ID或进程名,设置进程的优先级,以调整系统资源的分配。
二、进程监控除了上述命令外,Linux终端还提供了一些工具用于进程的监控和管理。
下面是一些常用的进程监控工具及其功能:1. System Monitor:一个图形化的工具,用于实时监控系统的状态和进程信息。
它可以以图表的形式显示CPU利用率、内存占用、网络流量等信息,并提供用于杀死进程、调整优先级等功能。
2. htop:一个更加强大的进程监控工具,相比于top命令,htop提供了更多的功能和定制选项。
它可以以交互式的方式显示系统状态和进程信息,并允许用户进行进一步的操作,如终止进程、修改优先级等。
3. systemd:一个集成的系统和服务管理工具。
通过systemd,可以对系统中的进程进行监控和管理,包括启动、停止、重启进程等操作。
它还提供了一些高级功能,如进程的自动重启、进程的依赖管理等。
4. monit:一个轻量级的进程监控工具,可用于监控系统中的进程和服务。
第十三讲 Linux中的进程管理(2)
不断重复执行某些命令— 不断重复执行某些命令—cron
crontab命令的语法格式如下: crontab命令的语法格式如下: 命令的语法格式如下 crontab -u user file l|crontab -u user –l|-r|e l|
第一种格式用于安装一个新的crontab 文件, 第一种格式用于安装一个新的crontab 文件, 安装来源就是file所指的文件,如果使用“ file所指的文件 安装来源就是file所指的文件,如果使用“-” 符号作为文件名, 符号作为文件名,那就意味着使用标准输入作 为安装来源。 为安装来源。
•/etc/rc.成,脚本名称以rc开头, 初始化工作由一系列脚本rc完成,脚本名称以rc开头,后 rc完成 rc开头 面接数字,数字用来表示进程的级别。 面接数字,数字用来表示进程的级别。如 /etc/rc.d/rc3.d就是用来控制运行级别 就是用来控制运行级别3 /etc/rc.d/rc3.d就是用来控制运行级别3的脚本程序
不断重复执行某些命令— 不断重复执行某些命令—cron
crontab命令的语法格式如下: crontab命令的语法格式如下: 命令的语法格式如下
在标准输出上显示当前的crontab crontab文件 -l:在标准输出上显示当前的crontab文件 删除当前的crontab crontab文件 -r:删除当前的crontab文件 -e:使用VISUAL或者EDITOR环境变量所指的编辑 使用VISUAL或者EDITOR VISUAL或者EDITOR环境变量所指的编辑 器编辑当前的crontab文件,当结束编辑离开时, crontab文件 器编辑当前的crontab文件,当结束编辑离开时, 编辑后的文件将被自动安装
Linux下常见的守护进程 Linux下常见的守护进程
linux下常见的调度策略及调度原理
linux下常见的调度策略及调度原理Linux是一种开源的操作系统,广泛应用于服务器和嵌入式设备中。
在Linux系统中,进程调度策略是操作系统的核心组成部分之一,它决定了进程的执行顺序和时间分配。
本文将介绍Linux下常见的调度策略及其调度原理。
在Linux系统中,常见的进程调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和优先级调度(Priority Scheduling)等。
先来先服务(FCFS)是一种简单而直观的调度策略,它按照进程到达的先后顺序进行调度。
即当一个进程到达系统时,它将被放入就绪队列的末尾,并等待CPU的分配。
当CPU空闲时,系统将选择就绪队列中的第一个进程分配给CPU执行。
这种调度策略的优点是公平性强,但缺点是无法处理长作业和短作业的差异,容易产生"饥饿"现象。
最短作业优先(SJF)调度策略是根据进程的执行时间来决定优先级的调度策略。
即系统会选择执行时间最短的进程先执行,以减少平均等待时间。
这种调度策略的优点是能够最大程度地减少平均等待时间,但缺点是可能会出现长作业等待时间过长的问题。
时间片轮转(RR)是一种基于时间片的调度策略,每个进程被分配一个固定长度的时间片。
当一个进程的时间片用完时,系统将把CPU分配给下一个进程。
这种调度策略的优点是能够有效地平衡进程之间的响应时间,但缺点是可能会导致频繁的上下文切换。
优先级调度(Priority Scheduling)是一种根据进程优先级来决定调度顺序的策略。
每个进程被分配一个优先级,优先级越高的进程越容易被调度执行。
这种调度策略的优点是能够根据不同进程的需求进行灵活调度,但缺点是可能会导致低优先级进程的"饥饿"问题。
在Linux系统中,调度算法的实现是通过内核的进程调度器来完成的。
内核中的调度器会根据不同的调度策略来选择下一个要执行的进程,并将其上下文切换到CPU中执行。
Linux进程管理策略
! 进程的状态及其转换
每个进程是一个动态的个体, 在 +BCDE 系统中, 其生命周期可以分为以下几个阶段: 执行 (包括就绪状态) 、 可打断睡眠、 不可打断睡眠、 僵死、 暂停、 交换等, 将它们依次定义为 +BCDE /*7P N (’))1)Q, /*7P N 1)/3((’4/1R+3, /*7P N ’)1)/3((’4/1R+3, /*7P N S&0R13, /*7P N
[J] 等。 3>?)=%2) () 函数的执行可以由进程自身调用, 也可因其他外界因素而引发 。
针对 82+>,*+$) </&%7 的版本 J H M H N 的源程序, 分析其进程调度函数 8>?)=%2) () 的流程如下: () , 若是, 则马上退出。在中断服务程序中, ! 判断是否在中断服务程序中调用 3>?)=%2) 执行任务队列或 15005K ?+2L 队列中任务时不可使用 3>?)=%2) () 进行调度。以全程变量 /&0$ >5%&0 是否为 N 区分是否为这种情况。 则执行之。 " 若 15005K ?+2L 队列中有任务, # 执行 0( - 3>?)=%2)$ 任务队列中的任务。 则置时间片初值, 且将其移至 $%&’(%)%) 队 $ 若当前进程采用轮转法调度且时间片用完, 列末。 调整其状态为执行。 % 唤醒收到信号的或时间片已到的处于可打断睡眠的进程, 挑选权最大者为下一执行进程。计算选 & 计算 $%&’(%)%) 队列中各任务的选择优先权, 万方数据 择优先权由函数 455=&)33 () 完成, 实时进程优先权高, 非实时进程以时间片剩余值作为选择优
Linux命令行使用技巧如何查看和管理系统进程优先级
Linux命令行使用技巧如何查看和管理系统进程优先级在Linux操作系统中,进程优先级是指操作系统对运行中的进程进行调度和分配资源的重要参数之一。
通过合理地设置进程优先级,能够有效地提高系统的性能和稳定性。
本文将介绍一些Linux命令行使用技巧,帮助你查看和管理系统进程优先级。
一、查看系统进程1. top命令:top命令是Linux下常用的查看系统进程的命令。
通过top命令,你可以实时地查看各个进程的运行情况、进程ID、CPU使用率等信息。
2. ps命令:ps命令也是查看系统进程的常用命令。
通过ps命令,你可以查看当前用户的进程情况、各个进程的状态、进程ID等信息。
二、了解进程优先级在Linux系统中,进程的优先级用一个范围为-20到19的数值表示,其中-20表示最高优先级,19表示最低优先级。
默认情况下,普通用户创建的进程的优先级为0,系统进程的优先级通常较高。
三、修改进程优先级1. renice命令:renice命令用于修改已经运行的进程的优先级。
通过renice命令,你可以提高或降低进程的优先级。
假设你想将进程ID为12345的进程的优先级提高到10,你可以使用以下命令:```renice 10 12345```2. nice命令:nice命令用于在启动进程时指定进程的优先级。
通过nice命令,你可以创建一个具有较高或较低优先级的进程。
假设你想在运行一个新的进程时将其优先级设置为5,你可以使用以下命令:```nice -n 5 command```其中,command表示你要运行的命令或程序。
四、管理系统进程优先级1. taskset命令:taskset命令用于将进程绑定到指定的CPU或CPU 集。
通过taskset命令,你可以管理进程的调度情况。
假设你想将进程ID为12345的进程绑定到CPU 0上,你可以使用以下命令:```taskset -p 0x1 12345```2. chrt命令:chrt命令用于修改进程的调度策略和优先级。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux 进程管理策略
高 洁, 郭庆平
430063) ( 武汉交通科技大学 信息工程学院 , 湖北 武汉
摘
要 : 详细论述了 Linux 操作系统的进程状 态转换机制和进程调 度算法 , 总结了 Linux 进程 管理
的一些特点 , 并通过一个实例简要探讨了与进程 调度相关的编程方法。 关键词 : 进程管理 ; 进程调度 ; Linux 中图法分类号 : TP 316 文献标识码 : A
1
进程的状态及其转换
每个进程是一个动态的个体 , 在 Linux 系统中, 其生命周期可以分为以下几个阶段: 执行 ( 包括就绪状态 ) 、 可打断睡眠、 不可打断睡眠、 僵死、 暂停、 交换等, Linux 将它们依次定义为 TASK- RUNNING, TASK - INTERRUPTIBLE, TASK- UNINTERRUPTIBLE, TASK- ZOMBIE, TASKSTOPPED, TASK- SWAPPING。一个进程在其生存期间, 状态会发生多次更替 [ 1] 。 进程创建时的状态为不可打断睡眠, 在 do - fork( ) 结束前被父进程唤醒后 , 变为执行状 态。处于 执 行 状态 的 进程 被 移 到 run queue 就 绪任 务 队 列中 等 待调 度 , 在适 当 时 候由 schedule( ) 按调度算法选中, 获得 CPU。进程调度算法可采用先进先出算法 ( FIFO) 或轮转法 ( round robin) , 分实时和非实时两种情形。采用 Linux 的轮转法, 当时间片到时 ( 10 ms 的整数 倍) , 由时钟中断触发 timer- interrupt ( ) , 其内部调用 schedule( ) , 引起新一轮调度 , 当前进程的 状态仍处于执行状态 , 因而把当前进程挂到 run queue 队尾。 获得 CPU 且正在运行的进程若申请不到某个资源 , 则调用 sleep- on( ) 或 interruptiblesleep- on( ) 睡眠 , 其 task- struct 进程控制块挂到相应资源的 wait- queue 等待队列。如果调用 sleep- on( ) , 则其状态变为不可打断睡眠 , 如果调用 interruptible - sleep- on( ) , 则其状态变为可 打断睡眠。sleep - on ( ) 或 interruptible - sleep- on( ) 将调用 schedule ( ) 函数 把睡眠进 程释放
工
业
大
学
学
报
2000 年 10 月
的 CPU 分配给 run queue 队列的某个就绪进程。 状态为可打断睡眠的睡眠进程, 当它申请的资源有效时被唤醒 ( 如通过执行函数 wakeup- interruptible( ) ) , 也可由信号( signal) 或定时中断唤醒。而状态为不可打断睡眠的睡眠进程 只有当它申请的资源有效时才被唤醒 ( 如 wake- up( ) ) , 不能被信号、 定时中断唤醒。唤醒后 , 进程状态改为执行, 并进入 run queue 队列等待调度。 以上所述的进程状态因资源是否可用而发生的可打断睡眠与不可打断睡眠状态的转换 , 实际上是进程间的同步问题, 从进程同步和 CPU 由多个进程共享使用的角度考虑就比较容易 理解 sleep- on( ) 、 wake- up( ) 等函数的运行过程了。 进程执行系统调用 sys- exit ( ) 或收到 SIG- KILL 信号而调用 do- exit( ) 时 , 进程状态变为僵 死状态, 释放所申请资源 , 同时启动 schedule( ) 把 CPU 分配给 run queue 队列中其他就绪进程。 若进程通过系统调用设置标志 PF- SYSTRACE, 则在系统调用返回前 , 进入函数 syscalltrace( ) , 状态变为暂停, CPU 分配给 run queue 队列中其他就绪进程。只有通过其他进程发送 信号 SIG- KILL 或 SIG- CONT, 才能把暂停状态进程唤醒 , 重新进入 run queue 队列。 可见 , Linux 进程的状态转换是通过系统调用以及只在内核态运行的调度函数 schedule( ) 来进行的 , 进程状态保存在进程控制块 ( 在 sched. n 中定义 ) 的 state 量中。
3
进程管理中使用的队列机制
Linux 在进程管理过程 , 如 schedule( ) 中使用了大量的核心队列 , 这些队列也可供系统程序
员在详细掌握了其用途和使用方法后加以运用 , 以更好地实现基于 Linux 系统的底层功能。 下面列出的这些队列 , 只有就绪任务队列和等待队列的操纵对象是进程, 其他的都是函数。 就绪任务队列 run queue。由所有的处于可执行状态的进程所组成的队列。只有位于 run queue 队列中的进程, 才会被调度函数选中占用 CPU。 等待队列 wait- queue 。等待队列是 Linux 系统中支持同步的数据结构。同步进程在等 待的条件不满足时必须挂起, 当条件满足时 ( 或等待事件发生时 ) 应及时被唤醒。等待队列一 般是循环队列。每一种事件都有一个等待队列, 进程若等待一个指定的事件发生, 必须调用 add- wait- queue( ) 进入该事件的等待队列并转入睡眠 , 并调用 schedule( ) 交出 CPU。当进程等 待的事件发生时 , 等待队列上所有进程全部唤醒。 ! 任务队列 task - queue 。设计应用系统或编写设备驱动程序时 , 有时候希望有些程序在 将来某时刻运行 , 如果使用定时器中断, 就会引起 CPU 上下文切换而影响效率。任务队列机 制提供了不需要中断介入的方法。进程只要把希望将来执行的任务挂在队列中 , 系统内核会 在适当时候调用 run - task- queue( task - queue* task - list) 函数, 对队列中的任务进行批处理。如 函数 schedule( ) 将通过执行 run- task- queue( & tq- scheduler) 语句来执行 tq- scheduler 队列中的 任务。任务队列有多种, 在不同的时刻调用。 ∀ bottom half 队列。 Bottom half 队列是 Linux 处理硬中断的一种策略。处理硬中断的服务 程序往往要关中断以免中断嵌套, 而关中时间不能太长, 以免丢失中断信号。Linux 将长的中 断服务程序一分为二 , 分别为 top half 和 bottom half。前者是中断服务程序的入口部分 , 必须关 中运行; 后者是由前者调度的中断服务程序的剩余部分 , 可以开中运行。通常 , top half 将设备 的数据保存在预定缓冲区后, 通过置位内核长整形标志变量 bh- active 中的对应位通知 bottom half 即返回, 执行较快。剩余的多数工作在 CPU 调度时 , 系统调用返回前或中断处理返回前 , 调用 do- bottom - half( ) , 由 bottom half 队列中的任务完成 , 并由内核数组 bh- base[ 32] 指定程序 入口。Linux 定义的 bottom half 队列不超过 32 种 , 都可供用户使用。 # 定时器队列 timer- list。定时器队列是 Linux 提供定时服务的机制。每次时钟中断产 生, 中断服务程序将调用 run- timer - list( ) , 判断是否各定时器时间到和唤醒进程。在适当时 刻, CPU 将执行一遍队列中各节点所指定的相应函数。定时器队列与任务队列有点类似, 但前 者规定了执行任务的确定时刻 , 后者无法规定。
第 22 卷 第 5 期 ห้องสมุดไป่ตู้000 年 10 月
武 汉 汽 车 工 业 大 学 学 报 JOURNAL OF WUHAN AUTOMOTIVE POLYTECHNIC UNIVERSITY
Vol. 22 No. 5 Oct. 2000
文章编号 : 1007 144X( 2000) 05 0053 05
收稿日期 : 2000 02 28. 基金项目 : 国家自然科学基金资助项目 ( 69773021) ; 英国皇家学会合作研究项目 ( the Royal Society Q724) . 作者简介 : 高 洁 ( 1976 ) , 女 , 湖北武汉人 , 武汉交通科技大学硕士研究生 .
54
武
汉
汽
车
第 22 卷 第 5 期
高
洁等 : Linux 进程管理策略
55
先权 , 当前进程有微弱的优势 , 其选择优先权在前面基础上增 1。若所有就绪进程时间片都用 完, 则还将重置时间片。 % 若选中进程不是当前进程 , 则进行进程切换 ; 若当前进程是因为设置了软件定时 time out 而要交出 CPU, 则首先设置定时器并将其挂在适当定时器队列 timer - list 上。定时器 ( t imer) 是 Linux 提供的定时服务机制。它在某特定时刻唤醒进程作一些工作之后 , 切换至新进程。 当此进程已被定时器唤醒后, 则还应删除该定时器。
56
武
汉
汽
车
工
业
大
学
学
报
2000 年 10 月
4
使用调度函数的实例
以上介绍了 schedule( ) 函数的功能 , 下面以一个实例来说明该函数的使用。 当进程必须等待某事件发生时 , 必须进入该事件的等待队列并转入某种睡眠。sleep - on( )
2
进程调度
在 Linux 系统中, 进程没有绝对的优先权, 也就是说一个进程不能停止另一个进程来运行
它自己。每个进程根据自己是否需要等待某些系统资源, 或时间片是否用来决定是否放弃所 占用的 CPU 。 在 Linux 操作系统中 , 没有一个专门的系统进程处理进程调度等事宜。Linux 的进程调度 操作由 schedule( ) 函数执行[ 2] 。这是一个只在内核态运行的函数, 函数代码为所有进程所共 享。schedule( ) 函数的功能主要分成如下 3 个部分 : 唤醒收到信号的 interrupt ible task、 通过计算 选择优先权挑选出下一个占用 CPU 的就绪进程和进程切换 , schedule( ) 函数还要完成其他一些 功能, 如执行 tq- scheduler 任务队列中的处理函数 , 执行 bottom half 队列中的任务, 设置定时器 等。schedule( ) 函数的执行可以由进程自身调用 , 也可因其他外界因素而引发 [ 3] 。 针对 Slackware Linux 的版本 3. 1. 0 的源程序 , 分析其进程调度函数 Schedule( ) 的流程如下 : 判断是否在中断服务程序中调用 schedule( ) , 若是, 则马上退出。在中断服务程序中 , 执行任务队列或 bottom half 队列中任务时不可使用 schedule( ) 进行调度。以全程变量 intrcount 是否为 0 区分是否为这种情况。 若 bottom half 队列中有任务, 则执行之。 ! 执行 tq- scheduler 任务队列中的任务。 ∀ 若当前进程采用轮转法调度且时间片用完 , 则置时间片初值 , 且将其移至 run queue 队 列末。 # 唤醒收到信号的或时间片已到的处于可打断睡眠的进程, 调整其状态为执行。 ∃ 计算 run queue 队列中各任务的选择优先权, 挑选权最大者为下一执行进程。计算选 择优先权由函数 goodness( ) 完成, 实时进程优先权高 , 非实时进程以时间片剩余值作为选择优