📄 dynamic.cpp
字号:
#include<iostream>
#include<string>
#include<iomanip>
#define null 0
using namespace std;
struct PCB{//进程信息块
string name;
int Rtime;
int size;
};
struct MemoryTable{//存储区信息块
int num;//分区号
bool state;//分区状态
int size;//分区大小
int BePos;//分区起始位置
PCB *pcb;
struct MemoryTable *next;
struct MemoryTable *ahead;
};
typedef MemoryTable MT;
MT *empty=null,*use=null;
bool F=false,T=false;
int n,Time=0;
void displayMT()//显示分区说明表
{ MT *p,*q;
cout<<"分区说明表:\n";
cout<<"区号 分区长度 起始地址 状态 |进程 大小 完成时间\n";
cout<<"__________________________________|____________________\n";
p=use;q=empty;
for(int i=1;i<=n;i++)
{
if(p==null)
{cout<<right<<setw(4)<<q->num<<setw(9)<<q->size<<'k'<<setw(9)
<<q->BePos<<'k'<<" 未分配 |"<<setw(4)<<"无"<<setw(5)
<<0<<'k'<<setw(10)<<0<<endl;
q=q->next;}
else if(p->num==i) {cout<<right<<setw(4)<<p->num<<setw(9)<<p->size<<'k'<<setw(9)
<<p->BePos<<'k'<<" 已分配 |"<<setw(4)<<p->pcb->name<<setw(5)
<<p->pcb->size<<'k'<<setw(10)<<p->pcb->Rtime<<endl;
p=p->next;}
else {cout<<right<<setw(4)<<q->num<<setw(9)<<q->size<<'k'<<setw(9)
<<q->BePos<<'k'<<" 未分配 |"<<setw(4)<<"无"<<setw(5)
<<0<<'k'<<setw(10)<<0<<endl;
q=q->next;}
}
cout<<"\n";
system("pause");
}
void createMT()//建立分区说明表
{
n=1;empty=new MT;
empty->num=1;
empty->state=false;
empty->BePos=20;
empty->pcb=null;
empty->next=null;
empty->ahead=null;
empty->size=1024;
displayMT();
}
MT* refresh0(MT* s)
{
MT *p=use,*t;
int x=s->num;
s=s->next;
while(s)
{s->num+=1;
s=s->next;
}
n+=1;
if(p==null) return p;
while(p)
{
if(p->num>=x) break;
t=p;
p=p->next;
}
if(p==null) {F=true;return t;}
t=p;
while(t)
{t->num+=1;
t=t->next;
}
return p;
}
void divid( PCB *r)
{
MT *p=use,*q=empty;
while(1){
if(q==null) {cout<<"无足够内存分配此进程!";delete r ;return;}
if(q->size==r->size){T=true;
if(q==empty){
empty=empty->next;
if(empty!=null)empty->ahead=null;
q->state=true;q->pcb=r;
break;
}
else if(q->next==null){
q->ahead->next=null;
q->state=true;q->pcb=r;
break;
}
else {q->ahead->next=q->next;
q->next->ahead=q->ahead;
q->state=true;q->pcb=r;
break;
}
}
else if(q->size>r->size){if(q==empty){
MT *s=new MT;
s->size=q->size-r->size;
s->num=q->num+1;
s->BePos=q->BePos+r->size;
s->state=false;
s->pcb=null;
s->next=q->next;
if(s->next) s->next->ahead=s;
s->ahead=null;
empty=s;
q->size=r->size;
q->state=true;
q->pcb=r;
p=refresh0(s);
}
else if(q->next==null){
MT *s=new MT;
s->size=q->size-r->size;
s->num=q->num+1;
s->BePos=q->BePos+r->size;
s->state=false;
s->pcb=null;
s->ahead=q->ahead;
s->ahead->next=s;
s->next=null;
q->size=r->size;
q->state=true;
q->pcb=r;
p=refresh0(s);
}
else {
MT *s=new MT;
s->size=q->size-r->size;
s->num=q->num+1;
s->BePos=q->BePos+r->size;
s->state=false;
s->pcb=null;
s->ahead=q->ahead;
s->ahead->next=s;
s->next=q->next;
s->next->ahead=s;
q->size=r->size;
q->state=true;
q->pcb=r;
p=refresh0(s);
}
break;
}
q=q->next;
}
if(T==true&&p!=null) {
MT *t;
while(1)
{
if(p->num>q->num) break;
t=p;
p=p->next;
}
if(p==null) {F=true;p= t;}
T=false;
}
if(p==null) {q->next=null;q->ahead=null;use=q;}
else if(F==true){q->next=null;p->next=q;q->ahead=p;F=false;}
else if(p->ahead==null){use=q;q->next=p;p->ahead=q;q->ahead=null;}
else {p->ahead->next=q;q->next=p;q->ahead=p->ahead;p->ahead=q;}
}
void input()
{
cout<<"CPU时刻: "<<Time<<endl<<endl;
cout<<"是否有进程请求?[Y/N] ";
char y;
cin>>y;
Time+=10;
if(y=='N'||y=='n') return;
else
{
int x;
cout<<"输入进程个数:";
cin>>x;
cout<<"输入各进程名、要求空间、完成时间:\n";
for(int i=1;i<=x;i++)
{
PCB* r=new PCB;
cin>>r->name;
cin>>r->size;
cin>>r->Rtime;
divid(r);
}
}
displayMT();
}
void refresh1(MT *q,MT *p)
{
MT *t,*z=empty;
if(z==null) {q->next=null;q->ahead=null;empty=q;return;}
while(z)
{
if(z->num>q->num)break;
t=z;
z=z->next;
}
if(z==null){t->next=q;q->next=null;q->ahead=t;
if(q->num+1==t->num)
{
t->size+=q->size;t->next=null;
delete q;
while(p){p->num-=1;p=p->next;}
n=n-1;
}
}
else if(z->ahead==null){q->next=z;z->ahead=q;q->ahead=null;empty=q;
if(q->num==q->next->num-1) {q->size+=q->next->size;
q=q->next;
empty->next=empty->next->next;
if(q->next!=null) empty->next->ahead=empty;
delete q;
q=empty->next;
while(q)
{q->num-=1;q=q->next;}
while(p){p->num-=1;p=p->next;}
n=n-1;
}
}
else {q->next=z;q->ahead=z->ahead;z->ahead=q;q->ahead->next=q;
if(q->num+1==q->next->num&&q->num-1==q->ahead->num)
{
t=q->ahead;t->size+=q->size;
t->next=q->next;delete q;
q=t->next;t->size+=q->size;
t->next=q->next;delete q;
if(t->next) t->next->ahead=t;
q=t->next;
while(q){q->num-=2;q=q->next;}
while(p){p->num-=2;p=p->next;}
n=n-2;
}
else if(q->num+1==q->next->num)
{t=q;q=q->next;t->size+=q->size;t->next=q->next;
delete q;if(t->next!=null) t->next->ahead=t;
q=t->next;
while(q){q->num-=1;q=q->next;}
while(p){p->num-=1;p=p->next;}
n=n-1;
}
else if(q->num-1==q->ahead->num)
{
t=q->ahead;t->size+=q->size;t->next=q->next;
q->next->ahead=t;delete q;
q=t->next;
while(q){q->num-=1;q=q->next;}
while(p){p->num-=1;p=p->next;}
n=n-1;
}
}
}
void reclaim()
{
MT *p=use,*q=null;
int t=Time;
while(p)
{
if(p->pcb->Rtime<=t) {t=p->pcb->Rtime;q=p;}
p=p->next;
}
if(q==null) {input();return;}
cout<<"CPU时刻:"<<t<<"\n\n";
cout<<"进程"<<q->pcb->name<<"执行结束\n";
PCB *z=q->pcb;
q->pcb=null;
q->state=false;
p=q->next;
if(q==use) {use=q->next;if(use!=null)
use->ahead=null;
}
else if(q->next==null){
q->ahead->next=null;
}
else{ q-> next->ahead=q->ahead;
q->ahead->next=q->next;
}
delete z;
refresh1(q,p);
displayMT();
}
int main()
{ createMT();
do{
reclaim();
}while(use);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -