1、int main()coutt;Sleep(100); switch(t) case 1: windows_cpu(t);break; case 2: windows_M(t); case 3: windows_VM(t); case 4: default: coutruntime-; current+; if(p1-runtimepname);state=C; p2-next=p1-next; delete p1; p1=NULL;本段代码是运行进程时当运行队列队首不为空时进行进程运行,重复给队首进行占用时间片,当队首进程运行时间结束后,将程序从运行队列移出,转为下一个进程。2.3.1.3
2、算法效果演示图7 FCFS实现2.3.2 按时间片转轮法实现处理机调度2.3.2.1 算法描述以及算法数据结构1.RR与FCFS代码比较 程序pcb和运行代码与上算法基本相同,代码不同处有2点:1.FCFS就绪队列不空时,允许进入到运行队列的进程仅能有一个,但RR算法需要全部进入。2.FCFS 运行队列取进程运行后强行占有时间片直至结束,RR算法运行完单位时间片后加指针后移(轮转代码)。2.装载代码解析 p3=head_input.next;head_input; /装载运行队列进程 while(p3! if(unsigned long)p3-arrivetime state=R)/满足条件
3、printf(Process %s start,n,(current+500)/1000,p3- p2-next=p3- p3- p1-next=p3; p3=p2; if(!is_RR) goto loop;/转移指令 p2=p3; p3=p3-2.3.2.2 算法效果演示图8 RR算法实现2.4 主存空间的分配与回收模块2.4.1 首次适应法分配管理链式可变分区2.4.1.1 算法描述当有进程要求分配主存时,依据首次适应算法从链头开始,沿链查找一个足矣容纳改进程的空闲区,若这个分区比较大,则一分为二,一部分分配给进程,另一部分作为空闲区仍留在链中的当前位置,修改它的上一个空闲区的向前指针值
4、为再加上分配给进程的分区大小,下一个空闲区的向后指针值为再加上分配给进程的分区大小,使链保持完整。若这个分区的大小正好等于进程大小,该空闲区全部分配给进程,并将该空闲区从链中摘除。再在已分配表中找一个空目录,登记刚刚分配的内存始址、长度和进程号。2.4.1.2 算法数据结构以及部分代码解析1.算法数据结构struct memory struct memory *former; /前向指针 int address;/地址 int num;/作业号 int size;/分配内存大小 int state;/状态0表示空闲1表示已分配 struct memory *next; /后向指针;2.必要数据
5、和函数清单typedef struct memory MEMORY;MEMORY *mem;const int size_min=10;/内存允许的最小空闲块的大小 bool is_optimist;/判断是否是最佳适应算法 void init(); /初始化内存块void exec();/执行相应算法void F_F(int); /依次初始化每个作业,并根据相应算法对作业分配内存void alloc(MEMORY *,MEMORY *);/分配内存算法(包括两种不同算法)void free(MEMORY *,int);/首次适应算法回收内存void free_optimist(MEMORY
6、*,int); /最佳适应算法回收内存void sort(MEMORY *);/对内存链进行排序 void insert(MEMORY *,MEMORY *); /按空间大小将作业顺序插入到内存链void print(MEMORY *);/打印内存链3.内存分配代码用户在输入作业号后对将要运行的进程的属性进行输入,传输到 alloc函数中进行分配判断Ptr表示内存空间 assign表示用户输入进程相关属性void alloc(MEMORY *ptr,MEMORY *assign) /根据算法分配内存(is_optimist状态) if(ptr-next=NULL) /内存没有作业运行size=
7、assign-size) /内存空间大于作业所需空间,为内存分配空间 ptr-size=ptr-size-assign-size; assign-state=1;next=assign;former=ptr; coutnum)申请size) while(current!=NULL) /当前区间不为空(最后一个区间的next为空),即没有循环到最后 /如果当前内存空间大于作业所需空间并且内存没有被分配 /则结束循环,当前current位置即为要插入的位置 if(current-size¤t-state=0) break; previous=current; /previous后移 c
8、urrent=current- if(current=NULL) /空闲链中没有为作业分配所需的空间,即释放的空闲区间小于要分配的作业空间 /不够用,则在所有作业后边另外再申请空闲区,如作业4 /内存中还有足够没分配的空闲空间为此作业分配 /此时ptr指向内存上未分配空闲空间的起始地址address =640-(ptr-size);former=previous; previous- /释放的空闲链中有可为此作业分配的空间 if(current-=size_min) /空闲链所具备的空间与作业所需空间大小差不多时 /直接把整个空闲块的空间分配给作业否则从空闲块中 current-num=ass
9、ign-num; /划出与作业等同的空间 (current-k的内存间 /从空闲块中划分一块与作业大小等同的空间size=current-address=current-address+current- /此要分配的空间是空闲链的最后一个元素 former=current;next=current- (current-next)-former=assign; 2.4.1.3 算法效果演示1.申请内存申请空间:1130KB 260KB 3100KB图9 申请空间1图10 申请空间2图11 申请空间32.释放内存释放内存:释放1图12 释放1号作业2.4.2 最佳适应法分配管理链式可变分区2.4.
10、2.1 算法描述采用最佳适应算法实现内存的分配与回收的实现原理以及使用的数据结构和首次适应算法类似。所不同的是,分配时,总是分配与进程大小最接近的一个分区。为此,可将空闲区按照大小,从小到大排列。2.4.2.2 算法数据结构以及部分代码解析1.最佳适应算法与首次适应算法的比较最佳适应算法的数据结构和必要的函数清单已在上显示,最佳适应算法在作业申请内存时,需要对可变分区大小进行排序,进而选取内存块最小的分区进行分配,这样在回收时,就显的异常麻烦,而首次适应算法则是对分区地址的顺序存取,按照分区地址的大小排序来进行内存的分配和管理2.分区大小排序代码void sort(MEMORY *ptr) /
11、排序函数 MEMORY *temp=new MEMORY; temp-next=0;former=0; while(ptr-next) if(ptr-next=NULL) /内存链中只有两个元素 MEMORY *p; p=ptr-next=NULL; insert(temp,p);/从小到大插入排序 /内存链中有多个元素 p-next=p- (p- /temp为已经排好的作业队列next=temp- (temp- delete temp;2.4.2.3 算法效果演示在内存空间如图12的情况下进行分配:作业4120K图12图13 申请空间释放作业2和4图14 释放作业2图15 释放作业42.5
12、虚存管理模块2.5.1 采用FIFO算法实现分页管理的缺页调度2.5.1.1 算法描述 采用先进先出算法时,用一个数组表示先进先出队列,数组中的各个元素表示进程在主存的页号,假定块数不变,当队列有空余块时,将进程页号装载进数组中;当队列满需要淘汰是,淘汰最先进入主存的一页2.5.1.2 算法数据结构以及部分代码解析1.页号以及作业(进程)struct page/页面 int jobnum;/页块中作业号 int stage;/等级struct job/作业号 int chgnum;/交换的作业号page *table;job *user;bool is_LRU;/is_FIFO or is_L
13、RUvoid setpage(page table,int n);/页面初始化void upstage(page table,int n);/更新等级void setjob(job user,int n);/user用户作业初始化void run(page table,job user,int m,int n);/运行void print(job);/打印函数3.代码分析以下代码为作业进入时是否淘汰的判断,与LRU不同的是,当命中时页块不需要刷新操作。 for(int i=0;im;i+)/job循环 for(int j=0;jn;j+)/table是否命中 if(tablej.jobnum=
14、useri.jobnum)/当命中时退出 goto loop2;/转入下一个作业 /未命中 for(j=0;j+)/是否有未分配块 if(tablej.stage=-1)/等级为-1表示未分配 tablej.jobnum=useri.jobnum;/改名 upstage(table,n);/更新页表 tablej.stage=0;/将此块等级改为0,最新 useri.chgnum=0;/0表示由新装入 /无分配块且未命中j+)/找等级为n-1的页块 if(tablej.stage=n-1) useri.chgnum=tablej.jobnum;/淘汰页表 tablej.jobnum=useri
15、.jobnum;/更换页表 upstage(table,n); tablej.stage=0;/更改等级 goto loop2; /for j2 loop2:2.5.1.3 算法效果演示注:例题采用操作系统教程第4版第四章 存储管理 课后习题第1题 3页框(LRU同)图16 FIFO2.5.2 采用LRU算法实现分页管理的缺页调度2.5.2.1 算法描述采用LRU算法时,用一个数组表示先进先出队列,数组中的各个元素表示进程在主存的页号,假定块数不变,当队列有空余块时,将进程页号装载进数组中;当队列满需要淘汰是,淘汰最少使用的一页;当访问的页号与队列中的页号相等时,则进行队列页号等级刷新。2.5.2.2 算法数据结构以及部分代码解析1.LRU与FIFO的比较与FIFO不同的是,当命中时页块需要刷新命中块,并且更新其他页框。2.代码分析以下代码为作业进入时是否淘汰的判断 for(int j=0;/刷新命中页块等级 goto loop1; /未命中 if(tablej.stage=-1)/有未分配/0表示新装入 goto loop1;/转入下一个作业 int max=table0.stage;int index=0; for(j=1;j+)/寻找表中等级最大的,即存在最久的淘汰 if(maxtablej.stage) max=tabl
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1