基于Linux随机进程调度算法的实现

基于Linux随机进程调度算法的实现


2024年4月21日发(作者:)

l{)8 福 建 电脑 2013年第2期 

基于Linux随机进程调度算法的实现 

俞露 

(南京师范大学计算机科学与技术学院江苏南京210000) 

【摘 要】:本文分析了Linux 0.11版本中的进程调度算法,并在此基础上设计了一种新的 

调度算法——进程随机调度算法。本文利用Winlmage软件导出(导入)相应的进程调度文件至 

Windows系统(Linux系统),利用Editplus软件将原有的进程调度算法替换成新的调k S-法,实 

现了Windows平台和Linux平台的交互,最后成功地完成了Linux内核的重新编译。 

【关键词】:Linux;内核;进程随机调度 

0、引言 

程的优先权.采取优先权调度算法来选择随后要 

管理进程是操作系统的重要任务之一 进程 执行的任务 

的调度(也称短程调度)则是进程管理的重中之 

2、优先权调度算法(Linux

O.1 1): 

_

重。在单处理器的环境中.任意时刻内存中有且仅 循环检查任务数组中的所有任务.根据每个 

er.来选取该 

有一个进程占有处理器资源处于运行态.其余进 

就绪态任务剩余执行时间的值count

程则处于等待态或就绪态。那么.操作系统怎样来 

值最大的一个任务.即所需剩余执行时间越长的 

并利用switch tof)函数切换到 

分配处理器资源.又是怎样来防止进程的饥饿和 

任务的优先权越高,

死锁?开源的Linux操作系统的内核可以满足我 该任务 若所有就绪态任务该值都为0,表示此刻 

们的好奇心.我们可以在掌握Linu)【操作系统进 

所有任务的时间片都已经运行完毕.于是就根据 

程调度机制的基础上设计新的调度算法.实现对 

任务的优先权值priority.重置每个任务的运行时 

问片值c0uriter,count:COunt/2+priority,再重新执 

行循环检查所有任务的执行时间片值 

3、随机调度算法及实验实现 

Linux内核调度函数决定采用何种调度策略 

选择就绪进程运行.确保进程所获得的CPU访问 首先循环检查任务数组中的所有任务.将就 

LinUX内核重新编译 

1、Linux进程调度过程 

时间和其指定的优先级以及进程类型相匹配.消 

绪态进程依次从小到大标号. 并统计处于就绪态 

除进程对CPU资源的饥饿状态 

进程的总数sum。利用iififes产生随机数,选择标 

Linux内核中有关进程调度管理的文件为 号为iiffies%sum的进程作为switch 函数所切

toO 

sched.c文件.在sched.c文件中有一个重要的函 

换的进程 

数schedule0负责选择系统中下一个将要运行的 

进程。 

同时.和上述算法一致.若所有进程的时问片 

是否都已耗尽.则重置每个任务的运行时间片值 

它首先对所有的任务进行选择.唤醒任何一 

counter。 

3.1实验平台 

个已经得到信号的任务 

其次.针对任务数组中的每个任务,检查其报 硬件平台:PC机 

警定时值alarm 如果任务的alarm时间已经过期 

(alarm<iiies1,则在它的信号位网中设置 f

操作系统:Linux 

辅助软件:Winlmage、Editplus 

3.2实验内容 

SIGALRM信号,然后清alarm的值,f ffies是一个 

修改Linux 0.1 1巾内核调度函数scheduleO 

全局变量.是系统从开机开始算起的滴答数)如果 

