オペレーティングシステム——ダイナミックパーティション割り当てシミュレーションプログラム


ダイナミックパーティション割り当てアルゴリズムシミュレーションプログラムを作成し、ダイナミックパーティションの記憶管理方式とその実現過程の理解を深めます.
要求:
空き領域は空き領域チェーンで管理されており、メモリ割り当て時には、低アドレス部分の空き領域を優先的に考慮する. それぞれ最初の適応アルゴリズム、最適適応アルゴリズム、および最悪適応アルゴリズムを用いてメモリ空間の動的割り当てと回収をシミュレーションし、毎回割り当てと回収後に空き領域チェーンの詳細を表示する(説明:申請が成功していない場合、現在のメモリの占有状況情報を印刷する必要がある). プロセスのメモリ空間に対する申請とリリースは、ユーザーがカスタマイズして入力することができます. 参照要求のシーケンスは以下の通りです. (1)初期状態で利用可能なメモリ空間は640 KBである.
(2)プロセス1は130 KBを申請する.
(3)プロセス2は60 KBを申請する.
(4)プロセス3は100 KBを申請する.
(5)プロセス2は60 KBを解放する.
(6)プロセス4は200 KBを申請する.
(7)プロセス3は100 KBを解放する.
(8)プロセス1は130 KBを解放する.
(9)プロセス5は140 KBを申請する.
(10)プロセス6は60 KBを申請する.
(11)プロセス7は50 KBを申請する.
(12)プロセス6は60 KBを解放する.
テストケースのフォーマットは以下の通りです.
入力:
ダイナミックパーティション割り当てアルゴリズム選択
利用可能メモリ容量
シーケンス番号/プロセス番号/申請またはリリース操作/申請またはリリースの容量
その中:
(1)ダイナミックパーティション割り当てアルゴリズム:1--初適応、2--最適適応、3--最悪適応
(2)申請または釈放操作:1—申請操作、2—解放操作
出力:
番号/メモリ空間状態1/メモリ空間状態2…
メモリ空間状態表示は2つの状況に分けられます.
(1)メモリ空間が占有されている:
メモリ空間開始アドレス-メモリ空間終了アドレス.1.占有プロセス番号
(2)メモリ空き容量
メモリ空間開始アドレス-メモリ空間終了アドレス.0
/*
**@Unintented
**@2017.12.14
*/
#include
#include
#pragma warning(disable:4996)//  scanf  (VS2013)

struct proc{
    int squ;//    
    int pid;//   
    int act;//    
    int size;//        
}pro;//        

struct me{
    int me_size;//   :       ,    :      
    int head;//    
    int tail;//    
    int pid;//      ,     (-1)
    struct me *next;//      
};//     
typedef me Me;
Me *top;//   
void Initial(int Me_size){
    top = (Me*)malloc(sizeof(Me));
    top->me_size = Me_size;
    top->pid = -1;
    top->head = 0;
    top->tail = Me_size - 1;
    top->next = NULL;
}

int pro_num;//      
int squ=1;//     

void FF();//    
void BF();//    
void WF();//    
void print();

