zoukankan      html  css  js  c++  java
  • 实验四 主存空间的分配和回收

    实验四主存空间的分配和回收

    1.    目的和要求

    1.1.           实验目的

    用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。

    1.2.           实验要求

    采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

    (2)或在程序运行过程,由用户指定申请与释放。

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

    把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    2.    实验内容

    根据指定的实验课题,完成设计、编码和调试工作,完成实验报告

    3.    实验环境

    可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

    4.    参考数据结构:

    #include<stdio.h>

    #include<conio.h>

    #include<string.h>

    #define MAX 24

    struct partition{

         

          char pn[10];

          int begin;

          int size;

          int end;   ////////

          char status;  //////////

          };

    typedef struct partition PART;

    第一步:(第13周完成)

    完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。

    第二步:(第14周完成)

    完成为某作业分配内存空间。

    1. 用户输入作业名称;
    2. 判断作业名称是否已经存在,如果存在则要求用户重新输入;
    3. 用户输入作业所占空间大小;
    4. 判断是否能够在剩余的空闲区域中找到一块放置该作业,如果不行则要求用户重新输入;
    5. 显示菜单,由用户选择使用哪一种分配算法:

    1)        首次适应算法

    2)        循环首次适应算法

    3)        最佳适应算法

    4)        最坏适应算法

    1. 为该作业分配内存空间,分配处理流程图如下(size的值设定为1K):
    1. 屏幕显示分配后的内存分区情况。
      1 #include<stdio.h>
      2 #include<conio.h>
      3 #include<string.h>
      4 
      5 #define MAX 24
      6 #define Memory 512
      7 #define SIZE 1
      8 
      9 void PT();
     10 void Delcase();
     11 
     12 struct partition{
     13 
     14     char pn[10];  //名字
     15     int begin;   //开始位置
     16     int size;  //块大小
     17     int end;   //结束地址
     18     char status;  //状态
     19     };
     20 typedef struct partition PART;
     21 
     22 PART Free[MAX],Used[MAX],addresses[MAX],Copy[MAX];   //三个表:空闲、分配、总计
     23 int sumFree,sumUsed,sumaddresses,vsum[MAX];  //统计各个表列数,vsum存放排序序号
     24 int freeblock=0;                         //记录第几个空闲区
     25 
     26 void addFree(int i,int j)               //把空闲表加入总计
     27 {
     28     strcpy(addresses[i].pn,Free[j].pn);
     29     addresses[i].begin=Free[j].begin;
     30     addresses[i].size=Free[j].size;
     31     addresses[i].status=Free[j].status;
     32 }
     33 
     34 void addUsed(int i,int j)             //把分配表加入总计
     35 {
     36     strcpy(addresses[i].pn,Used[j].pn);
     37     addresses[i].begin=Used[j].begin;
     38     addresses[i].size=Used[j].size;
     39     addresses[i].status=Used[j].status;
     40 }
     41 
     42 void cpit(PART* in,PART* out,int sum)//复制out到in
     43 {
     44     int i;
     45     for(i=0;i<=sum;i++)
     46     {
     47         strcpy(in[i].pn,out[i].pn);
     48         in[i].begin=out[i].begin;
     49         in[i].size=out[i].size;
     50         in[i].end=out[i].end;
     51         in[i].status=out[i].status;
     52     }
     53 }
     54 
     55 void fch(char* pn,int size)          //首次适应算法
     56 {
     57     int i,j;
     58     for(i=0;i<=sumFree;i++)
     59     {
     60         if(Free[i].size>=size)
     61         {
     62             sumUsed++;
     63             strcpy(Used[sumUsed].pn,pn);
     64             Used[sumUsed].begin=Free[sumFree].begin;
     65             Used[sumUsed].size=size;
     66             Used[sumUsed].end=Used[sumUsed].begin+Used[sumUsed].size;
     67             Used[sumUsed].status='u';
     68 
     69 
     70             addUsed(sumaddresses,sumUsed);
     71 
     72             if(Free[i].size-size<=SIZE)
     73             {
     74 
     75                 for(j=i;j<=sumFree;j++)
     76                 {
     77                     Free[i].size;
     78                     strcpy(Free[i].pn,Free[j].pn);
     79                     Free[i].size=Free[j].size;
     80                     Free[i].status=Free[j].status;
     81                     Free[i].begin=Free[j].begin;
     82                     Free[i].end=Free[j].end;
     83                 }
     84                 sumFree--;
     85             }
     86             else
     87             {
     88                 Free[i].size=Free[i].size-size;
     89                 Free[i].begin=Free[i].begin+size;
     90             }
     91             sumaddresses++;
     92             addFree(sumaddresses,sumFree);
     93             break;
     94         }
     95         else
     96         {
     97             //printf("无法分配!
    ");
     98         }
     99     }
    100 }
    101 
    102 void nfch(char* pn,int size)
    103 {
    104     int i,j;
    105     for(i=freeblock%sumFree;i<=sumFree;i++)
    106     {
    107         if(Free[i].size>=size)
    108         {
    109             sumUsed++;
    110             freeblock=i+1;
    111             strcpy(Used[sumUsed].pn,pn);
    112             Used[sumUsed].begin=Free[sumFree].begin;
    113             Used[sumUsed].size=size;
    114             Used[sumUsed].end=Used[sumUsed].begin+Used[sumUsed].size;
    115             Used[sumUsed].status='u';
    116 
    117 
    118             addUsed(sumaddresses,sumUsed);
    119 
    120             if(Free[i].size-size<=SIZE)
    121             {
    122 
    123                 for(j=i;j<=sumFree;j++)
    124                 {
    125                     Free[i].size;
    126                     strcpy(Free[i].pn,Free[j].pn);
    127                     Free[i].size=Free[j].size;
    128                     Free[i].status=Free[j].status;
    129                     Free[i].begin=Free[j].begin;
    130                     Free[i].end=Free[j].end;
    131                 }
    132                 sumFree--;
    133             }
    134             else
    135             {
    136                 Free[i].size=Free[i].size-size;
    137                 Free[i].begin=Free[i].begin+size;
    138             }
    139             sumaddresses++;
    140             addFree(sumaddresses,sumFree);
    141             break;
    142         }
    143         else
    144         {
    145          //   printf("无法分配!
    ");
    146         }
    147     }
    148 }
    149 
    150 void sortMAX(int sum)
    151 {
    152     int temp,i,j;
    153     for(i=0;i<sum;i++)
    154     {
    155         vsum[i]=i;
    156     }
    157     for(i=0;i<sum;i++)
    158     {
    159         for(j=i;j<=sum;j++)
    160         {
    161             if(Copy[i].size<Copy[j].size)
    162             {
    163                 temp=vsum[i];
    164                 vsum[i]=vsum[j];
    165                 vsum[j]=temp;
    166             }
    167         }
    168     }
    169 }
    170 
    171 void sortMIN(int sum)
    172 {
    173     int temp,i,j;
    174     for(i=0;i<sum;i++)
    175     {
    176         vsum[i]=i;
    177     }
    178     for(i=0;i<sum;i++)
    179     {
    180         for(j=i;j<=sum;j++)
    181         {
    182             if(Copy[i].size>Copy[j].size)
    183             {
    184                 temp=vsum[i];
    185                 vsum[i]=vsum[j];
    186                 vsum[j]=temp;
    187             }
    188         }
    189     }
    190 }
    191 
    192 void bfch(char* pn,int size)
    193 {
    194     int i,j;
    195     cpit(Copy,Free,sumFree);
    196     sortMAX(sumFree);
    197     i=vsum[0]+1;
    198     if(Free[i].size>=size)
    199     {
    200         sumUsed++;
    201         strcpy(Used[sumUsed].pn,pn);
    202         Used[sumUsed].begin=Free[sumFree].begin;
    203         Used[sumUsed].size=size;
    204         Used[sumUsed].end=Used[sumUsed].begin+Used[sumUsed].size;
    205         Used[sumUsed].status='u';
    206 
    207 
    208         addUsed(sumaddresses,sumUsed);
    209 
    210         if(Free[i].size-size<=SIZE)
    211         {
    212 
    213             for(j=i;j<=sumFree;j++)
    214             {
    215                 Free[i].size;
    216                 strcpy(Free[i].pn,Free[j].pn);
    217                 Free[i].size=Free[j].size;
    218                 Free[i].status=Free[j].status;
    219                 Free[i].begin=Free[j].begin;
    220                 Free[i].end=Free[j].end;
    221             }
    222             sumFree--;
    223         }
    224         else
    225         {
    226             Free[i].size=Free[i].size-size;
    227             Free[i].begin=Free[i].begin+size;
    228         }
    229         sumaddresses++;
    230         addFree(sumaddresses,sumFree);
    231     }
    232     else
    233     {
    234      //   printf("无法分配!
    ");
    235     }
    236 }
    237 
    238 void badfch(char* pn,int size)
    239 {
    240     int i,j;
    241     cpit(Copy,Free,sumFree);
    242     sortMAX(sumFree);
    243     for(i=0;i<sumFree;i++)
    244     {
    245     i=vsum[i]+1;
    246     if(Free[i].size>=size)
    247         {
    248             sumUsed++;
    249             strcpy(Used[sumUsed].pn,pn);
    250             Used[sumUsed].begin=Free[sumFree].begin;
    251             Used[sumUsed].size=size;
    252             Used[sumUsed].end=Used[sumUsed].begin+Used[sumUsed].size;
    253             Used[sumUsed].status='u';
    254 
    255 
    256             addUsed(sumaddresses,sumUsed);
    257 
    258             if(Free[i].size-size<=SIZE)
    259             {
    260 
    261                 for(j=i;j<=sumFree;j++)
    262                 {
    263                     Free[i].size;
    264                     strcpy(Free[i].pn,Free[j].pn);
    265                     Free[i].size=Free[j].size;
    266                     Free[i].status=Free[j].status;
    267                     Free[i].begin=Free[j].begin;
    268                     Free[i].end=Free[j].end;
    269                 }
    270                 sumFree--;
    271             }
    272             else
    273             {
    274                 Free[i].size=Free[i].size-size;
    275                 Free[i].begin=Free[i].begin+size;
    276             }
    277             sumaddresses++;
    278             addFree(sumaddresses,sumFree);
    279             break;
    280         }
    281         else
    282         {
    283         //    printf("无法分配!
    ");
    284         }
    285     }
    286 }
    287 
    288 void choose(char* pn,int size)              //算法选择
    289 {
    290     int v;
    291     printf("请选择算法
    ");
    292     printf("(1)    首次适应算法
    ");
    293     printf("(2)    循环首次适应算法
    ");
    294     printf("(3)    最佳适应算法
    ");
    295     printf("(4)    最坏适应算法
    ");
    296     scanf("%d",&v);
    297     switch(v)
    298     {
    299     case 1:
    300         fch(pn,size);
    301         break;
    302     case 2:
    303         nfch(pn,size);
    304         break;
    305     case 3:
    306         bfch(pn,size);
    307         break;
    308     case 4:
    309         badfch(pn,size);
    310         break;
    311     }
    312     PT();
    313 }
    314 
    315 void input()                //作业输入
    316 {
    317     int i;
    318     int bo1=0,bo2=0;
    319 
    320 
    321     char pn[10];
    322     int size;
    323 
    324 
    325 instart:
    326     printf("请输入作业名称
    ");
    327     scanf("%s",&pn);
    328     for(i=0;i<=sumUsed;i++)
    329     {
    330         if(strcmp(Used[i].pn,pn)==0)
    331         {
    332             bo1=1;
    333             break;
    334         }
    335     }
    336     if(bo1==0)
    337     {
    338         printf("请输入作业所占空间大小
    ");
    339         scanf("%d",&size);
    340         for(i=0;i<=sumFree;i++)
    341         {
    342             if(Free[i].size>=size)
    343             {
    344                 bo2=1;
    345                 break;
    346             }
    347         }
    348         if(bo2==1)
    349         {
    350             //printf("可以插入
    ");
    351             choose(pn,size);
    352         }
    353     }
    354     else
    355     {
    356         goto instart;
    357     }
    358 }
    359 void init()                            //初始化
    360 {
    361 
    362     sumFree=0,sumUsed=0,sumaddresses=0;
    363 
    364     strcpy(Used[1].pn,"SYSTEM");
    365     Used[1].begin=0;
    366     Used[1].size=100;
    367     Used[1].status='u';
    368     Used[1].end=100;
    369     sumUsed++;
    370 
    371     sumaddresses++;
    372     addUsed(sumaddresses,sumUsed);
    373 
    374 
    375     printf("初始化,设内存总容量为512k
    ");
    376     printf("系统从低地址部分开始使用,占用100k
    
    ");
    377 
    378 
    379 
    380     strcpy(Free[1].pn,"----");
    381     Free[1].begin=100;//OS占用100K
    382     Free[1].size=Memory-Free[1].begin;
    383     Free[1].end=Free[1].begin+Free[1].size;
    384     Free[1].status='f';
    385     sumFree++;
    386 
    387     sumaddresses++;
    388     addFree(sumaddresses,sumFree);
    389 }
    390 
    391 
    392 void PT()                                   //打印
    393 {
    394     int i,j,k;
    395     printf("空闲区表Free
    ");
    396     printf("			No.	proname	begin	size	status
    ");
    397     for(i=1;i<=sumFree;i++)
    398         printf("			No.%d	%s	%d	%d	%c
    ",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);
    399 
    400     printf("已分配分区表Used
    ");
    401     printf("			No.	proname	begin	size	status
    ");
    402     for(i=1;i<=sumUsed;i++)
    403         printf("			No.%d	%s	%d	%d	%c
    ",i,Used[i].pn,Used[i].begin,Used[i].size,Used[i].status);
    404 
    405     
    406 
    407     printf("内存使用情况,按起始址增长的排:
    ");
    408     printf("			No.	proname	begin	size	status
    ");
    409    // for(i=1;i<=sumaddresses;i++)
    410    //     printf("			No.%d	%s	%d	%d	%c
    ",i,addresses[i].pn,addresses[i].begin,addresses[i].size,addresses[i].status);
    411     for(i=1;i<=sumUsed;i++)
    412         printf("			No.%d	%s	%d	%d	%c
    ",i,Used[i].pn,Used[i].begin,Used[i].size,Used[i].status);
    413     
    414     for(i=1;i<=sumFree;i++)
    415         printf("			No.%d	%s	%d	%d	%c
    ",i+sumUsed,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);
    416 }
    417 
    418 void Del()
    419 {
    420     int type,i,j,Front=0,Back=0,k,l,b,o;
    421     char name[10];
    422     printf("
    请输入你要删除的作业名字:
    ");
    423     scanf("%s",&name);
    424     for(i=1;i<=sumUsed;i++)
    425     {
    426         if(strcmp(Used[i].pn,name)==0)
    427         {
    428             type=0;
    429             printf("
    找到作业!
    ");
    430             for(j=1;j<=sumFree;j++)
    431             {
    432                 if(Free[j].begin+Free[j].size==Used[i].begin)
    433                 {
    434                     printf("
    在作业前找到空闲块
    ");
    435                     type++;
    436                     Front=j;
    437                 }
    438             }
    439             for(j=1;j<=sumFree;j++)
    440             {
    441                 if(Free[j].begin==Used[i].begin+Used[i].size)
    442                 {
    443                     printf("
    在作业后找到空闲块
    ");
    444                     type=type+2;
    445                     Back=j;
    446                 }
    447             }
    448             printf("
    
    type====%d
    
    ",type);
    449             switch(type)
    450             {
    451             case 0:
    452                 strcpy(Free[sumFree+1].pn,"----");
    453                 Free[sumFree+1].begin=Used[i].begin;
    454                 Free[sumFree+1].size=Used[i].size;
    455                 Free[sumFree+1].status='f';
    456                 sumFree++;
    457                 for(l=1;l<=sumaddresses;l++)
    458                 {
    459                     if(strcmp(addresses[l].pn,name)==0)
    460                     {
    461                         for(b=l;b<=sumaddresses;b++)
    462                         {
    463                             strcpy(addresses[b].pn,addresses[b+1].pn);
    464                             addresses[b].size=addresses[b+1].size;
    465                             addresses[b].status=addresses[b+1].status;
    466                             addresses[b].begin=addresses[b+1].begin;
    467                             addresses[b].end=addresses[b+1].end;
    468                         }
    469                     }
    470                 }
    471                 addFree(sumaddresses,sumFree);
    472                 break;
    473             case 1:
    474                 Free[Front].size=Free[Front].size+Used[i].size;
    475                 Free[Front].end=Free[Front].begin+Free[Front].size+Used[i].size;
    476                 for(l=1;l<=sumaddresses;l++)
    477                 {
    478                     if(strcmp(addresses[l].pn,name)==0)
    479                     {
    480                         for(b=l;b<=sumaddresses;b++)
    481                         {
    482                             strcpy(addresses[b].pn,addresses[b+1].pn);
    483                             addresses[b].size=addresses[b+1].size;
    484                             addresses[b].status=addresses[b+1].status;
    485                             addresses[b].begin=addresses[b+1].begin;
    486                             addresses[b].end=addresses[b+1].end;
    487                         }
    488                     }
    489                 }
    490                 for(l=1;l<=sumaddresses;l++)
    491                 {
    492                     if(addresses[l].begin==Free[Front].begin)
    493                     {
    494                         for(b=l;b<=sumaddresses;b++)
    495                         {
    496                             strcpy(addresses[b].pn,addresses[b+1].pn);
    497                             addresses[b].size=addresses[b+1].size;
    498                             addresses[b].status=addresses[b+1].status;
    499                             addresses[b].begin=addresses[b+1].begin;
    500                             addresses[b].end=addresses[b+1].end;
    501                         }
    502                     }
    503                 }
    504                 sumaddresses--;
    505                 addFree(sumaddresses,Front);
    506                 break;
    507             case 2:
    508                 Free[Back].begin=Used[Back].begin;
    509                 Free[Back].size=Free[Back].size+Used[i].size;
    510                 for(l=1;l<=sumaddresses;l++)
    511                 {
    512                     if(strcmp(addresses[l].pn,name)==0)
    513                     {
    514                         for(b=l;b<=sumaddresses;b++)
    515                         {
    516                             strcpy(addresses[b].pn,addresses[b+1].pn);
    517                             addresses[b].size=addresses[b+1].size;
    518                             addresses[b].status=addresses[b+1].status;
    519                             addresses[b].begin=addresses[b+1].begin;
    520                             addresses[b].end=addresses[b+1].end;
    521                         }
    522                     }
    523                 }
    524                 for(l=1;l<=sumaddresses;l++)
    525                 {
    526                     if(addresses[l].begin==Free[Back].begin)
    527                     {
    528                         for(b=l;b<=sumaddresses;b++)
    529                         {
    530                             strcpy(addresses[b].pn,addresses[b+1].pn);
    531                             addresses[b].size=addresses[b+1].size;
    532                             addresses[b].status=addresses[b+1].status;
    533                             addresses[b].begin=addresses[b+1].begin;
    534                             addresses[b].end=addresses[b+1].end;
    535                         }
    536                     }
    537                 }
    538                 sumaddresses--;
    539                 addFree(sumaddresses,Back);
    540                 break;
    541             case 3:
    542                 Free[Front].size=Free[Front].size+Used[i].size+Free[Back].size;
    543                 Free[Front].end=Free[Front].begin+Free[Front].size+Used[i].size+Free[Back].size;
    544                 for(k=Back;k<=sumFree;k++)
    545                 {
    546                     strcpy(Free[k].pn,Free[k+1].pn);
    547                     Free[k].size=Free[k+1].size;
    548                     Free[k].status=Free[k+1].status;
    549                     Free[k].begin=Free[k+1].begin;
    550                     Free[k].end=Free[k+1].end;
    551                 }
    552                 sumFree--;
    553                 for(l=1;l<=sumaddresses;l++)
    554                 {
    555                     if(strcmp(addresses[l].pn,name)==0)
    556                     {
    557                         for(b=l;b<=sumaddresses;b++)
    558                         {
    559                             strcpy(addresses[b].pn,addresses[b+1].pn);
    560                             addresses[b].size=addresses[b+1].size;
    561                             addresses[b].status=addresses[b+1].status;
    562                             addresses[b].begin=addresses[b+1].begin;
    563                             addresses[b].end=addresses[b+1].end;
    564                         }
    565                     }
    566                 }
    567                 for(l=1;l<=sumaddresses;l++)
    568                 {
    569                     if(addresses[l].begin==Free[Front].begin)
    570                     {
    571                         for(b=l;b<=sumaddresses;b++)
    572                         {
    573                             strcpy(addresses[b].pn,addresses[b+1].pn);
    574                             addresses[b].size=addresses[b+1].size;
    575                             addresses[b].status=addresses[b+1].status;
    576                             addresses[b].begin=addresses[b+1].begin;
    577                             addresses[b].end=addresses[b+1].end;
    578                         }
    579                     }
    580                 }
    581                 for(l=1;l<=sumaddresses;l++)
    582                 {
    583                     if(addresses[l].begin==Free[Back].begin)
    584                     {
    585                         for(b=l;b<=sumaddresses;b++)
    586                         {
    587                             strcpy(addresses[b].pn,addresses[b+1].pn);
    588                             addresses[b].size=addresses[b+1].size;
    589                             addresses[b].status=addresses[b+1].status;
    590                             addresses[b].begin=addresses[b+1].begin;
    591                             addresses[b].end=addresses[b+1].end;
    592                         }
    593                     }
    594                 }
    595                 sumaddresses=sumaddresses-2;
    596                 addFree(sumaddresses,Front);
    597                 break;
    598             }
    599             for(k=i;k<=sumUsed;k++)
    600             {
    601                 strcpy(Used[k].pn,Used[k+1].pn);
    602                 Used[k].size=Used[k+1].size;
    603                 Used[k].status=Used[k+1].status;
    604                 Used[k].begin=Used[k+1].begin;
    605                 Used[k].end=Used[k+1].end;
    606             }
    607             sumUsed--;
    608         }
    609         
    610     }
    611     Delcase();
    612     PT();
    613 }
    614 
    615 void Delcase()
    616 {
    617     int i,j;
    618     for(i=1;i<=sumFree;i++)
    619     {
    620         if(Free[i].begin+Free[i+1].size==Free[i+1].begin)
    621         {
    622 
    623             Free[i].size=Free[i].size+Free[i].size;
    624             Free[i].end=Free[i].begin+Free[i].size;
    625 
    626             j=i+1;
    627             strcpy(Free[j].pn,Free[j+1].pn);
    628             Free[j].size=Free[j+1].size;
    629             Free[j].status=Free[j+1].status;
    630             Free[j].begin=Free[j+1].begin;
    631             Free[j].end=Free[j+1].end;
    632             sumFree--;
    633         }
    634     }
    635 }
    636 
    637 void cho()
    638 {
    639     int choose;
    640     printf("
    请输入你的选择:
    ");
    641     printf("--1.插入作业------
    ");
    642     printf("--2.回收作业------
    ");
    643     scanf("%d",&choose);
    644     switch(choose)
    645     {
    646     case 1:
    647         input();
    648         break;
    649     case 2:
    650         Del();
    651         break;
    652     default:
    653         exit();
    654     }
    655 }
    656 
    657 int main()
    658 {
    659     char choose;
    660     init();
    661     PT();
    662     while(1)
    663     {
    664 chooses:
    665     cho();
    666 //    printf("是否继续?Y/N
    ");
    667 //    scanf("%c",&choose);
    668     }
    669     return 0;
    670 }
  • 相关阅读:
    【转载,待整理】初学 springmvc整合shiro
    【转载并整理】javaweb单点登录
    【转载】linux 测试机器端口连通性方法
    Intellij idea 复制粘贴查找快捷键失效
    intellij 打开node项目 一直停留在scanning files to index....,或跳出内存不够的提示框
    【转载】Hibernate之hbm.xml集合映射的使用(Set集合映射,list集合映射,Map集合映射)
    【转载并整理】mysql 1293错误 建表两个timestamp
    作用域与闭包:this,var
    在MongoDB中使用JOIN操作
    linux下用top命令查看cpu利用率超过100%
  • 原文地址:https://www.cnblogs.com/mxdmxdmxd78/p/5534825.html
Copyright © 2011-2022 走看看