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

下载本文档

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

文档简介

操作系统实验报告学号姓名班级实验一实验报告【实验名称】:并发程序设计(实验1)【实验目的】:掌握在程序中创立新进程的办法,观察并理解多道程序并发执行的现象。【实验原理】:fork():建立子进程。子进程得到父进程地址空间的一种复制。返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标记符(非0值)。不成功时对父进程返回-1,没有子进程。【实验内容】:首先分析一下程序运行时其输出成果有哪几个可能性,然后实际调试该程序观察其实际输出状况,比较两者的差别,分析其中的因素。voidmain(void){intx=5;if(fork()){x+=30;printf(“%d\n”,x);}elseprintf(“%d\n”,x);printf((“%d\n”,x);}【实验规定】:每个同窗必须独立完毕本实验、提交实验报告、源程序和可执行程序。实验报告中必须包含预计的实验成果,核心代码的分析,调试统计,实际的实验成果,实验成果分析等内容。【预计的实验成果】 35 5 35 5【核心代码分析】代码重要由fork()函数和一种ifelse条件分支语句构成。fork()函数,它是Linux的系统调用。函数定义:intfork(void);返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1函数阐明:一种现有进程能够调用fork函数创立一种新进程。由fork创立的新进程被称为子进程(childprocess)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。linux将复制父进程的地址空间内容给子进程,因此,子进程有了独立的地址空间。父进程和子进程的代码段都是上面的全部代码,由定义可知但是子进程的代码只从创立此子进程那里开始执行。也就是从if(fork())语句开始,出现了子进程,两个进程并发执行。当这个程序执行if(fork())时,操作系统创立一种新的进程(子进程),并且在进程表中对应为它建立一种新的PCB表项。其中子进程从父进程继承到了大部分的参数。也有独有的参数,如进程号等。但是此后他们是独立的两个进程。在子进程里创立的东西是子进程的,在父进程创立的东西是父进程的。能够完全当作普通的两个进程。因此在执行printf((“%d\n”,x);的时候,父子进程固然都会执行它,由于他们本身程序段里都有这句代码。【调试统计】 在红帽终端里做gdb调试在第五行加入断点,执行run得到55,这是子进程执行的成果。再执行next得到3535,这是父进程的成果。这里能够看出,由父进程创立的子进程先执行完毕,但是宏观上是并发执行。【实际的实验成果】553535【实验成果分析】从实际成果来看,子进程比父进程先执行完,但是由fork函数,我们可知,两者优先级应当是同样的。至于哪个可能先执行,可能和操作系统的具体调度算法有关。当实验超出一定次数时,应当会出现其它成果。实验二实验报告【实验名称】:进程通信(实验2)【实验目的】:掌握用邮箱方式进行进程通信的办法,并通过设计实现简朴邮箱理解进程通信中的同时问题以及解决该问题的办法。【实验原理】:邮箱机制类似于日常使用的信箱。对于顾客而言使用起来比较方便,顾客只需使用send()向对方邮箱发邮件receive()从自己邮箱取邮件,send()和receive()的内部操作顾客无需关心。由于邮箱在内存中实现,其空间有大小限制。其实send()和receive()的内部实现重要还是要解决生产者与消费者问题。进程A进程A进程B信箱A信箱BSend()Send()receive()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:2AsendtoB:56BreceivefromA:56BsendtoA:37AreceivefromB:37AsendtoB:45BreceivefromA:45BsendtoA:97AreceivefromB:97AsendtoB:145BreceivefromA:145BsendtoA:564AreceivefromB:564AsendtoB:5647BreceivefromA:5647BsendtoA:23123AreceivefromB:23123AsendtoB:asdfBreceivefromA:asdfBsendtoA:rtAreceivefromB:rt【实验成果分析】:四个线程并发运行,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)是分区的结束标志。这个整体构成了硬盘的主引导扇区。大致的构造如图所示:硬盘根据分区表中的信息把硬盘划分为最多四个分区(对于扩展分区,可进一步划分为多个逻辑分区)。U盘采用类似的办法划分分区。每个分区或软盘上可建立独立的文献系统。下图是FAT文献系统空间分布构造。引导扇区引导扇区FAT1FAT2根目录区文献数据区【实验内容】:在掌握磁盘的工作原理和操作系统进行文献管理原理的基础上,自行设计实现在磁盘上建立文献系统的软件,该软件应当含有与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;//引用计数 unsignedshortdi_number;//关联文献数 unsignedshortdi_mode;//存取权限 unsignedshortdi_uid;//磁盘i节点顾客id unsignedshortdi_gid;//磁盘i节点住id unsignedintdi_size;//大小 unsignedintdi_addr[NADDR];//物理块号};

温馨提示

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

评论

0/150

提交评论