zoukankan      html  css  js  c++  java
  • 实验四

    #include <stdafx.h>
    #include <iostream>
    #include <iomanip>
    using namespace std;
    
    #define nofreearea 2
    #define noadequacyarea 3
    #define allocated 4
    
    #define noprocess 2
    #define nosuchprocess 3
    #define reclaimed 4
    
    typedef struct TUN
    {
     int address;
     int size;
     char name; 
     struct TUN *next;
    } usedarea , *usedtable;
    
    typedef struct TFN
    {
     int address;
     int size;
     struct TFN *next;
    } freearea, *freetable;
    
    usedtable usedTable = NULL;
    freetable freeTable = NULL;
    
    int alloc( char processname , int processsize )
    {
    
    if( freeTable == NULL )
     return 1;
     freetable p = freeTable;
     freetable q = p;
     
     while( p != NULL && p->size < processsize )
     {
      q = p;
      p = p->next;
     }
    
     if( p == NULL )
      return 3;
    
     usedtable x = new usedarea;
     x->address = p->address;
     x->size = processsize;
     x->name = processname;
     x->next = NULL;
    
    if( p->size > processsize )
     {
      p->size -= processsize;
      p->address += processsize;
     }
    
     else
     {
      if( p == freeTable )
       freeTable = NULL;
      else
       q->next = p->next;
      delete p;
     }
    
     usedtable r = usedTable;
     usedtable t = r;
    
     while( r != NULL && r->address < x->address )
     {
      t = r;
      r = r->next;
     }
     
     if( usedTable == NULL )
      usedTable = x;
     else
     {
      x->next = r;
      t->next = x;
     }
    
     return 4;
    }
    
    int Reclaim( char processname )
    {
     if( usedTable == NULL )
      return 1;
     usedtable p = usedTable;
     usedtable q = p;
     while( p != NULL && p->name != processname )
     {
      q = p;
      p = p->next;
     }
    
     if( p == NULL )
      return 3;
     
     freetable r = freeTable;
     freetable t = r;
     freetable x;
     while( r != NULL && r->address < p->address )
     {
      t = r;
      r = r->next;
     }
    
     x = new freearea;
     x->address = p->address;
     x->size = p->size;
     x->next = NULL;
    
     if( r == freeTable )
     {
      x->next = r;
      freeTable = x;
      t = freeTable;
     }
     else
     {
      x->next = r;
      t->next = x;
     }
    
     while( t->next != NULL && t->address + t->size == t->next->address )
     {
      t->size += t->next->size;
      r = t->next;
      t->next = t->next->next;
      delete r;
     }
     
     if( p == usedTable )
     {
      usedTable = usedTable->next;
     }
     else
      q->next = p->next;
     delete p;
    
     return 4;
    }
    
    int Init()
    {
     freeTable = new freearea;
     freeTable->address = 0;
     freeTable->size = 128;
     freeTable->next = NULL;
     return 1;
    }
    
    void processrequest()
    {
     char processname;
     int processsize;
    cout<<"...................."<<endl;
     cout<<"作业名: ";
     cin >> processname;
     cout<<"作业长度: ";
     cin >> processsize;
    if(processsize<=128)
    {
        int i=0;
     if( alloc( processname , processsize) == 4 )
     {
        i=i+processsize; 
        if(i>128)
     {
         cout<<"该作业超出空间"<<endl;
     }
     if(i<=128)
        cout<<"该作业已成功获得所需空间"<<endl;
      i=i+processsize;
     cout<<"........................................"<<endl;
    
     }
     else
      cout<<"该作业超出空间,没有获得所需空间"<<endl;
     cout<<"........................................"<<endl;
     return;
    }
    if(processsize>128)
    {cout<<"该作业超出空间"<<endl;
     cout<<"........................................"<<endl;
    }
    
    }
    
    void processreclaim()
    {
     int processname;
     cout<<"...................."<<endl;
     cout<<"作业名: ";
     cin >>processname;
     int result = Reclaim( processname );
     if(  result == 4 )
      cout<<"该作业已成功回收"<<endl;
     else if( result == 2 || result == 1 )
      cout<<"系统没有作业或该作业不存在"<<endl;
     cout<<"...................."<<endl;
    
    }
    
    void freeTablePrint()
    {
     cout<<endl<<endl<<endl<<"***********************************"<<endl;
     cout<<setw(10)<<"address"<<setw(10)<<"length"<<setw(10)<<"state"<<endl<<endl;
     freetable p = freeTable;
     usedtable q = usedTable;
     int x , y;
     while( p || q )
     {
      if( p )
       x = p->address;
      else
       x = 0x7fffffff;
      if( q )
       y = q->address;
      else
       y = 0x7fffffff;
    
      if( x < y )
      {
       cout<<setw(10)<<p->address<<setw(10)<<p->size<<setw(10)<<"空闲"<<endl;
       p = p->next;
      }
      if( x > y )
      {
       cout<<setw(10)<<q->address<<setw(10)<<q->size<<setw(10)<<"已分配"<<setw(10)<<"ID="<<q->name<<endl;
       q = q->next;
      }
     }
     cout<<endl<<endl<<endl<<"************************************"<<endl<<endl<<endl;
    
    }
    
    void main()
    {
     Init();
     int choose;
     bool exitFlag = false;
     while( !exitFlag )
     {
      
      cout<<"0 退出"<<endl; 
      cout<<"1 分配主存"<<endl;
      cout<<"2 回收主存"<<endl;
      cout<<"3 显示主存"<<endl<<endl<<endl;
      cout<<"选择所要执行的操作:";
      cin>>choose;
      switch( choose )
      {
      case 0:
       exitFlag = true;
       break;
      case 1:
       processrequest();
       break;
      case 2:
       processreclaim();
       break;
      case 3:
       freeTablePrint();
       break;
      }
     }
    }

    心得体会:

         大概了解了主存空间分配。

  • 相关阅读:
    使用bootstrap建立响应式网页——通栏轮播图(carousel)
    java的HashMap与ConcurrentHashMap
    JVM性能调优
    Spring注解@Component、@Repository、@Service、@Controller区别
    Java过滤器与SpringMVC拦截器之间的关系与区别
    Java线程(二):线程同步synchronized和volatile
    Java线程(一):线程安全与不安全
    MySQL 加锁处理分析
    Spring 事务机制详解
    使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码和在线测试地址】
  • 原文地址:https://www.cnblogs.com/zzen/p/4600284.html
Copyright © 2011-2022 走看看