北京工业大学 操作系统课设 报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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);
int choose;//算法选择 1 时间片轮转 2.先来先服务
4.3.2 时间片轮转算法
结果演示:
4.3.3 先来先服务算法
结果演示:
4,3,4 实验源码:
#include <stdio.h> #include <malloc.h> #include<string.h>
typedef struct node { char name[10];//进程标识符 int prio;//进程优先数 int round_num;//进程时间轮转时间片 int cputime;//进程占用 cpu 时间 int needtime;//还需的时间 int count;//计数器 char state;//进程状态 struct node* next;
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;//指向链表下一个节点
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 队列的
}PCB;//进程控制块
变量说明:
PCB *ready_head, *finish_head, *ready_ptr, *finish_ptr, *ready_rear, *finish_rear;//就绪队列头指针,尾指针,操作指针和完结队列的头指针,尾指针,操作 指针
int process_num = 0;//进程数 int reamin_num;//剩余进程数
finish_ptr = finish_ptr->next; } ready_ptr = ready_head;//ptr 用来保留原有 head 信息,用于释放空间 ready_head->cputime++;//已用时间加 1 ready_head->needtime--;//需要时间减一 //ready_head->state = 'W';//调度结束,还原就绪态 if (0 == ready_head->needtime) {//如果不再需要时间
操作系统课程设计
学 号 110703xx 姓 名 xxx 指导教师 金雪云
2014 年 1 月
一、 报告摘要
报告实现了三次实验的全部要求,均以流程图和源代码的形式做了展示,并附上了实验 结果图。
二、 关键词
进程调度,空间分配,磁盘调度,流程图。
三、 引言
本次实验我选择的是完成实验六、实验七和实验九三个任务。
}
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++) {
finish_rear = finish_head = ready_ptr; } else {
finish_rear->next = ready_ptr;
finish_rear = ready_ptr; } reamin_num--; } else {//如果没有做完则移动到队尾,下一个作业变为队头 ready_rear = ready_head; ready_head = ready_head->next; } } finish_ptr = finish_head;//ptr 用来保留原有 head 信息,用于输出链表 printf("=================调度结束================\n"); 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; } } if (2 == 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;//构造头结点 InitPCB(ready_head); scanf("%s%d", ready_head->name, &ready_head->needtime); } else { ready_rear->next = (PCB *)malloc(sizeof(PCB)); InitPCB(ready_rear->next); scanf("%s%d", ready_rear->next->name, &ready_rear->next->needtime); ready_rear = ready_rear->next; } } finish_head = NULL;//初始化为空 while (reamin_num > 0) { printf("=================新一轮调度初态================\n"); printf("进程名\tcpu 时间\t 所需时间\t 状态\n"); ready_ptr = ready_head;//ptr 用来保留原有 head 信息,用于释放空间 finish_ptr = finish_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);
}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;
四、实验六.进程调度
4.1 设计目的:
(1)要求学生设计并实现一个模拟进程调度的算法(时间片轮转及先来先服务)。 (2)理解进程控制块的结构。 (3)理解进程运行的并发性。 (4)掌握进程调度算法。
4.2 设计要求:
(1) 实现时间片轮转算法完成进程的调度。 (2) 实现先来先服务算法完成进程的调度。