⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 磁盘空间的分配与回收.txt

📁 操作系统各个方面的编程
💻 TXT
字号:
#include "stdafx.h"
#include<stdio.h>
#include<iostream.h>
#include "stdlib.h"
#include<string.h>
const int lump=40;   
const int word=8;     
const int wordnum=lump/word;   
typedef struct node{
         char jobname[20];
         int num;
         int nums[lump];
         struct node *next;
}jobs;
int table[wordnum][word];
int freenum=0;
jobs *head;
 
void initial(){
         int i,j;
         jobs *p;
         for(i=0;i<wordnum;i++){
                   for(j=0;j<word;j++){
                            table[i][j]=0;
                   }
         }
         p=new jobs;
         strcpy(p->jobname,"null");
         p->num=0;
         p->next=NULL;
         head=p;
}
 
void numinitial()
{
         int i,j;
         FILE *fp;
         char fname[20];
         cout<<">^_^<请输入初始位示图数据文件名:"<<endl;
         cin>>fname;
         if((fp=fopen(fname,"r"))!=NULL){
                   for(i=0;i<wordnum;i++){
                            for(j=0;j<word;j++){
                                     fscanf(fp,"%d",&table[i][j]);
                                     if(table[i][j]==1)freenum++;
                            }
                   }
                   cout<<"位视图总块数为40块,初始化后如下表:"<<endl;
                   cout<<"            "<<"------------------"<<endl;
                   cout<<"            "<<"    初始位示图    "<<endl;
                   cout<<"            "<<"------------------"<<endl;
                   for(i=0;i<wordnum;i++)
{
                cout<<"              ";
                            for(j=0;j<word;j++)
{
                                     cout<<table[i][j]<<" ";

 }
                            cout<<endl;
                   }
                   cout<<"            "<<"------------------"<<endl;
                   cout<<"总空闲块数:"<<freenum;
                   cout<<endl;
         }
         else{
                   cout<<"文件不能打开!"<<endl;
         }
}
 
void apply()
{
         char jobname[10];
         jobs *p;
         int i,j,num,k;
         cout<<"请输入申请空闲块的作业名:";
         cin>>jobname;
         cout<<"请输入作业所需要的块数:";
     cin>>num;
if(num<=freenum)
         {
                   freenum-=num;
                   p=(jobs*)malloc(sizeof(jobs));
                   strcpy(p->jobname,jobname);         
                   p->num=num;
                   for(k=0;k<num;k++)
                   {
                            i=0;
                            j=0;
                            while(table[i][j]==1)
                            {
                                     j=0;
                                     while(table[i][j]==1)j++;
                                     if(table[i][j]==1)i++;
                            }
                            p->nums[k]=i*word+j;
                            table[i][j]=1;
                   }
                   p->next=head->next;
                   head->next=p;
cout<<"申请成功后的位视图如下:"<<endl;
                   cout<<"            "<<"------------------"<<endl;
                   cout<<"            "<<"     当前位示图    "<<endl;
                   cout<<"            "<<"------------------"<<endl;
                   for(i=0;i<wordnum;i++)
{
                cout<<"              ";
                            for(j=0;j<word;j++)
{
                                     cout<<table[i][j]<<" ";
                            }
                            cout<<endl;
                   }
                   cout<<"            "<<"------------------"<<endl;
        cout<<"申请空闲块的作业名:"<<p->jobname<<"    作业所要的块数:"<<p->num<<endl;
                   cout<<"该作业申请到的块的块号为:";
         for(i=0;i<p->num;i++)
{
                            cout<<p->nums[i]<<" ";
                   }
                   cout<<"申请后空闲块数:"<<freenum;
                   cout<<endl;
         }
         else{
                   cout<<"对不起,没有足够的空闲的物理块!"<<endl;
         }
}
void delect()
{
         char jobname[10];
         int n,i,j,num,k;
         jobs *p,*q;
         cout<<"请输入要删除的作业名:";
         cin>>jobname;
         q=head;
         p=head->next;
         while(p!=NULL&&strcmp(p->jobname,jobname))
         {    
                   q=p;
                   p=p->next;
         }
    num=p->num;
         cout<<"撤销的作业的释放的块数为:"<<num<<endl;
         cout<<"撤销的作业在位视图中的位置为:"<<endl;
 if(p!=NULL)
         {
                   for(k=0;k<num;k++)
                   {
         n=p->nums[k];
         i=n/word;
         j=n%word;
         table[i][j]=0;        
         cout<<"   第"<<k<<"块的块号为:"<<n<<endl;
             cout<<"      字号:"<<n/word<<"      块号:"<<n%word<<endl;
                   }
         freenum+=num;
         q->next=p->next;
         free(p);
    cout<<"回收成功后的位视图如下:"<<endl;
    cout<<"            "<<"------------------"<<endl;
         cout<<"            "<<"     当前位示图    "<<endl;
         cout<<"            "<<"------------------"<<endl;
         for(i=0;i<wordnum;i++)
{
                cout<<"              ";
                   for(j=0;j<word;j++)
{
                                     cout<<table[i][j]<<" ";
                            }
                            cout<<endl;
                   }
                   cout<<"            "<<"------------------"<<endl;
                   cout<<"回收后空闲块数:"<<freenum;
                   cout<<endl;
         }
}
void main()
{
         int t=1,k;
    initial();
         numinitial();
         while(t==1)
{
                   cout<<endl;
                   cout<<">^_^<请选择要进行的操作:"<<endl;
                   cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
                   cout<<"1.申请一个空闲块"<<endl; 
                   cout<<"2.释放一个空闲块"<<endl;
        cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
                   cout<<"请选择:";
 cin>>k;
         switch(k){
                   case 1:apply();
                            break;
                   case 2:delect();
                            break;
                   default:cout<<"选择错误"<<endl;
                   }
         }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -