操作系统课程设计实验报告.doc

上传人:laozhun 文档编号:2888462 上传时间:2023-03-01 格式:DOC 页数:19 大小:42KB
返回 下载 相关 举报
操作系统课程设计实验报告.doc_第1页
第1页 / 共19页
操作系统课程设计实验报告.doc_第2页
第2页 / 共19页
操作系统课程设计实验报告.doc_第3页
第3页 / 共19页
操作系统课程设计实验报告.doc_第4页
第4页 / 共19页
操作系统课程设计实验报告.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《操作系统课程设计实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计实验报告.doc(19页珍藏版)》请在三一办公上搜索。

1、操作系统课程设计实验报告 二00九级计算机三班 学 号:0905010322 姓 名: 指导老师: 时 间:2012.02.20-2012.03.01目 录一、任务内容及进度安排1. 任务内容2 2. 进度安排5二、 实现任务及其问题分析任务一7任务二8任务三9任务四9三、心得体会10四、附录11一、任务内容及进度安排1. 任务内容 任务一 I/O系统调用开销比较 在LINUX平台用C编程逆序一个文本文件,注意显示逆转结果的必须是原文件名。如文件原内容为“abcd”,处理后内容应为“dcba”。请分别使用三种方法 (1)标准C的I/O库函数:fopen、fread和fwrite (2)Unix

2、的I/O函数:open、read 和write (3)open和mmap要求尽量考虑效率,比较三种方法的性能。 任务二 实现一个简单的shell 实现一个简单的shell(命令行解释器),类似于sh,bash,csh等。你的shell 必须支持以下内部命令 cd 更改当前的工作目录到另一个。如果未指定,输出当前工作目录。如果不存在,应当有适当的错误信息提示。这个命令应该也能改变PWD的环境变量。 environ 列出所有环境变量字符串的设置(类似于Unix系统下的env命令)。 echo 显示echo后的内容且换行 help 简短概要的输出你的shell的使用方法和基本功能。 jobs 输出s

3、hell当前的一系列子进程,必须提供子进程的命名和PID号。 quit,exit,bye退出shell。 所有的内部命令应当优先于在$PATH中同名的程序。 任何非内部命令必须请求shell创建一个新进程,且该子进程执行指定的程序。这个新进程必须继承shell的环境变量和指定的命令行参数。 Shell应当具有以下特征: Batch Processing 如果shell启动带有一个文件名作为参数,打开该文件并执行文件里所有命令。待所有进程全部结束退出shell。该功能类似于shell的交互模式。 Debugging 提供-v选项,shell启动时打开此选项将在运行过程中输出若干调试信息。在该种模

4、式下,shell应该显示所有被创建了的进程的PID号,通报已结束的子进程和传递给子进程的参数等。 Prompt(命令行提示符) 解释器应该打印$PS2(而不是$PS1)作为提示符。 Background processing 如果命令以符号&终止,在后台并发执行该程序。shell立即等待下一命令行的输入,而不等待该程序的结束。 任务三 进程/线程同步 编程实现下图的效果,要求分别使用进程和线程 (1)进程SYS V信号量 (2)线程实现+Posix同步操作APIP1P2P3P4P5P6 无论进程形式还是线程形式,进程/线程pi的主体反复输出下面语句: I am process(or threa

5、d) 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 任务四 文件内容的并行搜索 在阅读大型项目代码时,经常要搜索某个标识符,找出该标识符的声明、定义

6、或引用的地方(某文件的哪一行)。本任务要求实现一个程序idfind,其使用格式如下: idfind -j n id dirname 选项 -j 指定并行线程数目。如果省略该选项,则只启动一个线程。 id表示要查找的标识符,dirname表示项目所在目录。 任务五 实现一个malloc/free 实现一个malloc/free,必须按讲义指出的方案(注意,因为网上有一些现成的版本,凡未按讲义方案实现者均无效)设计测试实例,并与libc的malloc实现进行性能比较。选做,分析你正在使用的libc下malloc的实现。请参考下面的材料注意其如何保证性能。 任务六 利用元数据操作ext2文件系统 1

7、.了解并熟悉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.

8、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.2

9、9): 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()函数的使用出现问题,字符串在重

10、新逆序后没有添加结束符。 3. 对汉字文件操作后,文件全部为乱码 分析:不同的编译器中对汉字的大小定义不同,修改每次读取的字节数,问题解决。 4. 解决中间文件,实现文件逆序,程序执行后无变化 分析:文件的打开方式不正确,导致无法写入文件,修改打开方式后,文件操作成功。 任务二 实现一个简单的shell 实现的功能: 1. 内部命令cd功能 2. 内部命令echo功能 3. 内部命令environ功能 4. 内部命令help功能 5. 内部命令jobs功能 6. 内部命令退出功能 7. 解释器应该打印$PS2作为提示符。 8. 命令以符号&终止,在后台并发执行该程序。shell立即等待下一命令

