收藏 分享(赏)

进程调度算法__操作系统课程设计.doc

上传人:buyk185 文档编号:6987785 上传时间:2019-04-29 格式:DOC 页数:26 大小:218KB
下载 相关 举报
进程调度算法__操作系统课程设计.doc_第1页
第1页 / 共26页
进程调度算法__操作系统课程设计.doc_第2页
第2页 / 共26页
进程调度算法__操作系统课程设计.doc_第3页
第3页 / 共26页
进程调度算法__操作系统课程设计.doc_第4页
第4页 / 共26页
进程调度算法__操作系统课程设计.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、计算机科学与应用系操作系统原理课程设计报告题目: 进程调度算法 班级: 0510074姓名: lee hye 专业: 计算机科学与技术 指导老师: hhh 操作系统课程设计2进程调度算法一、实验目的通过优先权法与轮转调度算法的模拟加深对进程概念和进程调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。二、实验内容1、用 C 语言或 C+语言来实现对 N 个进程采用优先算法以及轮转算法的进程调度。2、每个用来标示进程的进程控制块 PCB 用结果来描述,包括以下字段(1)进程标识 ID,其中 0 为闲逛进程,用户进程的标识数为1、2、3、 、 、 、 、 、 、 。(2)

2、进程优先级 Priority,闲逛进程(idle)的优先级为 0,用户有进程的优先级大于 0,且随机产生,标识数越大,优先级越高。(3)进程占用的 CPU 时间 CPUtime,进程每运一次,累积等于 4.(4)进程总共需要运行时间 Alltime,利用随机函数产生。(5)进程状态,0就绪态,1运行态,2阻塞态。(6)队列指针 next,用来将多个进程控制块 PCB 链接为队列。3、优先数改变的原则(1)进程在就绪队列中每呆一个时间片,优先数增加 1.(2)进程每运行一个时间片,优先数增加 1.4、在调度前,系统中拥有的进程数 PCB_number 有键盘输入,进初始化后,所有的进程控制块 P

3、CB 连接成就绪队列。5、为了清楚的观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来。三、实验步骤1、进程管理程序调式好后,运行进程管理程序操作系统课程设计3YNNYYNNYYNNYready-queue 是否为空将 Running 从 ready_queue 中删除,再将 running 加入block_queueb将其从 blick_queuek 队列是中删除,再将其加入 ready_queuek 输入开始进程数 n随机 对 block_queue 中的进程 PCB 询问是否要唤醒?创建新进程并加入到 ready_queue 中Runningi;while(i)操作系统课程设

