操作系统课程设计实验报告.docx
- 文档编号:11726388
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:13
- 大小:26.46KB
操作系统课程设计实验报告.docx
《操作系统课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统课程设计实验报告
操作系统课程设计实验报告
二00九级计算机三班
学号:
姓名:
指导老师:
时间:
2012.02.20--2012.03.01
目录
一、任务内容及进度安排
1.任务内容……………………………2
2.进度安排……………………………5
2、实现任务及其问题分析
任务一…………………………………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应当具有以下特征:
BatchProcessing如果shell启动带有一个文件名作为参数,打开该文件并执行文件里所有命令。
待所有进程全部结束退出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
.....
Iamthread1
Iamthread1
.....
Iamthread1
Iamthread3
.....
Iamthread3
Iamthread2
.....
Iamthread2
Iamthread3
.....
Iamthread3
Iamthread2
任务四文件内容的并行搜索
在阅读大型项目代码时,经常要搜索某个标识符,找出该标识符的声明、定义或引用的地方(某文件的哪一行)。
本任务要求实现一个程序idfind,其使用格式如下:
idfind[-jn]iddirname
选项-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_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;i<10;i++)
{
printf("Iamprocess1\n");
fflush(stdout);
sleep
(1);
}
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex2);
returnNULL;
}
void*thread2(void*arg)
{
inti,j;
pthread_mutex_lock(&mutex1);
for(i=0;i<10;i++)
{
printf("Iamprocess2\n");
fflush(stdout);
sleep
(1);
}
pthread_mutex_unlock(&mutex1);
pthread_mutex_unlock(&mutex3);
pthread_mutex_unlock(&mutex4);
returnNULL;
}
void*thread3(void*arg)
{
inti,j;
pthread_mutex_lock(&mutex2);
for(i=0;i<30;i++)
{
printf("Iamprocess3\n");
fflush(stdout);
sleep
(1);
}
pthread_mutex_unlock(&mutex2);
pthread_mutex_unlock(&mutex5);
returnNULL;
}
void*thread4(void*arg)
{
inti,j;
pthread_mutex_lock(&mutex3);
for(i=0;i<40;i++)
{
printf("Iamprocess4\n");
fflush(stdout);
sleep
(1);
}
pthread_mutex_unlock(&mutex3);
pthread_mutex_unlock(&mutex7);
returnNULL;
}
void*thread5(void*arg)
{
inti,j;
pthread_mutex_lock(&mutex4);
pthread_mutex_lock(&mutex5);
for(i=0;i<20;i++)
{
printf("Iamprocess5\n");
fflush(stdout);
sleep
(1);
}
pthread_mutex_unlock(&mutex4);
pthread_mutex_unlock(&mutex5);
pthread_mutex_unlock(&mutex6);void*thread6(void*arg)
{
inti,j;
pthread_mutex_lock(&mutex6);
pthread_mutex_lock(&mutex7);
for(i=0;i<5;i++)
{
printf("Iamprocess6\n");
fflush(stdout);
sleep
(1);
}
pthread_mutex_unlock(&mutex6);
pthread_mutex_unlock(&mutex7);
returnNULL;
}
intmain(void)
{
pthread_tmythread1,mythread2,mythread3,mythread4,mythread5,mythread6;
inti;
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(pthread_create(&mythread1,NULL,thread1,NULL))
{printf("error:
111111111111111\n");
abort();
}
}
if(2==i)
{
if(pthread_create(&mythread2,NULL,thread2,NULL))
{printf("error:
22222222222222222\n");
abort();
}
}
returnNULL;
}
if(3==i)
{
if(pthread_create(&mythread3,NULL,thread3,NULL))
{printf("error:
13333333333333333\n");
abort();
}
}
if(4==i)
{
if(pthread_create(&mythread4,NULL,thread4,NULL))
{printf("er4444444444444441\n");
abort();
}
}
if(5==i)
{
if(pthread_create(&mythread5,NULL,thread5,NULL))
{printf("error:
6666666666666666\n");
abort();
}
}
if(6==i)
{
if(pthread_create(&mythread6,NULL,thread6,NULL))
{printf("error:
666666666666666\n");
abort();
}
}
}
if(pthread_join(mythread6,NULL))
{
printf("6666666666666666666\n");
abort();
}
exit(0);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 实验 报告