操作系统实习报告

目录

一、 进程调度 2

1. 短作业优先调度算法 2

1.1题目内容 2

1.2题目要求 2

1.3设计思想 3

1.4算法分析 3

1.4.2程序结构 3

1.4.2数据结构 3

1.5核心代码 5

1.6程序流程图 6

1.7测试数据或截图 6

2. 时间片轮转调度算法 7

2.1题目内容 7

2.2题目要求 7

2.3设计思想 7

2.4算法分析 8

2.4.1程序结构 8

2.4.2数据结构 8

2.5核心代码 9

2.6程序流程图 11

2.7测试数据或截图 12

二、 磁盘调度管理 12

1. 题目内容 12

2. 题目要求 12

3.设计思想 13

4.算法分析 13

4.1程序结构 13

4.2数据结构 13

5.核心代码 15

7.测试数据或截图 17

三、 心得体会 18

 

 

 

一、进程调度

1. 短作业优先调度算法

1.1题目内容

设计程序模拟单处理机系统中的进程调度算法,在短作业优先调度算法、 时间片轮转调度、最高优先级优先算法三种算法中选择两种实现。

1.2题目要求

每个进程由一个进程控制块(PCB)表示。进程控制块可以包含如下信息: 进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等。进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数 产 生)。进程的到达时间为进程输入的时间。

进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪W(Wait)、运行R(Run)或完成F(Finish)3 中状态之一。

1.3设计思想

该算法先比较作业运行时间长短,运行时间短的作业先执行,如果运行 时间相同,则按照到到达时间执行,到达时间早的先执行。

1.4算法分析

1.4.1程序结构

①输入部分:

void input(PCB *p,int N)

{

int i;

printf("请输入进程的名称、到达时间和运行时间:\nfor example:a 0 100\n");

for(i=0;i<=N-1;i++)

{

printf("请输入第%d个进程的信息:\n",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].runtime);

}

}

②输出部分:

oid output(PCB *p,int N)

{

int k;

printf("优先运行顺序:");

printf("%s",p[0].name); for(k=1;k<N;k++)

{

printf("-->%s",p[k].name); }

printf("\n各个进程的信息:\n");

printf("\n名称\t到达\t运行\t开始\t完成\t周转\t带权周转 \n");

for(k=0;k<N;k++)

{

printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k]. name,p[k].arrivetime,p[k].runtime,p[k].starttime,p[k].finishtim e,p[k].zztime,p[k].dqzztime);

}

}

③排序部分:用冒泡排序法将到达时间降序排序

void sort(PCB *p,int N)

{

for(int i=0;i<N;i++)

for(int j=0;j<i;j++)

if(p[i].arrivetime<p[j].arrivetime) {

PCB t;

t=p[i];

p[i]=p[j];

p[j]=t;

}

}

④计算部分:为了得到每个进程的结束时间

void deal(PCB *p,int N)/{

int k;

 

for(k=0;k<N;k++)

{

if(k==0) {

p[k].starttime=p[k].arri

(1)进程的软中断通信 #include #include #include #include int wait_flag; void stop(); main( ) { int pid1, pid2; // 定义两个进程号变量 signal(2,stop); // 或者 signal (14,stop); while((pid1 = fork( )) == -1); // 若创建子进程1不成功,则空循环 if(pid1 > 0) { // 子进程创建成功,pid1为进程号 while((pid2 = fork( )) == -1); // 创建子进程2 if(pid2 > 0) { wait_flag = 1; //sleep(1); // 父进程等待5秒 kill(pid1,SIGUSR1); // 杀死进程1 kill(pid2,SIGUSR2); // 杀死进程2 wait(0); wait(0); printf("\n Parent process is killed !!\n"); exit(0); // 父进程结束 } else { wait_flag = 1; signal(SIGUSR2,stop); // 等待进程2被杀死的中断号17 printf("\n Child process 2 is killed by parent !!\n"); exit(0); } } else { wait_flag = 1; signal(SIGUSR1,stop); // 等待进程1被杀死的中断号16 printf("\n Child process 1 is killed by parent !!\n"); exit(0); } } void stop() { wait_flag = 0; } (2)进程的管道通信 #include #include #include int pid1,pid2; // 定义两个进程变量 main( ) { int fd[2]; char OutPipe[100],InPipe[100]; // 定义两个字符数组 pipe(fd); // 创建管道 while((pid1 = fork( )) == -1); // 如果进程1创建不成功,则空循环 if(pid1 == 0) { lockf(fd[1],1,0); // 锁定管道 sprintf(OutPipe,"\n Child process 1 is sending message!\n"); write(fd[1],OutPipe,50); // 向管道写入数据 sleep(5); // 等待读进程读出数据 lockf(fd[1],0,0); // 解除管道的锁定 exit(0); // 结束进程1 } else { while((pid2 = fork()) == -1); // 若进程2创建不成功,则空循环 if(pid2 == 0) { lockf(fd[1],1,0); sprintf(OutPipe,"\n Child process 2 is sending message!\n"); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else { wait(0); // 等待子进程1 结束 read(fd[0],InPipe,50); // 从管道中读出数据 printf("%s\n",InPipe); // 显示读出的数据 wait(0); // 等待子进程2 结束 read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0); // 父进程结束 } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值