int main(){
    int op;//    
    int Me_size;//    
    scanf("%d", &op);
    scanf("%d", &Me_size);
    Initial(Me_size);
    while (scanf("%d/%d/%d/%d", &pro.squ, &pro.pid, &pro.act, &pro.size) == 4){
            switch (op){
            case 1:
                FF();
                break;
            case 2:
                BF();
                break;
            case 3:
                WF();
                break;
            }
            print();
    }

}
void print(){
    Me *p;
    p = top;
    printf("%d", squ++);
    while (p != NULL){
        if (p->pid != -1)
            printf("/%d-%d.1.%d", p->head, p->tail, p->pid);//      
        else
            printf("/%d-%d.0", p->head, p->tail);//     
        p = p->next;
    }
    printf("
"); } void FF(){ Me *p; Me *temp; temp = top;// p = top; if (pro.act == 1){// while (p !=NULL){ if (p->pid != -1){// p = p->next; continue; } else{ if (pro.size > p->me_size){// p = p->next; continue; } else if(pro.size me_size ){// Me *q; q = (Me*)malloc(sizeof(Me)); q->next = p->next; p->next = q;// q, q->head = p->head + pro.size ; q->pid = -1; q->me_size = p->me_size - pro.size; q->tail = p->tail;// p->me_size = pro.size; p->pid = pro.pid; p->tail = p->head + pro.size - 1;// break; } else{// p->pid = pro.pid; break; } } } } else if (pro.act == 2){// while (p != NULL){ if (p->pid != pro.pid){// temp = p; p = p->next; continue; } else if (p->pid == pro.pid){// if (p->next->pid == -1){// , p->me_size = pro.size + p->next->me_size;// , p->pid = -1; p->tail = p->next->tail; p->next = p->next->next; } else{// p->pid = -1; } if (temp->pid == -1){// temp->me_size = temp->me_size + p->me_size; temp->tail = p->tail; temp->next = p->next; } break;// break } } } } void BF(){ Me *p; Me *m;// , Me *temp;// int t = -1;// , -1 int flag = 0;// int best_size = 100000;// temp = top; p = top; m = top; if (pro.act == 1){// while (p != NULL){// if (p->pid != -1){// p = p->next; continue; } else{ if (pro.size > p->me_size){// p = p->next; continue; } else if (pro.size me_size){// if (p->me_size < best_size){ best_size = p->me_size; t = p->head; } p = p->next; continue; } else{// , t = p->head; flag = 1; break; } } } if (t == -1){// , return; } else if(t!=-1&&flag==1){// while (m != NULL){ if (m->head == t){ p->pid = pro.pid; return; } m = m->next; } } else if (t != -1 && flag != 1){// while (m != NULL){ if (m->head == t){ Me *q; q = (Me*)malloc(sizeof(Me)); q->next = m->next; m->next = q;// q, q->head = m->head + pro.size; q->pid = -1; q->me_size = m->me_size - pro.size; q->tail = m->tail;// m->me_size = pro.size; m->pid = pro.pid; m->tail = m->head + pro.size - 1;// return; } m = m->next; } } } else if (pro.act == 2){// while (p != NULL){ if (p->pid != pro.pid){// temp = p; p = p->next; continue; } else if (p->pid == pro.pid){// if (p->next->pid == -1){// , p->me_size = pro.size + p->next->me_size;// , p->pid = -1; p->tail = p->next->tail; p->next = p->next->next; } else{// p->pid = -1; //p->state = 0; } if (temp->pid == -1){// temp->me_size = temp->me_size + p->me_size; temp->tail = p->tail; temp->next = p->next; } break;// break } } } } void WF(){ Me *p; Me *m;// , Me *temp;// int t = -1;// , -1 int flag = 0;// int worst_size = 0;// temp = top;// p = top; m = top; if (pro.act == 1){// while (p != NULL){// if (p->pid != -1){// p = p->next; continue; } else{ if (pro.size > p->me_size){// p = p->next; continue; } else if (pro.size me_size){// if (p->me_size > worst_size){ worst_size = p->me_size; t = p->head; } p = p->next; continue; } else{// , t = p->head; flag = 1; break; } } } if (t == -1){// , return; } else if (t != -1 && flag == 1){// while (m != NULL){ if (m->head == t){ p->pid = pro.pid; return; } m = m->next; } } else if (t != -1 && flag != 1){// while (m != NULL){ if (m->head == t){ Me *q; q = (Me*)malloc(sizeof(Me)); q->next = m->next; m->next = q;// q, q->head = m->head + pro.size; q->pid = -1; q->me_size = m->me_size - pro.size; q->tail = m->tail;// m->me_size = pro.size; m->pid = pro.pid; m->tail = m->head + pro.size - 1;// return; } m = m->next; } } } else if (pro.act == 2){// while (p != NULL){ if (p->pid != pro.pid){// temp = p; p = p->next; continue; } else if (p->pid == pro.pid){// if (p->next->pid == -1){// , p->me_size = pro.size + p->next->me_size;// , p->pid = -1; p->tail = p->next->tail; p->next = p->next->next; } else{// p->pid = -1; //p->state = 0; } if (temp->pid == -1&&p->head ==0){// ,p->head==0 temp->me_size = p->me_size; temp->tail = p->tail; temp->next = p->next; } else if(temp->pid==-1&&p->head!=0){//!!! , temp->me_size =temp->me_size + p->me_size; temp->tail = p->tail; temp->next = p->next; } break;// break } } } }