北京工业大学 操作系统课设 报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
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;