进程的信号位图中除被阻塞的的信号外还有其他 函数.将原有的优先级调度算法修改成为随机{J吉I 

并且重新编译内核。 

的信号.并且读进程处于可中断睡眠状态.则置进 

度算法.

程为就绪状态 

Ijnux调度函数是根据进程的时间片确定进 

3.3实验步骤 

①搭建Linux 0.1 l平台,安装Winlmage、Ed 

2013年第2期 福 建 电脑 109 

itplus软件。 

//以下代码是从任务数组的最后一个任务开始循环处理. 

②进入Linux内核,用mcopv命令将sched.c 

并跳过不含任务的数组槽 

文件复制到相应磁盘巾 

while,(:---i)' 

{ 

③用WinImage软件将Linux系统相应磁盘 

if f! --p、, 

巾的sched.c文件提取至Windows文件系统。④用 

continue; 

EditplIus软件编辑sched.c文件.修改进程捌度算 

(( p)一->state== 队SK—RUNNING&& P)一> 

counter>O1 

法并保存 

f 

⑤用WinImage软件将相应磁盘中的sched.C 

sLlⅡl++: 

//统计处于就绪态并且时问片未耗尽的进程总数 

文件提取至LintUX系统下 

no[hi=i; 

⑥进入Hnux内核.用mcopy命令将修改后 

//为每一个处于就绪态并且时间片未耗尽的进程编号。 

的sched.C文件复制到相应磁盘中 

n++: 

⑦用make clean语句清除以前编译的可执 

l 

} 

行文件及配置文件 

if(sum)break; 

⑧用make语句重新编译内核。 

,/如果sum的值不为零.则存在counter值不等于0的进 

程,那么跳出最上层的while循环,执行任务切换程序。否则代 

3.4实验部分代码 

表所有进程的时间片都已经使用完毕.需要重新设置时间片 

void schedule(voif) 

值.重新执行。 

f 

f0 =&LAST__1 .SK;P>&HRST_TASK;一13) 

int i,n,.sum,rand.,next; 

if P) 

int no[NR_TASKS]; 

( p)一>counter=(( p)一>counter>>1)+( p)一->priori-- 

//no数组用于为内存中可以运行的进程(任务)编号。 

ty; 

//sum记录可以参加调度的进程(任务)总数。 

l 

//rand记录随机产生的数字。 

rand=jifies%sum;//jififes为时钟滴答数.在此用来产生随机 

//next下一次访问的进程(任务)号。 

数 

struct task

struct p; 

next=no[rand]; 

,,指向任务结构指针的指针 

switch to(next);//t ̄换到任务号为ne:xt的任务。并运行。 

fortp=&LXS'I_’1'ASK;p>&HRS'1’_] SK;一P) 

} 

/从任务数组中的最后一个任务开始查找 

4、总结 

if p){ 

,,如果任务的alarm时间已经过期(alarm<jiifes),在信号 

本次实验实现了进程的随机调度,算法简单, 

位图中置SIGALRM信号,然后清alarm。 

且时间复杂度和空间复杂度都不高。在实际的运 

if( p)一>alarm&& p)->alaml<jimes){ 

用中,根据系统的需求和实际情况,可以设计诸如 

( p)->signall=(1<<(SIGALRM-1)); 

( 'p)->alarm=O; 

多级反馈队列、彩票法等更加复杂的算法.在调度 

1 

的过程中更好地体现进程的优先级别。 

,/如果信号位图中除去被阻塞的信号外还有其他信号并 

且任务处于可中断状态.则置任务为就绪状态。 

if“( p)一>signal& ̄(_BLOCKABLE&( p)--->blocked))&&(' p) 

参考文献: 

>state==TASK

【1】赵炯.Linux内核0.11详细注释[M】.机械工业出版社, 

_

INTERRUPTIBLE1 

p)一.>state=TASK_RUNNING; 

2004:76-77 

} 

【2】孙忠秀.操作系统教程【M】.高等教育出版社,2012:一 

//这是调度程序的主要部分 

while(1) 

[3]cn2008.读Linux内核0.11完全注释[EB/OL].2006— 

f 

3—7[2013—1—28].http://os.chinaunix.net/a2006/0307/ 

/,变量的初始化。 

1001/000001001571.shtm1. 

sum=0; 

『41雏勇,王青,李明树.Linux内核的实时支持的研究与实 

n=O: 

现U】.计算机研究与发展.2002(04 ̄l: 

next=0: 

i=NR

『51钟汉如,王创生.嵌入式Linux中调度算法的实现及优 

_

TASKS; 

P=&task[NR_%'ASKS]; 

化ⅡJ.计算机工程与科学..200203',l: 


发布者:admin,转转请注明出处:http://www.yc00.com/news/1713685730a2298204.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信