4、计10if(i=1)couti;return 0;/输出所有 PCB 的初始值void print_init(PCB *pcb)PCB* temp=pcb-next ;coutIDpriorityCPUtimeALLtime;if(temp-State=0)coutState =1)coutnext;/输出进程属性信息void print(PCB *pcb)操作系统课程设计11PCB *temp;temp=pcb;if(pcb-ID=0)coutIDpriorityCPUtimeALLtime;if(temp-State=0)coutState =1)coutnext;while(p!=0p=

5、p-next;if(p=0)item-next =0;q-next=item;elseitem-next =p;q-next =item;/将 item 插入到阻塞队列的尾部void pushback_queue(PCB *queue,PCB *item)PCB *p,*q;q=queue,p=q-next;while(p!=0)操作系统课程设计12q=p;p=p-next;item-next =q-next ;q-next =item;/对 queue 中的结点进行排序,按照优先级从大到小void sort_queue(PCB *temp-next =0;while(queue-next )

6、PCB *p;p=queue-next;queue-next =p-next ;insert_queue(temp,p);queue-next =temp-next ;delete temp;/生成进程属性信息,插入进程就绪队列,显示进程信息void insert()PCB *newp=0;static long id =0;newp=new PCB;id+;newp-ID =id;newp-State=0;newp-CPUtime=0;newp-priority=rand()%3+1;newp-ALLtime=rand()%3+1;newp-next =NULL;pushback_queue

7、(ready_queue,newp);/print(newp);/cout readyn“);/生成 n 个进程属性信息,插入进程就绪队列,显示进程信息void insert(int n)for(int i=0;inext=0;ready_queue=new PCB;ready_queue-next=0;int i=0,pcb_number=-1;/闲逛进程放入就绪队列idleprocess=NULL;idleprocess=(PCB *)malloc(sizeof(PCB);idleprocess-ID=0;idleprocess-State=0;idleprocess-CPUtime=0;

8、idleprocess-priority=0;idleprocess-ALLtime=0;idleprocess-next=NULL;idleprocess-next=ready_queue-next;/闲逛进程放入就绪队列ready_queue-next=idleprocess;/也可以假定初始时系统中只有一个 idle 进程/输入初始进程的个数while(pcb_numberpcb_number;coutState=2;pcb-CPUtime-=2;if(pcb-CPUtimeCPUtime+=2;操作系统课程设计14coutID blockedn“);pcb-next=block_que

9、ue-next;block_queue-next =pcb;/更新进程信息,就绪队列中进程的优先级均增加 1void update(PCB *pcb)PCB *temp=pcb-next;while(temptemp=temp-next;/唤醒进程,插入就绪队列void wakeup()if(block_queue-next=0)/*此时没有阻塞的进程,无所谓的唤醒*/return ;PCB *q,*p;while(true)q=block_queue;p=q-next;while(pp=p-next;if(p!=0)q-next =p-next ;break;p-State=0;cout r

10、eady“ID=0)insert_queue(ready_queue,pcb);print(pcb);cout runningn“;elsepcb-State=1;pcb-CPUtime+=4;pcb-priority=pcb-priority -3;/*每运行一个时间片,其优先数减 3*/if(pcb-priority priority=1;print(pcb);printf(“变迁 1: ready - runningn“);if(rand()%3=1)/*PCB 不是闲逛进程,满足条件侧阻塞此进程*/if(pcb-CPUtime-2ALLtime)block(pcb);else/*已执行

11、完毕,应该销毁进程*/coutIDDestroy“CPUtime=pcb-ALLtime)/*释放*/coutID Destrory“ID=0)insert_queue(ready_queue,pcb);print(pcb);cout runningn“;elsepcb-State=1;pcb-CPUtime=pcb-ALLtime;print(pcb);printf(“变迁 1: ready - runningn“);if(rand()%3=1)/*PCB 不是闲逛进程,满足条件侧阻塞此进程*/_state=1;block(pcb);elsecoutID Destrory“next;read

12、y_queue-next =running-next ;coutnext;ready_queue-next =running-next ;cout0)times=times-running-ALLtime;/每次运行一个进程减去 ALLtime;if(times=0)Run_loop(running);else if(_state) /如果运行时被阻塞,则运行 2 个时间单位times=times+2;_state=0;操作系统课程设计18coutvoid main()int p1,p2;while(p1=fork()=-1);/创建子进程if(p1=0)putchar(b);elsewhil

13、e(p2=fork()=-1);/创建子进程if(p2=0)putchar(c);elseputchar(a);/父进程2、进程的控制#include操作系统课程设计21void main()int p1,p2;while(p1=fork()=-1);/创建子进程if(p1=0)for(int i;i#include#include#include#include#includevoid main()int fd,spid,ppid;char str80;fd=open(“myfile“,O_RDWR|O_CREAT,0644);if(cpid=fork()=-1)lseek(fd,0,0);

14、exit(1);else if(cpid0)lseek(fd,0,0);if(lockf(fd,0,0)=-1)perror(“lock failure“);exit(1);操作系统课程设计22printf(“I am a parent process,my pid is %dn“,getid();printf(“Please input a string:n“);scanf(“%s“,str);lseek(fd,0,0);write(fd,str,sizeof(str);lseek(fd,0,0);if(lockf(fd,0,0)=-1)perror(“unlock failure“);ex

15、it(1);elsesleep(1);lseek(fd,0,0);if(lockf(fd,0,0)=-1)perror(“lock failure“);exit(1);lseek(fd,0,0);read(fd,str,sizeof(str);lseek(fd,0,0);if(lockf(fd,0,0)=-1)perror(“unlock failure“);exit(1);printf(“nI am a parent process,my pid is %dn“,getid();printf(“Please input a string:n“);printf(“%sn“,str);3、软中断

16、通信编制一段程序,使其实现进程的软中断通信。使用系统调度 fork()创建两个子进程,再用系统调用 signal()让父进程捕捉键盘上来的中断信号(即按 Del 键) ;当捕捉到中断信号后,父进程用系统调用 kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后中止。Child Process 1 is killed by Parent!Child Process 2 is killed by Parent!操作系统课程设计23#include#include#includevoid stop();int wait_mark;void main()int p1,p2,stdou

17、t;while(p1=fork()=-1);if(p10)while(p2=fork()=-1);if(p20)wait_mark=1;printf(“Input any char to stop:“);getchar();kill(p1,16);kill(p2,17) ;wait(0);wait(0);printf(“Parent process is killed!n“);exit(0);elsewait_mark=1;signal(17,stop);while(wait_mark!=0)lockf(stdout,1,0);printf(“Child process 2 is killed

18、 by parent!n“);locf(stdout,0,0);exit(0);elsewait_mark=1;while(wait_mark!=0)lockf(stdout,1,0);printf(“Child process 1 is killed by parent!n“);lockf(std,0,0);操作系统课程设计24exit(0);void stop()wait_mark=0;4、进程的管道通信编制一段通信,实现进程的管道通信。使用系统调用 pipe()建立一条管道线;两个子进程 P1 和 P2 分别向管道写一句话:Child1 is senging a message!Chil

19、d2 is sending a messaga!而父进程则从管道中读出来自于两个子进程的消息,显示在屏幕上。要求父进程先收集子进程 P1 发来的消息,然后在接受子进程 P2 发来的消息。#include#include#includeint pid1,pid2;void main()int fd2,n1,n2;char outpipe100,inpipe100;pipe(fd);while(pid1=fork()=-1);if(pid!=0)lockf(fd1,0,0);sprintf(outpipe,“child1 process is sending message!n“);write(f

20、d1,outpipe,36);sleep(5);lockf(fd1,0,0);exit(0);elsewhile(pid2=fork()=-1);if(pid2=0)sprintf(outpipe,“child1 process is sending message!n“);write(fd1,outpipe,36);操作系统课程设计25阻塞就绪 执行 僵死sleep(5);lockf(fd1,0,0);exit(0);elsewait(0);write(1,inpipe,n1);wait(0);n2=read(fd0,inpipe,50);write(1,inpipe,n2);exit(0)

21、;四、实验过程中遇到的问题及解决方案1、系统调用 fork()可以创建一个新进程,其声明格式为:#include#includePid_t int fork();调用成功时,该调用对父进程返回子进程的 PID,对子进程返回 0.调用失败时,对父进程返回-1,没有创建子进程。2、在对可执行文件加载时进行了加锁和解锁,实现进程间的互斥。函数lockf 用于锁定文件的某些段或者整个文件。3、在进程的控制中,调用 fork 函数创建一个父进程,用 cpid 返回其值,if(cpid0)父进程的调用。4、进程间用 kill 向其他进程发送信号,可以向任何进程或进程组发送任何信号;用 signal 接收并设置对信号的处理方法。五、课程设计总结进程描述符即为进程控制块。Linux 的进程控制块由 task_struct 结果表示,其结构在 sched.h 里定义。主要进城标识、调度相关信息、进程虚拟空间信息、文件相关信息、信号处理信息、记账信息及统计信息、描述进程间关系的指针等。Linux 中的进程或任务由一个 task_struct 数据结构表示。Linux 进程模型:信号信号调度创建 时间片到 终止操作系统课程设计26

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报