11、行的输入,而不等待该程序的结束。 问题分析: 1. cd功能实现过程中,无法确定路径改变时候成功 问题分析:模仿linux的shell模式,在命令提示符中调用环境变量,打印当前的路径。 2. Echo命令执行之后会,在字符串的最后会出现n符号 问题分析:检查程序语句后,发现在命令解析时,字符串结束符的添加位置出现偏差,忽略了被读取的换行符号。 3. 实现jobs功能时,无法调用系统程序,而自己实现时又无法操作 问题分析:设置结构体数字,存储子进程的名称、ID号、及状态。ID号在父进程返回时获取并保存,状态通过fork()返回的次数来确定。2. 在解析命令时,当命令中参数比较多多时,解析代码会出

12、现错误。 任务三 进程/线程同步 实现的功能: 1. 线程的同步 2. 进程的同步 问题分析: 1. 子进程在信号量为0的状态下,没有阻塞,依然执行。 问题分析:函数的参数设置问题,修改函数参数设置。 2. 无法创建信号量或创建后无法初始化为0 问题分析:信号量创建函数的参数设置问题,在最后的参数添加一个参数0666,问题解决。 3. 进程并发一定后,程序死锁 问题分析:在程序中发现在同一进程代码中两次申请了 同一资源,导致死锁。 4. 进程无法出现较为理想的并发状态 问题分析:在各个进程的打印次数设置方面不合理,修改各个子进程的打印次数,使其能产生理想的状态。 5. 进程4和进程3仅仅发生一

13、次并发,后来一直等待进程3结束后,进程4又开始执行。 问题分析:进程4释放资源后,进程5占据,等待资源3,从而导致进程5和进程4竞争资源2,导致进程4无法执行,增加进程2的资源数后问题解决。 任务四 文件内容的并行搜索 任务四的并行搜索实现的比较少,仅仅通过多种渠道了解了如何进行操作,但是后面没有多余的时间进行编写。三、 心得体会 在此次操作系统课程设计中,对于专业方面的知识又有了更多的了解,同时也接触到了一个全新的程序设计平台。 此次课程设计的操作平台是linux操作系统,在此之前,自己对linux并没有太多的了解。通过此次课程设计,自己对linux系统及基于linux核心的程序设计有了个更

14、多的了解,同时也体会到linux平台下编译工具的方便及强大,同时也深刻体验了开源的操作系统对于一个计算机从业者的重要性。通过linux下的c编程,自己又找到了一个新的编程方向。 此外,此次课程设计的前两个任务的意义没有特别的体现,基本是利用编程的知识来实现一个具有特定功能的程序或者系统,没有感到太多的不同。然而,第三个实验的同步却让我感觉到了有一中不一样的感觉。通过自己编程实践,体会到了多线程、多进程同步的机理,对于进程、线程同步有了更深刻的了解,确实感觉到了多进程多线程的优越及有趣之处,使我自己对进程和线程同步有了更大的兴趣。 后面的三个任务可能具有更大的意义,但是由于自己在前面的实验花费了

15、太多的时间的,导致后面没有时间继续完成。现在看来感觉前面的任务其实没什么,但是实际做起来,却没有那么高的效率,也使我认识到自己的不足及努力的方向。附录:线程并发:#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 = PTHRE

16、AD_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(&mut

17、ex1); 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(vo

18、id *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(

19、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_unl

20、ock(&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

21、 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 )

22、if( pthread_create(&mythread1,NULL,thread1,NULL) ) printf(error:111111111111111n); abort(); if( 2 = i ) if( pthread_create(&mythread2,NULL,thread2,NULL) ) printf(error:22222222222222222n); abort(); return NULL; if( 3 = i ) if( pthread_create(&mythread3,NULL,thread3,NULL) ) printf(error:1333333333333

23、3333n); abort(); if( 4 = i ) if( pthread_create(&mythread4,NULL,thread4,NULL) ) printf(er4444444444444441n); abort(); if( 5 = i ) if( pthread_create(&mythread5,NULL,thread5,NULL) ) printf(error:6666666666666666n); abort(); if( 6 = i ) if( pthread_create(&mythread6,NULL,thread6,NULL) ) printf(error:666666666666666n); abort(); if(pthread_join(mythread6,NULL) printf(6666666666666666666n); abort(); exit(0);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号