1、操作系统实习报告实习一 处理器调度一、实习内容选择一个调度算法,实现处理器调度。二、实习目的在采用多道程序设计的系统中,往往若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占有处理器。本实习模拟在单处理器情况下的处理器调度,加深了解处理器调度的工作。三、实习题目设计一个按优先数调度算法实现处理器调度的程序。提示:(1) 假定系统有5个进程,每个进程用一个PCB来代表。PCB的格式为:进程名、指针、要求运行时间、优先数、状态。进程名P1P5。指针按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。要求运行时间假设进程需要运行的单位时
2、间数。优先数赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态假设两种状态,就绪,用R表示,和结束,用E表示。初始状态都为就绪状态。(2) 每次运行之前,为每个进程任意确定它的“优先数”和“要求运行时间”。(3) 处理器总是选队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。(4) 进程运行一次后,若要求运行时间不等于0,则将它加入队列,否则,将状态改为“结束”,退出队列。(5) 若就绪队列为空,结束,否则,重复(3)。四、数据结构及符号说明进程的定义:struct pcb /* 定义进程控制块PCB */ char name10; /*进程名*/c
3、har state; /*进程状态,就绪或者完成*/int super; /*进程优先级*/int needtime; /*进程所需时间*/int runtime; /*进程已完成时间*/struct pcb* link; /*指向下一进程*/函数说明:1.void insert()功能:进程优先级排列函数,比较进程优先级,将其插入适当的位置。参数:super,依据进程优先级super来确定进程的插入位置。调用:被进程控制块函数和进程就绪函数调用。2.void input()功能:进程控制块函数参数:num,i,name,super,needtime调用:主函数main()调用3. void
4、disp(PCB * pr)功能:进程显示函数,用于显示当前进程。参数:name,state,super,needtime,runtime调用:被进程查看函数check()调用4. void check()功能:进程查看函数,用于显示当前运行进程和就绪队列状态。参数:PCB* pr pr=ready调用:被主函数main()调用5. void destroy()功能:进程撤消函数,用于当进程运行结束时,撤消进程。参数:p-name调用:被进程就绪函数running()调用6. void running()功能:进程就绪函数,当进程运行时间到,置进程就绪状态。参数:p-runtime调用:被主函
5、数main()调用7. main()功能:主函数五、程序流程图六、实验源程序#include #include #include #define getpch(type) (type*)malloc(sizeof(type)struct pcb /* 定义进程控制块PCB */ char name10; char state; int super; int needtime; int runtime; struct pcb* link; *ready=NULL,*p; typedef struct pcb PCB; void sort() /* 建立对进程进行优先级排列函数*/ PCB *fi
6、rst, *second; int insert=0; if(ready=NULL)|(p-super)(ready-super) /*优先级最大者,插入队首*/ p-link=ready; ready=p; else /* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-link; while(second!=NULL) if(p-super)(second-super) /*若插入进程比当前进程优先数大,*/ /*插入到当前进程前面*/ p-link=second; first-link=p; second=NULL; insert=1; else
7、 /* 插入进程优先数最低,则插入到队尾*/ first=first-link; second=second-link; if(insert=0) first-link=p; int input() /* 建立进程控制块函数*/ int i,num; printf(n 请输入进程数?); scanf(%d,&num); for(i=0;iname); printf(n 输入进程优先数:); scanf(%d,&p-super); printf(n 输入进程运行时间:); scanf(%d,&p-needtime); printf(n); p-runtime=0;p-state=w; p-lin
8、k=NULL; sort(); /* 调用sort函数*/ return num; void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/ printf(n qname t state t super t ndtime t runeedtime n); printf(|%st,pr-name); printf(|%ct,pr-state); printf(|%dt,pr-super); printf(|%dt,pr-needtime); printf(|%dt,pr-runtime); printf(n); void check() /* 建立进程查看函数 */ P
9、CB* pr; printf(n * 当前正在运行的进程是:%s,p-name); /*显示当前运行进程*/ disp(p); pr=ready; printf(n *当前就绪队列状态为:n); /*显示就绪队列状态*/ while(pr!=NULL) disp(pr); pr=pr-link; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(n 进程 %s 已完成.n,p-name); free(p); void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ (p-runtime)+; if(p-runtime=p
10、-needtime) destroy(); /* 调用destroy函数*/ else (p-super)-; p-state=w; sort(); /*调用sort函数*/ main() /*主函数*/ int len,h=0; char ch; len=input(); while(len!=0)&(ready!=NULL) ch=getchar(); h+; printf(n The execute number:%d n,h); p=ready; ready=p-link; p-link=NULL; p-state=R; check(); running(); printf(n 按任一
11、键继续.); ch=getchar(); printf(nn 进程已经完成.n); ch=getchar(); 实习二 主存空间的分配和回收一、实习内容主存储器空间的分配和回收。二、实习目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。三、实习题目第一题:在可变分区管理方式下采用首次适应算法实现主存分配和回收。提示:(1) 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,若有,则按需分配,否则,作业无法装入。假定内存大小为128K,初始状态见右图。空闲区说明表格式为:起始地址指出空闲区的起始地址;
12、长度一个连续空闲区的长度;状态有两种状态,一种是“未分配”状态,另一种是“空表目”状态。(2) 采用首次适应算法分配。运行时,输入一系列分配请求和回收请求。四、程序流程为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:起 址长 度状 态第一栏14 K12 K未 分 配第二栏32 K96 K未 分 配MM空 表 目空 表 目MM其中:起址指出一个空闲区的主存起始地址。 长度指出从起始地址开始的一个连续空闲的长度。 状态有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的分配算法流程图:回收算法流程图: 六、实验源程序#include #include #include #define n 10 /*假定系统允许的最大作业为,假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/#de
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1