操作系统课程设计实验报告.doc_第1页
操作系统课程设计实验报告.doc_第2页
操作系统课程设计实验报告.doc_第3页
操作系统课程设计实验报告.doc_第4页
操作系统课程设计实验报告.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

操作系统课程设计实验报告 二00九级计算机三班 学 号:0905010322 姓 名: 指导老师: 时 间:2012.02.20-2012.03.01目 录一、任务内容及进度安排1. 任务内容2 2. 进度安排52、 实现任务及其问题分析任务一7任务二8任务三9任务四9三、心得体会10四、附录11一、任务内容及进度安排1. 任务内容 任务一 i/o系统调用开销比较 在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应当具有以下特征: batch processing 如果shell启动带有一个文件名作为参数,打开该文件并执行文件里所有命令。待所有进程全部结束退出shell。该功能类似于shell的交互模式。 debugging 提供-v选项,shell启动时打开此选项将在运行过程中输出若干调试信息。在该种模式下,shell应该显示所有被创建了的进程的pid号,通报已结束的子进程和传递给子进程的参数等。 prompt(命令行提示符) 解释器应该打印$ps2(而不是$ps1)作为提示符。 background processing 如果命令以符号&终止,在后台并发执行该程序。shell立即等待下一命令行的输入,而不等待该程序的结束。 任务三 进程/线程同步 编程实现下图的效果,要求分别使用进程和线程 (1)进程sys v信号量 (2)线程实现+posix同步操作apip1p2p3p4p5p6 无论进程形式还是线程形式,进程/线程pi的主体反复输出下面语句: i am process(or thread) pi 执行次数取必须保证进程并发情况的发生(比如p3和p4的交迭运行),大家自行调整。必须保证parbegin(p1(), p2(), , p6()并发形式的充分发生, 一个典型的输出系列如下: i am thread 1 .i am thread 1 i am thread 1.i am thread 1i am thread 3.i am thread 3i am thread 2.i am thread 2i am thread 3.i am thread 3i am thread 2 任务四 文件内容的并行搜索 在阅读大型项目代码时,经常要搜索某个标识符,找出该标识符的声明、定义或引用的地方(某文件的哪一行)。本任务要求实现一个程序idfind,其使用格式如下: idfind -j n id dirname 选项 -j 指定并行线程数目。如果省略该选项,则只启动一个线程。 id表示要查找的标识符,dirname表示项目所在目录。 任务五 实现一个malloc/free 实现一个malloc/free,必须按讲义指出的方案(注意,因为网上有一些现成的版本,凡未按讲义方案实现者均无效)设计测试实例,并与libc的malloc实现进行性能比较。选做,分析你正在使用的libc下malloc的实现。请参考下面的材料注意其如何保证性能。 任务六 利用元数据操作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命令2) 实现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):1)完成实验六的代码2) 测试实验六的功能二、实现任务及其问题分析 任务一 i/o系统调用开销比较 实现的功能: 1.生成制定大小的文件 2. 利用c实现文件内容的逆序 3. 利用unix函数实现文件内容的逆序 4. 利用mmap函数实现文件内容的逆序 5. 按照要求跟踪实现性能比较 问题分析: 1. 文件读取后出现乱码 分析:fread()函数的使用出现问题,重新修改后问题解决。 2. 文件逆序后无法打开 分析:fwrite()函数的使用出现问题,字符串在重新逆序后没有添加结束符。 3. 对汉字文件操作后,文件全部为乱码 分析:不同的编译器中对汉字的大小定义不同,修改每次读取的字节数,问题解决。 4. 解决中间文件,实现文件逆序,程序执行后无变化 分析:文件的打开方式不正确,导致无法写入文件,修改打开方式后,文件操作成功。 任务二 实现一个简单的shell 实现的功能: 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. 在解析命令时,当命令中参数比较多多时,解析代码会出现错误。 任务三 进程/线程同步 实现的功能: 1. 线程的同步 2. 进程的同步 问题分析: 1. 子进程在信号量为0的状态下,没有阻塞,依然执行。 问题分析:函数的参数设置问题,修改函数参数设置。 2. 无法创建信号量或创建后无法初始化为0 问题分析:信号量创建函数的参数设置问题,在最后的参数添加一个参数0666,问题解决。 3. 进程并发一定后,程序死锁 问题分析:在程序中发现在同一进程代码中两次申请了 同一资源,导致死锁。 4. 进程无法出现较为理想的并发状态 问题分析:在各个进程的打印次数设置方面不合理,修改各个子进程的打印次数,使其能产生理想的状态。 5. 进程4和进程3仅仅发生一次并发,后来一直等待进程3结束后,进程4又开始执行。 问题分析:进程4释放资源后,进程5占据,等待资源3,从而导致进程5和进程4竞争资源2,导致进程4无法执行,增加进程2的资源数后问题解决。 任务四 文件内容的并行搜索 任务四的并行搜索实现的比较少,仅仅通过多种渠道了解了如何进行操作,但是后面没有多余的时间进行编写。3、 心得体会 在此次操作系统课程设计中,对于专业方面的知识又有了更多的了解,同时也接触到了一个全新的程序设计平台。 此次课程设计的操作平台是linux操作系统,在此之前,自己对linux并没有太多的了解。通过此次课程设计,自己对linux系统及基于linux核心的程序设计有了个更多的了解,同时也体会到linux平台下编译工具的方便及强大,同时也深刻体验了开源的操作系统对于一个计算机从业者的重要性。通过linux下的c编程,自己又找到了一个新的编程方向。 此外,此次课程设计的前两个任务的意义没有特别的体现,基本是利用编程的知识来实现一个具有特定功能的程序或者系统,没有感到太多的不同。然而,第三个实验的同步却让我感觉到了有一中不一样的感觉。通过自己编程实践,体会到了多线程、多进程同步的机理,对于进程、线程同步有了更深刻的了解,确实感觉到了多进程多线程的优越及有趣之处,使我自己对进程和线程同步有了更大的兴趣。 后面的三个任务可能具有更大的意义,但是由于自己在前面的实验花费了太多的时间的,导致后面没有时间继续完成。现在看来感觉前面的任务其实没什么,但是实际做起来,却没有那么高的效率,也使我认识到自己的不足及努力的方向。附录:线程并发:#include #include #include #include pthread_mutex_t mutex1 = pthread_mutex_initializer;pthread_mutex_t mutex2 = pthread_mutex_initializer;pthread_mutex_t mutex3 = pthread_mutex_initializer;pthread_mutex_t mutex4 = pthread_mutex_initializer;pthread_mutex_t mutex5 = pthread_mutex_initializer;pthread_mutex_t mutex6 = pthread_mutex_initializer;pthread_mutex_t mutex7 = pthread_mutex_initializer;void *thread1(void *arg) int i,j; for(i=0;i10;i+) printf(i am process 1n); fflush(stdout); sleep(1); pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex2); return null;void *thread2(void *arg) int i,j; pthread_mutex_lock(&mutex1); for(i=0;i10;i+) printf(i am process 2n); fflush(stdout); sleep(1); pthread_mutex_unlock(&mutex1); pthread_mutex_unlock(&mutex3); pthread_mutex_unlock(&mutex4); return null;void *thread3(void *arg) int i,j; pthread_mutex_lock(&mutex2); for(i=0;i30;i+) printf(i am process 3n); fflush(stdout); sleep(1); pthread_mutex_unlock(&mutex2); pthread_mutex_unlock(&mutex5); return null; void *thread4(void *arg) int i,j; pthread_mutex_lock(&mutex3); for(i=0;i40;i+) printf(i am process 4n); fflush(stdout); sleep(1); pthread_mutex_unlock(&mutex3); pthread_mutex_unlock(&mutex7); return null;void *thread5(void *arg) int i,j; pthread_mutex_lock(&mutex4); pthread_mutex_lock(&mutex5); for(i=0;i20;i+) printf(i am process 5n); fflush(stdout); sleep(1); pthread_mutex_unlock(&mutex4); pthread_mutex_unlock(&mutex5); pthread_mutex_unlock(&mutex6);void *thread6(void *arg) int i,j; pthread_mutex_lock(&mutex6); pthread_mutex_lock(&mutex7); for(i=0;i5;i+) printf(i am process 6n); fflush(stdout); sleep(1); pthread_mutex_unlock(&mutex6); pthread_mutex_unlock(&mutex7); return null;int main(void) pthread_t mythread1,mythread2,mythread3,mythread4,mythread5,mythread6; int i; pthread_mutex_lock(&mutex1); pthread_mutex_lock(&mutex2); pthread_mutex_lock(&mutex3); pthread_mutex_lock(&mutex4); pthread_mutex_lock(&mutex5); pthread_mutex_lock(&mutex6); pthread_mutex_lock(&mutex7); for(i=1;i=6;i+) if( 1 = i ) if( pthre

温馨提示

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

评论

0/150

提交评论