上海大学操作系统(二)实验报告(全)_第1页
上海大学操作系统(二)实验报告(全)_第2页
上海大学操作系统(二)实验报告(全)_第3页
上海大学操作系统(二)实验报告(全)_第4页
上海大学操作系统(二)实验报告(全)_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上海大学操作系统(二)实验报告(全)评分:SHANGHAIUNIVERSITY操作系统实验报告学院计算机工程与科学专业计算机科学与技术学号学生姓名2、调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。3、系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程。操作过程:1、本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。进程控制块结构如下:进程控制块结构如下:PCB进程标识数链指针优先数/轮转时间片数占用CPU时间片数进程所需时间片数进程状态进程控制块链结构如下:其中:RUN—当前运行进程指针;HEAD—进程就绪链链首指针;TAID—进程就绪链链尾指针。2、算法与框图(1)优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减1,说明它已运行了一个时间片,优先数也减3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。(2)简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。(3)程序框图运行结果:Priority算法:RoundRobin算法:实验代码://操作系统实验--进程调度#include<cstdio>#include<ctime>#include<cstring>#include<cstdlib>constlongn=5;structpcbtype //进程控制块结构{ longid,priority,runtime,totaltime; charstatus; //R,W,F->运行,就绪,完成}PCB[n+1]; longlink[n+1]; //链表结构 longRUN,HEAD,TAIL;//选择算法 longChooseAlgo() { chars[128]; printf("PleasetypetheAlgorithm(Priority\\RoundRobin):"); gets(s); if(s[0]=='P'||s[0]=='p') return1; return0; }//初始化 voidinit() { longi; for(i=1;i<=n;i++) { PCB[i].id=i; PCB[i].priority=rand()%4+1; PCB[i].runtime=0; PCB[i].totaltime=rand()%8+1; PCB[i].status='W'; } }//显示进程调度状况 voidshowit() { longi; printf("=====================================================\n"); printf("%-25s","ID"); for(i=1;i<=n;i++)printf("%4ld",PCB[i].id); printf("\n%-25s","PRIORITY//TURNTIME"); for(i=1;i<=n;i++)printf("%4ld",PCB[i].priority); printf("\n%-25s","CPUTIME"); for(i=1;i<=n;i++)printf("%4ld",PCB[i].runtime); printf("\n%-25s","ALLTIME"); for(i=1;i<=n;i++)printf("%4ld",PCB[i].totaltime); printf("\n%-25s","STATUS"); for(i=1;i<=n;i++)printf("%4c",PCB[i].status); printf("\n=====================================================\n"); if(RUN!=-1)printf("RUNNINGPROCESS:%ld\n",RUN); elseprintf("RUNNINGPROCESS:NULL\n"); printf("WAITINGQUEUE:"); for(i=HEAD;i!=-1;i=link[i])printf("%ld",i); printf("\n\n"); }//优先数调度算法 voidmain_priority() { longi,j,k;longsort[n+1]; init(); //设置就绪链 for(i=1;i<=n;i++) { sort[i]=i; } for(i=1;i<=n;i++) //根据优先数排序 { for(j=n;j>i;j--) { if(PCB[sort[j]].priority>PCB[sort[j-1]].priority) { k=sort[j];sort[j]=sort[j-1];sort[j-1]=k; } } } HEAD=sort[1]; for(i=1;i<n;i++) { link[sort[i]]=sort[i+1]; } TAIL=sort[n]; link[TAIL]=-1; RUN=-1; //就绪链设置完毕 RUN=HEAD; PCB[RUN].status='R'; HEAD=link[HEAD]; //运行链首进程 while(RUN!=-1) { showit(); PCB[RUN].totaltime--; PCB[RUN].priority-=3;//优先级减3 PCB[RUN].runtime++; if(PCB[RUN].totaltime==0) //进程运行完成 { PCB[RUN].status='F'; RUN=HEAD; if(HEAD!=-1) HEAD=link[HEAD]; PCB[RUN].status='R'; } else { if(HEAD!=-1&&PCB[RUN].priority<PCB[HEAD].priority) { k=HEAD; PCB[RUN].status='W'; //寻找等待链中的合适位置 while(k!=TAIL&&PCB[link[k]].priority>PCB[RUN].priority) k=link[k]; if(k==TAIL) { link[k]=RUN; //插入链尾之后 TAIL=RUN; link[RUN]=-1; RUN=HEAD; HEAD=link[HEAD]; PCB[RUN].status='R'; } else { link[RUN]=link[k]; //插入链中 link[k]=RUN; RUN=HEAD; //链首进程开始运行 HEAD=link[HEAD]; PCB[RUN].status='R'; } } } } showit(); }//轮转调度算法 voidmain_round_robin() { longi; init(); //设置就绪链 HEAD=1; for(i=1;i<n;i++) { link[i]=i+1; } TAIL=n; link[TAIL]=-1; RUN=-1; //就绪链设置完毕 RUN=HEAD; PCB[RUN].status='R'; HEAD=link[HEAD];//运行首进程 while(RUN!=-1) { showit(); PCB[RUN].totaltime--; PCB[RUN].runtime++; if(PCB[RUN].totaltime==0)//进程运行完成 { PCB[RUN].status='F'; RUN=HEAD; if(HEAD!=-1) HEAD=link[HEAD]; PCB[RUN].status='R'; } else { if(HEAD!=-1&&PCB[RUN].runtime%PCB[RUN].priority==0)//轮转时间到 { PCB[RUN].status='W'; //插入链尾 link[TAIL]=RUN; link[RUN]=-1; TAIL=RUN; RUN=HEAD;//链首进程开始运行 HEAD=link[HEAD]; PCB[RUN].status='R'; } } } showit(); }//主函数 intmain() { longalgo; srand(time(NULL)); algo=ChooseAlgo(); if(algo==1) { main_priority();//优先数法 } else { main_round_robin();//简单轮转法 } printf("SYSTEMFINISHED\n"); return0; }实验体会:通过写代码的过程更加清晰地了解了两种算法的思想和用处,对算法的了解加深的同事也锻炼了写代码的能力。《计算机操作系统》实验三报告实验三题目:请求页式存储管理姓名:张佳慧学号:12122544实验日期:2015.1实验环境:MicrosoftVisualStudio实验目的:近年来,由于大规模集成电路(LSI)和超大规模集成电路(VLSI)技术的发展,使存储器的容量不断扩大,价格大幅度下降。但从使用角度看,存储器的容量和成本总受到一定的限制。所以,提高存储器的效率始终是操作系统研究的重要课题之一。虚拟存储技术是用来扩大内存容量的一种重要方法。学生应独立地用高级语言编写几个常用的存储分配算法,并设计一个存储管理的模拟程序,对各种算法进行分析比较,评测其性能优劣,从而加深对这些算法的了解。实验内容:为了比较真实地模拟存储管理,可预先生成一个大致符合实际情况的指令地址流。然后模拟这样一种指令序列的执行来计算和分析各种算法的访问命中率。本实验采用页式分配存储管理方案,并通过分析计算不同页面淘汰算法情况下的访问命中率来比较各种算法的优劣。另外也考虑到改变页面大小和实际存储器容量对计算结果的影响,从而可为算则好的算法、合适的页面尺寸和实存容量提供依据。实验是按下述原则生成指令序列的:(1)50%的指令是顺序执行的。(2)25%的指令均匀散布在前地址部分。(3)25%的指令均匀散布在后地址部分。示例中选用最佳淘汰算法(OPT)和最近最少使用页面淘汰算法(LRU)计算页面命中率。公式为假定虚存容量为32K,页面尺寸从1K至8K,实存容量从4页至32页。(1)最佳淘汰算法(OPT)这是一种理想的算法,可用来作为衡量其他算法优劣的根据,在实际系统中是难以实现的,因为它必须先知道指令的全部地址流。由于本示例中已预生成了全部的指令地址流,故可计算出最佳命中率。该算法的准则是淘汰已满页表中不再访问或是最迟访问的的页。这就要求将页表中的页逐个与后继指令访问的所有页比较,如后继指令不在访问该页,则把此页淘汰,不然得找出后继指令中最迟访问的页面淘汰。可见最佳淘汰算法要花费比较长的运算时间。(2)最近最少使用页淘汰算法(LRU)这是一种经常使用的方法,有各种不同的实施方案,这里采用的是不断调整页表链的方法,即总是淘汰页表链链首的页,而把新访问的页插入链尾。如果当前调用页已在页表内,则把它再次调整到链尾。这样就能保证最近使用的页,总是处于靠近链尾部分,而不常使用的页就移到链首,逐个被淘汰,在页表较大时,调整页表链的代价也是不小的。操作过程:编写程序:#include<iostream>#include<process.h>#include<cstdlib>#include<algorithm>#include<ctime>#include<cstdlib>#include<cstring>#include<cstdio>#include<cmath>usingnamespacestd;intadress[32];//全局变量数组,地址流intp;//全局变量p是一共有多少地址流voidinit(){//初始化函数,intt; srand(time(0));//随机产生指令序列p=12+rand()%32;cout<<"地址流个数P="<<p<<endl; cout<<"随机产生的地址流序列\n"; for(inti=0,j=0;i<p;i++,j++){ t=1+rand()%9; adress[i]=t;//将随机产生的指令数存入页面流printf("a[%d]=%d",i,t);j=j%5;if(i<10)printf("");if(j==4)printf("\n"); } cout<<endl;}voidOPT(intn){//FIFO算法,n是M的值 inte,q=p,m=n-1; intflag; intflag1; intqueye=0; intleaflink[32];memset(leaflink,0,sizeof(leaflink)); for(intx=0;x<q;x++){ e=x; flag=0; for(inti=0;i<n;i++){ if(leaflink[i]==adress[x]){ flag=1; flag1=i; printf("有相同\n"); break; } } if(flag==0){intk=0;for(intj=0;j<m;j++){//012 leaflink[k]=leaflink[k+1];k++; }leaflink[m]=adress[e];if(e>=m){queye++; } } if(flag==1){inttemp[10]={0};for(inti=0;i<=m;i++){for(inta=e+1;a<q;a++){if(leaflink[i]==adress[a]){temp[i]++;}}}intindex=0;for(inti=0;i<m;i++){intmin=temp[0];if(min>temp[i]){min=temp[i];index=i;}}intl=leaflink[index];leaflink[index]=leaflink[0];leaflink[0]=l; }for(intj=0;j<n;j++)printf("leaflink[%d]=%d",j,leaflink[j]);cout<<endl;} cout<<"M="<<n<<"时FIFO的命中率为:"<<(1-((double)queye/p))*100<<"%"<<""<<endl;}voidLRU(intn){//LRU算法 inti; intm=n-1; intq=p; inte; intqueye=0; intflag; intflag1; inty; intleaflink[32]; memset(leaflink,0,sizeof(leaflink)); for(intx=0;x<q;x++){ flag=0; e=x; for(i=0;i<n;i++){ if(leaflink[i]==adress[x]){ flag=1; flag1=i; printf("X=%d,lru[%d]=adress[%d]=%d,flag=1\n",x,i,x,adress[x]); break; } } if(flag==0){intk=0; for(intj=0;j<m;j++){//012 leaflink[k]=leaflink[k+1];k++; } leaflink[m]=adress[e]; queye++; } elseif(flag==1){y=flag1; for(intj=0;j<m;j++){ leaflink[flag1]=leaflink[flag1+1]; flag1++;} leaflink[3]=adress[e]; printf("发现相同后,改变leaflink[%d]=%d\n",m,leaflink[3]);} for(intj=0;j<n;j++)printf("leaflink[%d]=%d",j,leaflink[j]);cout<<endl; } cout<<"发生替换次数:"<<queye<<endl; cout<<"M="<<n<<"时LRU的命中率为:"<<(1-((double)queye/p))*100<<"%"<<endl;}intmain(){ init(); charc; printf("请输入选择算法(O:最佳淘汰L:最近最少使用):"); cin>>c; if(c=='O') for(inti=3;i<4;i++){ OPT(i); } elseif(c=='L'){for(inti=4;i<5;i++){ LRU(i); cout<<endl; } } return0;}运行结果:最近最少使用:最佳淘汰:实验体会:通过这次实验,我了解了采用页式分配存储管理方案,并对页式分配存储管理的两个算法最佳淘汰算法和最近最少使用页淘汰算法有了更深入的了解,为之后的学习奠定了基础。《计算机操作系统》实验四报告实验四题目:文件操作与管理姓名:张佳慧学号:12122544实验日期:2015.1实验环境:MicrosoftVisualStudio实验目的:随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个极为重要的组成部分。学生应独立地用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。实验内容:1.要求:(1)实际一个n个用户的文件系统,每个用户最多可保存m个文件。(2)限制用户在一次运行中只能打开l个文件。(3)系统应能检查打入命令的正确性,出错要能显示出错原因。(4)对文件必须设置保护措施,如只能执行,允许读、允许写等。在每次打开文件时根据本次打开的要求,再次设置保护级别,即可有二级保护。(5)对文件的操作至少应有下述几条命令:creat建立文件。delete删除文件。open打开文件。close关闭文件。read读文件。write写文件。2.示例:(1)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。3.算法与框图(1)因系统小,文件目录的检索使用了简单的线性搜索,而没有采用Hash等有效算法。(2)文件保护简单实用了三位保护码,对应于允许读、允许写和运行执行,如下所示:111允许写允许读允许执行如对应位为0,则不允许。实验源码:#include<iostream>#include<cstdlib>#include<algorithm>#include<ctime>#include<cstring>#include<cstdio>#include<cmath>usingnamespacestd;structUFD{intfname;intlen;intprocode[3];}ufd[10];structMFD{intuser;UFDp[5];}mfd[10];intmain(){intx,n=10,flag1=1,flag2=1,flag3=1;if(flag1){for(inti=0;i<10;i++){ufd[i].fname=i;intt=100+rand()%900;ufd[i].len=t;for(intj=0;j<3;j++)ufd[i].procode[j]=rand()%2;}srand((unsigned)time(NULL));boolf[10];for(inti=0;i<10;i++){mfd[i].user=i;memset(f,0,sizeoff);for(intj=0;j<5;j++){intt;dot=rand()%10;while(f[t]);f[t]=1;mfd[i].p[j]=ufd[t];}}}while(n--&&flag2){cout<<"inputuser:"<<endl;cin>>x;if(x<0||x>=10){cout<<"tryagain"<<endl;break;}for(intj=0;j<5;j++)cout<<mfd[x].p[j].fname<<""<<mfd[x].p[j].len<<""<<mfd[x].p[j].procode[0]<<mfd[x].p[j].procode[1]<<mfd[x].p[j].procode[2]<<endl;cout<<"inputthecommand:"<<endl;cout<<"creat1;delete2;open3;bye4;close5;read6;write7"<<endl;ints,index,flag=1;while(flag){cin>>s;switch(s){case1:if(flag3){cout<<"输入你要创建的文件的名字:"<<endl;cin>>mfd[x].p[0].fname;cout<<"输入你要创建的文件的长度:"<<endl;cin>>mfd[x].p[0].len;cout<<"输入你要创建的文件的权限:"<<endl;for(inti=0;i<3;i++)cin>>mfd[x].p[0].procode[i];for(intj=0;j<5;j++)cout<<mfd[x].p[j].fname<<""<<mfd[x].p[j].len<<""<<mfd[x].p[j].procode[0]<<mfd[x].p[j].procode[1]<<mfd[x].p[j].procode[2]<<endl;cout<<"inputthecommand:"<<endl;}else{cout<<"输入你要创建的文件的名字:"<<endl;cin>>mfd[x].p[index].fname;cout<<"输入你要创建的文件的长度:"<<endl;cin>>mfd[x].p[index].len;cout<<"输入你要创建的文件的权限:"<<endl;for(inti=0;i<3;i++)cin>>mfd[x].p[index].procode[i];for(intj=0;j<5;j++)cout<<mfd[x].p[j].fname<<""<<mfd[x].p[j].len<<""<<mfd[x].p[j].procode[0]<<mfd[x].p[j].procode[1]<<mfd[x].p[j].procode[2]<<endl;cout<<"inputthecommand:"<<endl;}break;case2:flag3=0;cout<<"输入要删除的文件:"<<endl;intt;cin>>t;for(inti=0;i<5;i++){if(mfd[x].p[i].fname==t){index=i;mfd[x].p[i].fname=0;mfd[x].p[i].len=000;memset(mfd[x].p[i].procode,0,sizeof(mfd[x].p[i].procode));}}for(intj=0;j<5;j++)cout<<mfd[x].p[j].fname<<""<<mfd[x].p[j].len<<""<<mfd[x].p[j].procode[0]<<mfd[x].p[j].procode[1]<<mfd[x].p[j].procode[2]<<endl;cout<<"inputthecommand:"<<endl;break;case3:cout<<"输入要打开的文件:"<<endl;intfile;cin>>file;for(inti=0;i<5;i++){if(mfd[x].p[i].fname==file){if(mfd[x].p[i].procode[2]==0)cout<<"你没有权限"<<endl;elsecout<<"可以打开"<<endl;}}cout<<"inputthecommand:"<<endl;break;case4:for(intj=0;j<5;j++)cout<<mfd[x].p[j].fname<<""<<mfd[x].p[j].len<<""<<mfd[x].p[j].procode[0]<<mfd[x].p[j].procode[1]<<mfd[x].p[j].procode[2]<<endl;cout<<"goodbye~"<<endl;flag=0;flag2=0;flag1=0;break;case5:flag=0;flag1=0;break;case6:cout<<"输入要读的文件:"<<endl;intfile1;cin>>file1;for(inti=0;i<5;i++){if(mfd[x].p[i].fname==file1){if(mfd[x].p[i].procode[1]==0)cout<<"你没有权限"<<endl;elsecout<<"可以读"<<endl;}}cout<<"inputthecommand:"<<endl;break;case7:cout<<"输入要写的文件:"<<endl;intfile2;cin>>file2;for(inti=0;i<5;i++){if(mfd[x].p[i].fname==file2){if(mfd[x].p[i].procode[0]==0)cout<<"你没有权限"<<endl;elsecout<<"可以写"<<endl;}}cout<<"inputthecommand:"<<endl;break;}}}return0;}实验结果:实验体会:本次实验主要是模拟了一下文件系统,文件是我们平时接触最多也是最广的形式,即便是不会计算机的人们也可以通过这种操作文件来很方便地完成操作,而本次实验让我了解到了文件系统的内部实现,虽然仅仅是通过C++模拟的,但还是让我对它的原理有了更好的理解,也是对我们上课的内容的一个巩固。《计算机操作系统》实验六报告实验六题目:FAT文件系统实验姓名:张佳慧学号:12122544实验日期:2015.1实验环境:win95虚拟机实验目的:从系统分析的角度出发,了解FAT文件系统的组织结构和文件的存储方式。进一步理解操作系统文件管理的基本思想。实验内容:1.了解3吋软盘的FAT文件系统结构。2.察看文件分配表的簇号链。3.察看文件目录表中文件目录结构。4.了解用簇号链映射的文件链式存储结构。5.分析目录文件的组成。实验步骤:1.进入DEBUG环境,装入FAT文件系统结构。执行命令:L00021说明:将0号驱动器中,逻辑扇区号从0开始的共21H个扇区读入内存,放在DS:0000为起始的地址中。2.观察1.44M软盘中FAT12文件系统结构。执行命令:D0000连续执行D命令,每次显示128个字节,可见文件系统结构。FAT文件系统结构如下:逻辑扇区号其中:Boot引导程序FAT文件分配表FDT文件目录表1.44M软盘逻辑扇号与物理扇区的对应关系逻辑扇号0#——0道0面1扇逻辑扇号1H~11H——0道0面2~18扇逻辑扇号12H~23H——0道1面1扇~18扇逻辑扇号24H~35H——1道0面1扇~18扇软盘有两面,每面80个磁道,每个磁道18个扇区,每个扇区512个字节,所以软盘的容量是2*80*18*512=1474560,1474560/1024/1024大约为1.44M。3.分析文件分配表结构,了解用簇链映射的文件的链式存储结构。执行命令:D200思考:上面屏幕显示首簇号为003的文件共包括几个扇区?它分布在哪几个物理扇区上?答:首簇号为003的文件共包括2个扇区,它分布在0道0面2、3扇。4.观察1.44M软盘中文件目录表FDT以及文件目录结构执行命令:L00021说明:将逻辑扇区0H开始的共21H个物理扇区装入DS:0000H起始的内存。执行命令:D2600说明:显示从2600H地址开始的FDT文件表。思考:①计算1.44M的软盘根目录最多可以容纳多少文件?答:1.44MB软盘的文件目录表FDT共14个扇区,每个文件的目录登记项占用32个字节,用作目录的一个扇区(512字节)最多只能装入512/32=16个文件。因此,1.44MB软盘的根目录下最多可建文件或子目录224个。②上图屏幕显示的文件的目录项中标示该文件的首簇号在何处?该文件是什么属性?答:首簇号在第2行的1A~1B字节处,首簇号为002,该文件属于归档文件。书上显示的文件首簇号在第6行的1A~1B字节处,首簇号为091,属归档文件。③书上面的屏幕显示第1~2行目录项表示的是什么项目?答:第1~2目录项表示卷标。5.观察1.44M软盘中文件目录表的长文件名目录结构思考:①书上面屏幕显示的2~3行是什么目录项?答:长名的第一项,也是最后一项。②若有一个文件名共长34个字符,要占多少目录项?答:四个目录项,三个长目录项和一个短目录项。6.自己动手做:①观察测试软盘的FDT区,找到名为BAK的文件目录。该文件是什么类型的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论