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条)