操作系统实验报告_第1页
操作系统实验报告_第2页
操作系统实验报告_第3页
操作系统实验报告_第4页
操作系统实验报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

操作系统实验报告学号 姓名班级

实验一实验报告【实验名称】:并发程序设计(实验1)【实验目的】:掌握在程序中创建新进程的方法,观察并理解多道程序并发执行的现象。【实验原理】:fork():建立子进程。子进程得到父进程地址空间的一个复制。返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标识符(非0值)。不成功时对父进程返回-1,没有子进程。另一个迸程的数据区另一个迸程的数据区用用<父进程数据区和栈区户另一个迸程的数据区另一个迸程的数据区用用<父进程数据区和栈区户1区父进程数据区和栈区户5区父进程代码父子迸程代码另一个进程的区另一个迸程的区子迸程数据区(与父迸程数据区内容完全一样)OSyOSyproc数组区'proc数组区』proc数组proc数组另一个进程的数据区于进程代码(新装入的)父进程数据区和栈区父进程代码另一个进程的区:于进程数据区(新)proc数组Vproc数组进程标识 所执行的程序 (父) 进程标识 所执行的程序 (父) (于)(同父) 进程标识 所执行的程序 (父) (于)(新) (c)exec后的内存物理空间(a)fbrkWu的内存^物JS&空I'可(b)fbrk后、execWu的内存物理空间【实验内容I:首先分析一下程序运行时其输出结果有哪几种可能性,然后实际调试该程序观察其实际输出情况,比较两者的差异,分析其中的原因。voidmain(void)(intx=5;if(fork())(x+=30;printf("%d\n”,x);}elseprintf("%d\n”,x);printf(("%d\n”,x);}【实验要求】:每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含预计的实验结果,关键代码的分析,调试记录,实际的实验结果,实验结果分析等内容。【预计的实验结果】355355【关键代码分析】代码主要由fork()函数和一个ifelse条件分支语句组成。fork()函数,它是Linux的系统调用。函数定义:intfork(void);返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1函数说明:一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(childprocess)ofork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。父进程和子进程的代码段都是上面的所有代码,由定义可知不过子进程的代码只从创建此子进程那里开始执行。也就是从if(fork())语句开始,出现了子进程,两个进程并发执行。的。可以完全看成普通的两个进程。所以在执行printf(("%d\n”,x);的时候,父子进程当然都会执行它,因为他们本身程序段里都有这句代码。【调试记录】在红帽终端里做gdb调试在第五行加入断点,执行run得到55,这是子进程执行的结果。再执行next得到3535,这是父进程的结果。这里可以看出,由父进程创建的子进程先执行完毕,但是宏观上是并发执行。include<stdioLti>muin(void){intx=5;if(forkO)TOC\o"1-5"\h\z1printf( hx)i}eIseprintf( hx)i(gdb)bSBjeakpoint1atOx8O4837c3fileca.chline5,(gdb)runStartingprogram;/horre/yuiuiui/cbBreakpoint1.nuin()atca.f>x+=30;(gdb)Ifgdh)n7 printf( hx):Cgdh)n11 printf( hx):Cgdh)n【实际的实验结果】553535【实验结果分析】从实际结果来看,子进程比父进程先执行完,但是由fork函数,我们可知,两者优先级应该是一样的。至于哪个可能先执行,可能和操作系统的具体调度算法有关。当实验超过一定次数时,应该会出现其它结果。实验二实验报告【实验名称】:进程通信(实验2)【实验目的】:掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法。【实验原理】:邮箱机制类似于日常使用的信箱。对于用户而言使用起来比较方便,用户只需使用send()向对方邮箱发邮件receive()从自己邮箱取邮件,send()和receive()的内部操作用户无需关心。因为邮箱在内存中实现,其空间有大小限制。其实send()和receive()的内部实现主要还是要解决生产者与消费者问题。【实验内容】:进程通信的邮箱方式由操作系统提供形如send()和receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱与操作系统本身提供的信箱,分析两者之间存在的异同。【实验要求】:每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含背景知识介绍,设计方案,预计的实验结果,关键代码的分析,调试记录,实际的实验结果,实验结果分析等内容。【背景知识介绍】:1、sembuf数据结构structsembuf(unsignedshortintsem_num;//semaphorenumbershortintsem_op;//semaphoreoperationshortintsem_flg;//operationflag};sem_num:是相对应的信号量集中的某一个资源,所以其值是一个从0到相应的信号量集的资源总数(ipc_perm.sem_nsems)之间的整数。sem_op:指明所要执行的操作。如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值。通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0。sem_flg:信号操作标志,可能的选择有两种IPC_NOWAIT//对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。IPC_UNDO//程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。2、 semop函数函数原型:intsemop(intsemid,structsembuf*sops,unsignednsops);参数说明:semid:信号集的识别码,可通过semget获取。sops:指向存储信号操作结构的数组指针。nsops:信号操作结构的数量,恒大于或等于1。返回说明:成功执行时,两个系统调用都返回0。失败返回-1,错误信息保存在errno中。3、 semget函数函数原型:intsemget(key_tkey,intnsems,intsemflg);参数说明:key:关键字值一般是由系统调用ftok()返回的nsems:指出了一个新的信号量集中应该创建的信号量的个数semflg:打开和存取操作与参数semflg中的内容相关。返回说明:如果成功,则返回信号量集的IPC标识符。如果失败,返回-1,错误信息保存在errno中。4、 semctl函数函数原型:intsemctl(intsemid,intsemnum,intcmd,unionsemunarg);参数说明:senid:关键字值semnum:信号量数目cmd:要操作的具体命令arg:semnu的一个联合类型的副本。返回说明:返回值:如果成功,则为一个正数。如果失败,则为-1。错误信息保存在errno中。5、 pthread_create函数函数原型:intpthread_create(pthread_t*restricttidp,constpthread_attr_t^restrictattr,void*(*start_rtn)(void*),void^restrictarg);参数说明:tidp:指向线程标识符的指针。attr:用来设置线程属性。第三个参数是线程运行函数的起始地址。arg:运行函数的参数。【设计方案】:采用两个程序并行的方式,打开两个终端,为两个进程都创建一个邮箱。并且,要求先输入操作命令,使信箱执行哪种操作,以完成两个进程间的邮件通信。同时,还应采用pv操作,使当邮箱满和空的时候,分别不能执行发送和接收的工作。【实验预计结果】:A_Receive()和B_Receive()分别接收B_Send()和A_Send()发出的信息,发送的信息和接受的信息应该一样。【关键代码分析】:PV操作实现:intp(intsem_id)(structsembufsem_b;sem_b.sem_num=0;sem_b.sem_op=-1; //V操作只需将-1改为0。sem_b.sem_flg=SEM_UNDO;if(semop(sem_id,&sem_b,1)==-1)(return0;}return1;}A向B发送信息:void*A_Send(void*arg){ —inti;for(i=0;i<10;i++)(semaphore_P(sem_idAs);//P操作semaphore_P(a_mutex_semaphore);//互斥intnumber=rand(); //随机数为发送的邮件printf("AsendtoB:%d\n”,number);b_buf[b_buf_top]=number;//邮箱B中接收A发送的邮件b_buf_top+=1;//A向B发送邮件,B的邮件数量加一

semaphore_V(a_mutex_semaphore);//互斥semaphore_V(sem_idBr);//V操作sleep(1);}}【调试记录】:pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数gcc-w-lpthreadsemaphore.c【实验的实际结果】:yuiuiui@yuiuiui-desktop:-$gcc-w-osemaphore-lpthreadsemaphore.cyuiuiui@yuiuiui-desktop:-$./semaphoreBsendtoA:2AreceivefromB:2BsendtoA:2AreceivefromB:2AsendtoB:56BreceivefromA:56BsendtoA:37AreceivefromB:37AsendtoB:45BreceivefromA:45BsendtoA:97AsendtoB:asdfBreceivefromA:asdfBsendtoA:rtAreceivefromB:rtAreceivefromB:97AsendtoB:145BreceivefromA:145BsendtoA:564AreceivefromB:564AsendtoB:5647BreceivefromA:5647BsendtoA:23123AreceivefromB:23123【实验结果分析】:四个线程并发运行,A_Send()和B_Send()发出信息,同时打印出发出的信息内容;A_Receive()和B_Receive()分别接收B_Send()和A_Send()发出的信息,并打印出接受的信息内容。发出的内容和接收的内容一样,符合时间情况。实验三实验报告【实验目的】:掌握磁盘的工作原理和操作系统进行文件管理的原理【实验原理】:硬盘的MBR:MBR(MainBootRecord),按其字面上的理解即为主引导记录区,位于整个硬盘的0磁道0柱面1扇区。在总共512字节的主引导扇区中,MBR只占用了其中的446个字节(偏移0000--偏移01BD),另外的64个字节(偏移01BE--偏移01FD)交给了DPT(DiskPartitionTable硬盘分区表),最后两个字节”55,AA"(偏移01FE-偏移01FF)是分区的结束标志。这个整体构成了硬盘的主引导扇区。大致的结构如图所示:TOC\o"1-5"\h\z0000| II II I| Main.BootRecord |I II II 主引导记录〔44日字节) |01BD | |01BE | |I I01CD | 分区信息1〔16字节) |DICE | |I I01DD | 分区信息沮1日字节) |01DE | |I I01ED | 分区信息3〔1日字节) |01EE | |I I硬盘依据分区表中的信息酗盘划分为最多四个分区(对于扩展分区,可进一步划分为多个逻辑分区)"]U盘采用类似的方法划分分区。每个分区或软盘上可建立独立的文件系统。下图是FAT文件系统空间分布结构。| | 引导扇区1*1FAT1111FA:T2111i根目录区文件数据区【实验内容】:在掌握磁盘的工作原理和操作系统进行文件管理原理的基础上,自行设计实现在磁盘上建立文件系统的软件,该软件应该具有与Format类似的功能,至少支持一种文件系统格式,如FAT、NTFS或EXT2,至少能够对一种媒体进行格式化,如软盘,U盘或硬盘(不得在实验室的机器上进行硬盘格式化的实验)等。不能直接调用操作系统提供的格式化工具或类似SHFormatDrive()的高层系统函数实现该软件。在DOS环境可使用biosdisk()函数完成底层盘操作,在Windows环境可使用WriteFile(涵数完成底层盘操作,在Linux环境上可参考format的源代码。比较自己设计实现的软件与FORMAT,分析存在什么异同。【实验要求】每个同学必须独立完成本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含背景知识介绍,设计方案,预计的实验结果,关键代码的分析,调试记录,实际的实验结果,实验结果分析等内容。背景知识介绍一个分区或磁盘能作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上。这个过程就叫建立文件系统。大部分linux文件系统种类具有类似的通用结构。其中心概念是超级块superblock,i节点inode,数据块datablock,目录块directoryblock,和间接块indirectionblock。超级块包括文件系统的总体信息。 i节点包括除了名字外的一个文件的所有信息,名字与i节点数目一起存在目录中,目录条目包括文件名和文件的i节点数目。i节点包括几个数据块的数目,用于存储文件的数据。i节点中只有少量数据块数的空间,如果需要更多,会动态分配指向数据块的指针空间。这些动态分配的块是间接块;为了找到数据块,这名字指出它必须先找到间接块的号码。Linux文件系统通常允许在文件中产生孔(hole),意思是文件系统假装文件中有一个特殊的位置只有0字节,但没有为这文件的这个位置保留实际的磁盘空间。这对小的二进制文件经常发生,Linux共享库、一些数据库和其他一些特殊情况。设计方案1、 用一个文件(3)模拟一个物理硬盘,通过对该文件格式化操作,模拟linux文件系统中的文件操作。2、 将文件划分为四个分区预计的实验结果文件会被格式化,原先文件里的内容都会删除,创建新的文件系统。关键代码的分析1、 i节点结构structinode(structinode*i_forw;structinode*i_back;chari_flag;unsignedinti_ino;//磁盘i节点标号unsignedinti_count;//弓I用计数unsignedshortdi_number;//关联文件数unsignedshortdi_mode;//存取权限unsignedshortdi_uid;//磁盘i节点用户idunsignedshortdi_gid;//磁盘i节点住idunsignedintdi_size;//大小unsignedintdi_addr[NADDR];//物理块号};2、 目录项结构structdirect(chard_name[DIRSIZ];//目录名unsignedintd_ino;//目录号};3、 超级块structfilsys(unsignedshorts_isize;//i节点块块数unsignedlongs_fsize;//数据块块数unsignedints_nfree;//空闲块块数unsignedshorts_pfree;//空闲块指针unsignedints_free[NICFREE];//空闲块堆栈unsignedints_ninode;//空闲i节点数unsignedshorts_pinode;//空闲i节点指针unsignedints_inode[NICINOD];//空闲i节点数组unsignedints_rinode;//超级块修改标志chars_fmod;};4、 函数说明ifree:释放i节点区函数bfree:磁盘块释放函数iget:i节点内容获取函数iput:i节点内容释放函数format:格式化函数调试记录实际的实验结果fzu@fzu-desktop:~/OS$gcc-w-oformatformat.cfzu@fzu-desktop:~/OS$./format请输入文件的位置/home/fzu/OS/3formatsuccussfzu@fzu-desktop:~/OS$fzu@fzu-desktop:~/OS$vim3在文件3中输入一些内容,运行格式化程序后,文件不再是原来的内容和格式,想要双击打开,但是显示无法打开次文件。

文件(日融(日查看(Y)终端①帮助曲欧典rtAA(aA(a^^AA(aA(a^GrtAA(aA(aAFAAA(aA(a2A(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(a'但人H'BT”?????'亍亍矿①矿①①①足禅禅***"强?????d??*??? 足?????????rtS??"$??YiiF(????i??E???K?p人H'(r(r(r笆h???e???-b禅??h???矽m???????-T???¥TF*?????p他'但'他■爬'他■爬■爬■爬外酒'但Hp??p???室掣鱼趋.N=?X???q??yy'他■爬■爬'P???博???'(rb(r<r(r<r(r<rbbb<r<rb<r(r??x???%?ad^hr????fwa禅禅^????.N=?(????????r????????'D'Ht?????'愈'足飞^虞???勺足'足'包飞^愈'也X???'四爬'笆'笆'笆'强'笆'笆足丹足丹里丹强'强'笆'笆'笆'笆足丹足丹里丹吊'强'强'笆'笆'笆'笆足丹足丹里外笆'强'笆'笆'笆'笆足^(aA(aA(aA(aAtaA(aAtaA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aAtaA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aAtaA(aA(aA(aA(aA(aA(aA(aA(aAtaA(aAtaA(aA强'强'强'愈'足'足-足-足-足-足-强-强'强'强'愈'愈'足-足-足-足-足-足-强'强'强'强'愈'足'足-足-足-足-足-强-强'强'强'愈'愈'足-足-足人强外愈外触'强'用k足-足-足-用外强外强外强'愈'相'用吕用吕足k足-足-用-强外强外强外强'强'用k超-足-足-用外强外足外强'强'用'用吕足外©'强-强'©'©'但-但-@-但-但-巧-强-强-强-©'©'(^但外但巧-强-强-强巧-强-强-强-©'©'(^但外但A(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aAi!aA(aA(aA(aA(aA(aA足'强'强'愈'足'足-足-足-足-足-强-强'强'强'愈'愈'足-足-足-足-足-里-强'强'强'强'愈'足'足-足-足-足-足-强-强'强'强'愈'愈'足-足-足A(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(art(a^(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(a八强'强'强足-足-足-足-足-强'强'强'强'里'足'足-足-里-足-定-强-强'强'强'里'里'足-足-足-足足-强'强'足'强'里'足'足外足外(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(a八电'他'但但'但巧'电'强'但'©'他'他'但'电-强'强'强电'但'但电'电'©'色但'但人(a^(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(aA(a八强'愈

温馨提示

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

评论

0/150

提交评论