实验4、进程调度算法实验。
4.1实验目的与要求:
通过了解在真实的操作系统中它是怎样实现教材中讲解的进程调度效果的,加深对进程调度概念的理解,体验进程调度机制的功能;
了解linux系统中进程调度策略的使用方法,练习进程调度算法的编程和调试技术。根据示例程序和独立实验程序中观察和记录的信息及其结果分析写出实验报告。
4.2实验背景知识说明。
在linux系统中调度策略(policy)可以是以下3种:sched_other默认的分时调度策略(值等于0)sched_fifo先进先先出调度策略(值等于1)sched_rr时间片轮转调度策略(值等于2)后两种专用于对响应时间有特殊要求的进程,并且会抢先于sched_other调度策略的进程而执行。一个具有sched_fifo调度策略的进程只能被更高优先级的进程抢先,但具有sched_rr调度策略的进程必要时可以与同级进程共享时间片。
进程优先数(prio)由静态优先数和动态优先数两部分组成,值越小调度优先级越高。具有sched_other策略的进程静态优先数总是0。动态优先数与进程的执行状态有关,但可以使用nice命令或系统调用加大进程优先数使其优先级降低,或用系统调用setpriority分别按进程或进程组或用户号设置介于-20到+20之间的动态优先数。
与进程调度策略有关的系统调用函数原型都声明在以下文件中:#include <>#include #include
设置进程调度策略的系统调用语法为:
int sched_setscheduler(pid_t pid,int policy,const struct sched_param *sp);
pid进程号。
policy以上说明的3种调度策略之一。
sp调度参数结构指针,调度参数结构主要存有调度优先数struct sched_param ;
返回值:执行成功后返回0
获取进程调度策略的系统调用语法为:int sched_getscheduler(pid_t pid);pid进程号。
返回值:进程当前的调度策略。
设置进程动态优先数的系统调用语法为:
int getpriority(int which,int who);which设置的对象。可以是:
进程prio_process进程组prio_pgrp用户prio_user
who对应设置对象的进程号或组号或用户号返回值:所有匹配进程中的最高优先数设置进程动态优先数的系统调用语法为:int setpriority(int which,int who,int prio);which设置的对象。
可以是:进程prio_process进程组prio_pgrp用户prio_user
who对应设置对象的进程号或组号或用户号prio要设置的进程优先数。
返回值:所有匹配进程中的最高优先数。
4.3示例实验。
以下示例实验程序测试在linux系统中不同调度策略和不同优先数的调度效果。1)建立以下名为的c语言程序:/*
filename :
function :父进程创建3个子进程为它们设置不同的优先数和调度策略*/
#include <>#include <>#include <>#include #include int main(int argc, char *ar**)
/各子进程循环报告其优先数和调度策略else
exit( exit_success);}
/父进程报告子进程调度策略后先行退出。
printf("my child %d policy is %d",pid[0],sched_getscheduler(pid[0]))printf("my child %d policy is %d",pid[1],sched_getscheduler(pid[1]))printf("my child %d policy is %d",pid[2],sched_getscheduler(pid[2]))return exit_success;}
a)编译连接生成可执行文件psched:
b)运行psched,指定3个子进程的优先数为10, 5, -10;调度策略都是默认策略#./psched 10 5 -10 0 0 0
c)再次运行psched,指定3个子进程的优先数为10, 5, 18;调度策略分别是0,0,1# ./psched 10 5 18 0 0 1
2)建立以下名为的c语言程序:/*
filename :
function :观测linux调度使用fifo策略和rr策略的特点和异同*/
#include<>#include<>#include<>#include
#include#include
#include<>
#define __use_gnu#include<>#include<>
#include<>
#define count 300000#define million 1000000l#define nanosecond 1000
void test_func()}
int main(int argc,char* ar**)struct sched_param param;int ret = 0;
if(argc !=3)
cpu_set_t mask ;cpu_zero(&mask);cpu_set(1,&mask);
if (sched_setaffinity(0, sizeof(mask), mask) =1)
int sched_method = atoi(ar**[1]);int sched_priority = atoi(ar**[2]);
*if(sched_method > 2 ||sched_method < 0)
if(sched_priority > 99 ||sched_priority < 1)
if(sched_method ==1 ||sched_method ==2)*/
int scheduler = sched_getscheduler(getpid())
fprintf(stderr,"the schedulerofpid(%ld)is%d,priority(%d),begintimeis :%ld",getpid(),scheduler,sched_priority,time(null));
sleep(2);
= nanosecond;
*if(gettimeofday(&tstart,null)!=0)*/
for(i = 0;itest_func();
if(gettimeofday(&tend,null)!=0)*/
interval = million*(
/fprintf(stderr,"sched_method:%dpri:%d theexpectedtimeis%dus,butrealtime cost is %lu us",/sched_method,sched_priority,count,interval);
fprintf(stderr," pid = d\t priority: %d\tend timeis %ld",getpid(),sched_priority,time(null));return 0;}
a)编译连接生成可执行文件psched2:
b)运行psched2,观察进程调度和切换的顺序。
4.4独立实验。
设有两个并发执行的父子进程,不断循环输出各自进程号、优先数和调度策略。进程初始调度策略均为系统默认策略和默认优先级。当某个进程收到sigint信号时会自动将其优先数加1,收到sigtstp信号时会自动将其优先数减1。
请编程实现以上功能。备注:父进程、子进程分别处理一个信号即可。
实验4 进程通信
1 熟悉操作系统进程通信原理。2 设计程序,实现共享内存 管道通信 消息通信。1 进程间通信的几种方法简介。1 消息队列 消息队列是消息的链接表,包括posix消息队列systemv消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。2 共享内存 使得多个进程可...
实验4进程管理
实验 程管理 进程互斥与同步实验。实验目的。1 进一步认识并发执行的实质。2 分析进程竞争资源的现象,学习解决进程互斥的方法。3 掌握用linux信号灯集机制实现两个进程间的同步问题。实验内容。调试运行程序,观察并分析出现的现象。实验指导。一 所涉及的系统调用。lockf files,functio...
实验1进程调度模拟程序设计
一 实验目的。加深对进程概念和进程调度过程 算法的理解。二 实验内容。1 用c语言设计一个对n个并发进程进行调度的程序,每个进程由一个进程控制块 pcb 结构表示,该进程控制块应包括下述信息 进程标识id 进程优先数priority 并规定优先数与优先权成正比 时间片数chip 进程已经占用cpu的...