北京工业大学 操作系统课设 报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统课程设计

学号 ******xx

姓名 xxx

指导教师金雪云

2014年1月

一、报告摘要

报告实现了三次实验的全部要求,均以流程图和源代码的形式做了展示,并附上了实验结果图。

二、关键词

进程调度,空间分配,磁盘调度,流程图。

三、引言

本次实验我选择的是完成实验六、实验七和实验九三个任务。

四、实验六.进程调度

4.1设计目的:

(1)要求学生设计并实现一个模拟进程调度的算法(时间片轮转及先来先服务)。

(2)理解进程控制块的结构。

(3)理解进程运行的并发性。

(4)掌握进程调度算法。

4.2设计要求:

(1)实现时间片轮转算法完成进程的调度。

(2)实现先来先服务算法完成进程的调度。

4.3详细设计:

4.3.1数据结构设计及变量说明

进程控制块:

typedef struct node {

char name[10];//进程标识符

int round_num;//进程时间轮转时间片

int cputime;//进程占用cpu时间

int needtime;//还需的时间

int count;//计数器

char state;//进程状态

struct node* next;//指向链表下一个节点

}PCB;//进程控制块

变量说明:

PCB *ready_head, *finish_head, *ready_ptr, *finish_ptr, *ready_rear, *finish_rear;//就绪队列头指针,尾指针,操作指针和完结队列的头指针,尾指针,操作指针

int process_num = 0;//进程数

int reamin_num;//剩余进程数

int choose;//算法选择 1 时间片轮转 2.先来先服务4.3.2时间片轮转算法

结果演示:

4.3.3先来先服务算法

结果演示:

4,3,4实验源码:

#include #include #include

typedef struct node {

char name[10];//进程标识符

int prio;//进程优先数

int round_num;//进程时间轮转时间片

int cputime;//进程占用cpu时间

int needtime;//还需的时间

int count;//计数器

char state;//进程状态

struct node* next;

}PCB;

void InitPCB(PCB* pcb) {

strcpy(pcb->name, "none");

pcb->prio = 1000;

pcb->round_num = 0;

pcb->cputime = 0;

pcb->needtime = 0;

pcb->count = 0;

pcb->state = 'W';

pcb->next = NULL;

}

void main() {

PCB *ready_head, *finish_head, *ready_ptr, *finish_ptr, *ready_rear,

*finish_rear;//就绪队列头指针,尾指针,操作指针和完结队列的头指针,尾指针,操作指针

int process_num = 0;//进程数

int reamin_num;//剩余进程数

int choose;//算法选择 1 时间片轮转 2.先来先服务

while (1) {

printf("请选择调度算法:\n");

printf("1. 时间片轮转法 2.先来先服务算法 0.退出\n");

scanf("%d", &choose);

if (0 == choose) {

return;

}

if (1 == choose) {

printf("请输入进程数:\n");

scanf("%d", &process_num);

reamin_num = process_num;//初始化剩余进程数为进程数

for (int i = 0; i < process_num; i++) {

printf("请输入第%d个进程的标识符以及运行时间:\n", i + 1);

if (0 == i) {

ready_head = (PCB *)malloc(sizeof(PCB));

ready_rear = ready_head;//构造头结点

ready_rear->next = ready_head;//首尾相连

InitPCB(ready_head);

scanf("%s%d", ready_head->name, &ready_head->needtime);

} else {

ready_ptr = (PCB *)malloc(sizeof(PCB));

InitPCB(ready_ptr);

scanf("%s%d", ready_ptr->name, &ready_ptr->needtime);

ready_rear->next = ready_ptr;

ready_ptr->next = ready_head;

ready_rear = ready_rear->next;

}

}

finish_head = NULL;//初始化为空

while (ready_head->needtime > 0) {

printf("=================新一轮调度初态================\n");

printf("进程名\tcpu时间\t所需时间\t状态\n");

ready_ptr = ready_head;//ptr用来保留原有head信息,用于输出链表

finish_ptr = finish_head;//ptr用来保留原有head信息,用于输出链表

ready_head->state = 'R';//就绪队列头设置为运行

for (int i = reamin_num; i > 0; i--) {//输出所有剩余节点信息

printf("%s\t%d\t%d\t%c\n", ready_ptr->name, ready_ptr->cputime, ready_ptr->needtime, ready_ptr->state);

ready_ptr = ready_ptr->next;

}

while (finish_ptr != NULL) {//输出调度结束节点的信息

printf("%s\t%d\t%d\t%c\n", finish_ptr->name, finish_ptr->cputime, finish_ptr->needtime, finish_ptr->state);

finish_ptr = finish_ptr->next;

}

//getch();

ready_ptr = ready_head;//ptr用来保留原有head信息,用于释放空间

ready_head->cputime++;//所用时间增加

ready_head->needtime--;//需要时间减1

ready_head->state = 'W';//调度结束,还原就绪态

if (0 == ready_head->needtime) {//如果不再需要时间且为队头

ready_head = ready_head->next;//循环链表的移动

ready_rear->next = ready_head;

ready_ptr->next = NULL;//断开连接

ready_ptr->state = 'F';

if (reamin_num == process_num) {//头一个进入finish队列的

finish_rear = finish_head = ready_ptr;

} else {

finish_rear->next = ready_ptr;

相关文档
最新文档