您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统课程设计实验报告
操作系统课程设计实验报告二00九级计算机三班学号:0905010322姓名:指导老师:时间:2012.02.20--2012.03.01目录1一、任务内容及进度安排1.任务内容……………………………22.进度安排……………………………5二、实现任务及其问题分析任务一…………………………………7任务二…………………………………8任务三…………………………………9任务四…………………………………9三、心得体会………………………………10四、附录……………………………………11一、任务内容及进度安排1.任务内容任务一I/O系统调用开销比较2在LINUX平台用C编程逆序一个文本文件,注意显示逆转结果的必须是原文件名。如文件原内容为“abcd”,处理后内容应为“dcba”。请分别使用三种方法(1)标准C的I/O库函数:fopen、fread和fwrite(2)Unix的I/O函数:open、read和write(3)open和mmap要求尽量考虑效率,比较三种方法的性能。任务二实现一个简单的shell实现一个简单的shell(命令行解释器),类似于sh,bash,csh等。你的shell必须支持以下内部命令cd目录更改当前的工作目录到另一个目录。如果目录未指定,输出当前工作目录。如果目录不存在,应当有适当的错误信息提示。这个命令应该也能改变PWD的环境变量。environ列出所有环境变量字符串的设置(类似于Unix系统下的env命令)。echo内容显示echo后的内容且换行help简短概要的输出你的shell的使用方法和基本功能。jobs输出shell当前的一系列子进程,必须提供子进程的命名和PID号。quit,exit,bye退出shell。所有的内部命令应当优先于在$PATH中同名的程序。任何非内部命令必须请求shell创建一个新进程,且该子进程执行指定的程序。这个新进程必须继承shell的环境变量和指定的命令行参数。Shell应当具有以下特征:BatchProcessing如果shell启动带有一个文件名作为参数,打开该文3件并执行文件里所有命令。待所有进程全部结束退出shell。该功能类似于shell的交互模式。Debugging提供-v选项,shell启动时打开此选项将在运行过程中输出若干调试信息。在该种模式下,shell应该显示所有被创建了的进程的PID号,通报已结束的子进程和传递给子进程的参数等。Prompt(命令行提示符)解释器应该打印$PS2(而不是$PS1)作为提示符。Backgroundprocessing如果命令以符号&终止,在后台并发执行该程序。shell立即等待下一命令行的输入,而不等待该程序的结束。任务三进程/线程同步编程实现下图的效果,要求分别使用进程和线程(1)进程+SYSV信号量(2)线程实现+Posix同步操作API无论进程形式还是线程形式,进程/线程pi的主体反复输出下面语句:Iamprocess(orthread)pi执行次数取必须保证进程并发情况的发生(比如p3和p4的交迭运行),大家自行调整。必须保证parbegin(p1(),p2(),……,p6())并发形式的充分发生,一个典型的输出系列如下:Iamthread1.....Iamthread1Iamthread1P1P2P3P4P5P64.....Iamthread1Iamthread3.....Iamthread3Iamthread2.....Iamthread2Iamthread3.....Iamthread3Iamthread2任务四文件内容的并行搜索在阅读大型项目代码时,经常要搜索某个标识符,找出该标识符的声明、定义或引用的地方(某文件的哪一行)。本任务要求实现一个程序idfind,其使用格式如下:idfind[-jn]iddirname选项-j指定并行线程数目。如果省略该选项,则只启动一个线程。id表示要查找的标识符,dirname表示项目所在目录。任务五实现一个malloc/free实现一个malloc/free,必须按讲义指出的方案(注意,因为网上有一些现成的版本,凡未按讲义方案实现者均无效)设计测试实例,并与libc的malloc实现进行性能比较。选做,分析你正在使用的libc下malloc的实现。5请参考下面的材料注意其如何保证性能。任务六利用元数据操作ext2文件系统1.了解并熟悉EX2文件系统的组织结构。2.编制一个文件系统浏览器,该浏览器类似shell,但只能对一个ext2文件系统执行以下操作:a)cd:改变用户当前工作目录。假定初始目录为ext2文件系统的根目录。b)ls:列出用户当前目录的所有文件,每项输出格式包括:文件的权限,文件大小,修改时间和文件名。c)cat:输出一个文件的内容。d)exit:退出该程序这几个命令都比shell类似的命令要简单一些。2.进度安排周二(2012.02.21):1)编写生成制定大小的文件的程序2)编写标准C的I/O操作程序3)编写Unix的I/0操作程序周三(2012.02.22):1)编写mmap的I/0操作程序2)测试三种不同方法的性能3)熟悉了解shell的相关机理周四(2012.02.23):1)实现cd命令62)实现environ命令3)实现echo命令4)实现help命令周五(2012.02.24):1)实现jobs命令2)实习退出命令3)实现命令提示符特征4)实现后台运行特征周一(2012.02.27):1)实现外部命令调用功能2)测试shell,检测时候达到要求3)编写任务三的进程同步4)编写任务三的县线程同步周二(2012.02.28):1)文件的搜索的单进程实现2)文件搜索的多进程实现周三(2012.02.29):1)实现任务五周四(2012.03.01):1)测试修改任务五代码2)完成实验六的部分代码周五(2012.03.02):71)完成实验六的代码2)测试实验六的功能二、实现任务及其问题分析任务一I/O系统调用开销比较实现的功能:1.生成制定大小的文件2.利用C实现文件内容的逆序3.利用unix函数实现文件内容的逆序4.利用mmap函数实现文件内容的逆序5.按照要求跟踪实现性能比较问题分析:1.文件读取后出现乱码分析:fread()函数的使用出现问题,重新修改后问题解决。2.文件逆序后无法打开分析:fwrite()函数的使用出现问题,字符串在重新逆序后没有添加结束符。3.对汉字文件操作后,文件全部为乱码分析:不同的编译器中对汉字的大小定义不同,修改每次读取的字节数,问题解决。4.解决中间文件,实现文件逆序,程序执行后无变化分析:文件的打开方式不正确,导致无法写入文件,修改打开方式后,文件操作成功。任务二实现一个简单的shell8实现的功能:1.内部命令cd功能2.内部命令echo功能3.内部命令environ功能4.内部命令help功能5.内部命令jobs功能6.内部命令退出功能7.解释器应该打印$PS2作为提示符。8.命令以符号&终止,在后台并发执行该程序。shell立即等待下一命令行的输入,而不等待该程序的结束。问题分析:1.cd功能实现过程中,无法确定路径改变时候成功问题分析:模仿linux的shell模式,在命令提示符中调用环境变量,打印当前的路径。2.Echo命令执行之后会,在字符串的最后会出现'\n'符号问题分析:检查程序语句后,发现在命令解析时,字符串结束符的添加位置出现偏差,忽略了被读取的换行符号。3.实现jobs功能时,无法调用系统程序,而自己实现时又无法操作问题分析:设置结构体数字,存储子进程的名称、ID号、及状态。ID号在父进程返回时获取并保存,状态通过fork()返回的次数来确定。2.在解析命令时,当命令中参数比较多多时,解析代码会出现错误。任务三进程/线程同步实现的功能:91.线程的同步2.进程的同步问题分析:1.子进程在信号量为0的状态下,没有阻塞,依然执行。问题分析:函数的参数设置问题,修改函数参数设置。2.无法创建信号量或创建后无法初始化为0问题分析:信号量创建函数的参数设置问题,在最后的参数添加一个参数0666,问题解决。3.进程并发一定后,程序死锁问题分析:在程序中发现在同一进程代码中两次申请了同一资源,导致死锁。4.进程无法出现较为理想的并发状态问题分析:在各个进程的打印次数设置方面不合理,修改各个子进程的打印次数,使其能产生理想的状态。5.进程4和进程3仅仅发生一次并发,后来一直等待进程3结束后,进程4又开始执行。问题分析:进程4释放资源后,进程5占据,等待资源3,从而导致进程5和进程4竞争资源2,导致进程4无法执行,增加进程2的资源数后问题解决。任务四文件内容的并行搜索任务四的并行搜索实现的比较少,仅仅通过多种渠道了解了如何进行操作,但是后面没有多余的时间进行编写。三、心得体会在此次操作系统课程设计中,对于专业方面的知识又有了更多的了解,同时也接触到了一个全新的程序设计平台。10此次课程设计的操作平台是linux操作系统,在此之前,自己对linux并没有太多的了解。通过此次课程设计,自己对linux系统及基于linux核心的程序设计有了个更多的了解,同时也体会到linux平台下编译工具的方便及强大,同时也深刻体验了开源的操作系统对于一个计算机从业者的重要性。通过linux下的c编程,自己又找到了一个新的编程方向。此外,此次课程设计的前两个任务的意义没有特别的体现,基本是利用编程的知识来实现一个具有特定功能的程序或者系统,没有感到太多的不同。然而,第三个实验的同步却让我感觉到了有一中不一样的感觉。通过自己编程实践,体会到了多线程、多进程同步的机理,对于进程、线程同步有了更深刻的了解,确实感觉到了多进程多线程的优越及有趣之处,使我自己对进程和线程同步有了更大的兴趣。后面的三个任务可能具有更大的意义,但是由于自己在前面的实验花费了太多的时间的,导致后面没有时间继续完成。现在看来感觉前面的任务其实没什么,但是实际做起来,却没有那么高的效率,也使我认识到自己的不足及努力的方向。附录:线程并发:#includestdio.h#includepthread.h11#includestdlib.h#includeunistd.hpthread_mutex_tmutex1=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex2=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex3=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex4=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex5=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex6=PTHREAD_MUTEX_INITIALIZER;pthread_mutex_tmutex7=PTHREAD_MUTEX_INITIALIZER;void*thread1(void*arg){inti,j;for(i=0;i10;i++){printf(Iamprocess1\n);fflush(stdout);sleep(1);}pthread_mutex_unlock(&mutex1);pthread_mutex_unlock(&mutex2);returnNULL;}void*thread2(void*arg){12inti,j;pthread_mutex_lock(&mutex1);for(i=0;i10;i++){printf(Iamprocess2\n);fflush(stdout);sleep(1);}pthread_mutex_unlock(&mutex1);pthread_mutex_unlock(&mutex3);pthread_mutex_unlock(&mutex4);returnNULL;}void*t
本文标题:操作系统课程设计实验报告
链接地址:https://www.777doc.com/doc-6139957 .html