操作系统课程设计学号 ******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 <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;}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--;//需要时间减1ready_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;}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);}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;}ready_ptr = ready_head;//ptr用来保留原有head信息,用于释放空间ready_head->cputime++;//已用时间加1ready_head->needtime--;//需要时间减一//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;finish_rear = ready_ptr;}reamin_num--;}}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;}}}}五、实验七.主存空间的分配与回收5.1设计目的:主存是中央处理器能直接存取指令和数据的存储器,能否合理地利用主存,在很大程度上将影响到整个计算机系统的性能。