您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 山大的操作系统课程设计报告
实验3:SynchronizationUsingSemaphores实验5:ExtendableFiles实验6,7,8:实现系统调用Exec实验9:设计并实现具有优先级的线程调度策略实验10:具有二级索引的文件系统实验11:用户空间的虚拟内存管理计算机科学与技术学院实验报告:3实验题目:信号量同步问题日期:2010-11-10姓名:实验目的:在本次实验中,通过使用信号量,在原有的程序框架的基础上添加关键代码实现生产者/消费者同步问题。从而深入理解Nachos的信号量的使用以及实现,生产者/消费者问题是如何用信号量实现的以及在Nachos中是如何创建线程,实现多线程。硬件环境:软件环境:Linux实验步骤:1.首先初始化三个信号量,代码如下:mutex=newSemaphore(mutux,1);信号量初始化为1,才能起到加锁功能nfull=newSemaphore(full,0);nfull的大小在生产者没生产前为0nempty=newSemaphore(empty,BUFF_SIZE);nempty的大小应该为buffer的大小2.首先考虑生产者进程,首先要查看buffer是否有空,nempty-P();ifnempty0,nempty=nempty-1,当对缓冲区操作时必须要加锁:mutex-P();加锁.然后向ring中放入message信息,其次还要解锁mutex-V();解锁.最后通知消费者buffer有新信息,nfull-V();nfull=nfull+1;具体实现代码如下:3.考虑消费者进程,像生产者进程一样,查看buffer中是否有信息nfull-P();ifnfull0,nfull-1;取消息时也要上锁,即:mutex-P();加锁.然后从ringbuffer中取出信息;其次mutex-V();解锁;最后通知生产者bufferr有空nempty-V();nempty=nempty+1,具体代码如下:4.创建线程生成一个生产者的代码:producers[i]=newThread(prod_names[i]);producers[i]-Fork(Producer,i);4.创建线程生成一个消费者的代码:producers[i]=newThread(prod_names[i]);producers[i]-Fork(Producer,i);关键代码:voidProducer(_intwhich){intnum;slot*message=newslot(0,0);for(num=0;numN_MESSG;num++){//这是消息创建的代码message-thread_id=which;message-value=num;//p,v操作nempty-P();mutex-P();ring-Put(message);//p,v操作mutex-V();nfull-V();}}voidConsumer(_intwhich){charstr[MAXLEN];charfname[LINELEN];intfd;slot*message=newslot(0,0);sprintf(fname,tmp_%d,which);//createafile.NotethatthisisaUNIXsystemcall.if((fd=creat(fname,0600))==-1){perror(creat:filecreatefailed);Exit(1);}for(;;){//p,v,操作nfull-P();mutex-P();ring-Get(message);//p,v,操作mutex-V();nempty-V();//formastringtorecordthemessagesprintf(str,producerid--%d;Messagenumber--%d;\n,message-thread_id,message-value);//把信息写入文件if(write(fd,str,strlen(str))==-1){perror(write:writefailed);Exit(1);}}}//----------------------------------------------------------------------//ProdCons//初始化信号量以及需要的生产者消费者线程//----------------------------------------------------------------------voidProdCons(){inti;DEBUG('t',EnteringProdCons);//初始化信号量,包括一个访问互斥信号量,初值为1;//一个nempty信号量,初值为缓冲区的大小//一个nfull的信号量,初值为0mutex=newSemaphore(mutex,1);nempty=newSemaphore(nempty,BUFF_SIZE);nfull=newSemaphore(nfull,0);//新建一个缓冲区ring=newRing(BUFF_SIZE+1);//createandforkN_PRODofproducerthreadsfor(i=0;iN_PROD;i++){//thisstatemetistoformastringtobeusedasthenamefor//produderi.sprintf(prod_names[i],producer_%d,i);//创建生产者线程producers[i]=newThread(prod_names[i]);producers[i]-Fork(Producer,i);};//createandforkN_CONSofconsumerthreadsfor(i=0;iN_CONS;i++){//thisstatemetistoformastringtobeusedasthenamefor//consumeri.sprintf(cons_names[i],consumer_%d,i);//创建消费者线程consumers[i]=newThread(cons_names[i]);consumers[i]-Fork(Consumer,i);};}调试记录:在源代码中exit(0)没有大写,调试过程发现了这个问题改正,在使用Linux系统调用写入文件时,有一个头文件没有引入,因而需要修改#includestdio.h#includecopyright.h#includesystem.h#includeunistd.h#includefcntl.h而且对于新添加的头文件的方法其中源文件使用的一个方法是废弃的,所以改成相应的方法write(fd,str,strlen(str)),实验结果:生成两个文件分别代表两个消费者取得的产品的记录。文件tmp_0producerid--0;Messagenumber--3;文件tmp_1producerid--0;Messagenumber--0;producerid--1;Messagenumber--0;producerid--1;Messagenumber--1;producerid--0;Messagenumber--1;producerid--0;Messagenumber--2;producerid--1;Messagenumber--2;producerid--1;Messagenumber--3;分析结果:从实验结果中可以看出,两个消费者取得的产品的顺序和生成者生产的顺序是一致的。结果正确。(实验所在目录:home/lu/csc2404/nachos-3.4/code/lab3)结论分析与体会:在本次实验中,实现生产者/消费者同步问题,通过使用信号量,即Nachos提供的系统调用,进一步理解Nachos的信号量的使用以及实现同时,学会在Nachos中是如何创建线程,实现多线程,理解了多线程的问题。计算机科学与技术学院实验报告:5实验题目:扩展Nachos的文件系统学号:200800130090日期:2010-11-10姓名:陆思思Email:实验目的:Nachos的文件系统的文件的大小是不可扩展的:文件被创建后,文件的大小就不能再改变。本次实验的目的即是设计扩展Nachos的文件系统,使得文件的大小是可以被扩展的。这样就可以实现在一个文件尾部或者中间追加文件。硬件环境:软件环境:Linux操作系统,Nachos操作系统实验步骤:1,了解Nachos文件系统的结构,为一级目录结构,其中目录结构以及目录的使用记录保存在文件中。使用BitMap来获取空闲的扇区号。classDirectoryEntry{public:boolinUse;//Isthisdirectoryentryinuse?intsector;//Locationondisktofindthe//FileHeaderforthisfilecharname[FileNameMaxLen+1];//Textnameforfile,with+1for//thetrailing'\0'};这个是DirectoryEntry类,也就是目录项。Directory::Directory(intsize){table=newDirectoryEntry[size];tableSize=size;for(inti=0;itableSize;i++)table[i].inUse=FALSE;}这个是目录类,也就是一级目录结构的定义。boolDirectory::Add(char*name,intnewSector){if(FindIndex(name)!=-1)returnFALSE;for(inti=0;itableSize;i++)if(!table[i].inUse){table[i].inUse=TRUE;strncpy(table[i].name,name,FileNameMaxLen);table[i].sector=newSector;returnTRUE;}returnFALSE;//nospace.Fixwhenwehaveextensiblefiles.}这个是添加一个目录项的方法,当创建一个新文件的时候使用。boolFileSystem::Create(char*name,intinitialSize)这个是创建一个新的文件,其中主要工作是新建一个FileHeader,作为一个目录项中保存的intsector;FileHeader,即文件头,中保存了这个文件的大小,所占的扇区的数目,以及所占用的全部的扇区号。即:intnumBytes;//NumberofbytesinthefileintnumSectors;//NumberofdatasectorsinthefileintdataSectors[NumDirect];//Disksectornumbersforeachdata//blockinthefile因此,为了实现对文件的追加工作,首先对FileHeader类里面加入新的方法boolAppSectors(BitMap*freeMap,intfileSize);,为了改变一个文件的文件头的大小。2,实现在一个已有的文件尾部追加新的内容。首先写改变文件头中对文件所在扇区的描述,由AppSectors来实现;该方法将在OpenFile类的对象执行AppendFile时被调用。对FileHeader类里面加入新的方法boolAppSectors(BitMap*freeMap,intfileSize);boolFileHeader::AppSectors(BitMap*freeMap,intappFileSize){//如果要追加的文件大小小于等于0,则直接函数返回if(appFileSize=0)ret
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:山大的操作系统课程设计报告
链接地址:https://www.777doc.com/doc-3339177 .html