操作系统实验报告材料31869.docx
- 文档编号:8740759
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:22
- 大小:562.08KB
操作系统实验报告材料31869.docx
《操作系统实验报告材料31869.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告材料31869.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统实验报告材料31869
操作系统课程设计实验报告
2015年1月9日成绩:
姓名
沈XX
夏XX
江XX
学号
13055805
13055807
13055816
班级
13052314
专业
计算机科学与技术
课程名称
操作系统课程设计
任课老师
赵伟华
指导老师
赵伟华
实验序号
1
实验名称
进程调度管理
实验时间
15年10月
实验地点
1教南1楼
一、题目说明
(1)用C语言完成线程的创建和撤消,并按先来先服务方式对多个线程进行调度。
(2)将线程调度算法修改为时间片轮转算法,实现时间片轮转调度。
(也可以结合优先权,实现优先权加时间片轮转算法的线程调度。
)
(3)改变时间片的大小,观察结果的变化。
思考:
为什么时间片不能太小或太大。
(4)假设两个线程共用同一软件资源(如某一变量,或某一数据结构),请用记录型信号量来实现对它的互斥访问。
(5)假设有两个线程共享一个可存放5个整数的缓冲,其中一个线程不停地计算1至50的平方,并将结果放入缓冲中,另一个线程不断地从缓冲中取出结果,并将它们打印出来,请用记录型信号量实现这一生产者和消费者的同步问题。
(6)实现消息缓冲通信,并与4、5中的简单通信进行比较。
(7)思考:
在线程间进行消息缓冲通信时,若对消息队列的访问没有满足互斥要求,情况将会怎样?
二、设计方案(系统框架)
该程序主要是分5大块内容:
(1)线程的创建和撤销,
(2)线程的调度,
(3)线程的同步与互斥,
(4)线程的阻塞与唤醒,
(5)利用消息缓冲队列的线程间的通信。
由这五大块功能来完成的基于DOS的多任务系统的实现。
在这个系统中,首先先由main函数进行一些初始化工作,然后直接创建0#线程对应于main函数,再由0#线程调用create创建1#,2#线程分别对应与函数f1(),f2(),最后将系统的中断服务程序设置为new_int8,并把控制交给1#线程,启动多个线程的并发执行。
0#线程是一个比较特殊的线程,它在创建的时候没有使用create来创建,而是在系统初始化后直接创建的,因它对应的程序段为main函数中的一段,所以也直接使用整个系统的堆栈,而不再创建时为私有堆栈分配额外的空间;同样,撤销的时也不需要释放私有堆栈的空间,所以也没有over()函数而是直接撤销,从这方面来看,它是一个系统线程。
此外,在启动多个线程并发执行过程后,0#线程将系统控制权转交出去,直至系统中其他进程都不具备执行条件时,它才有可能重新得到CPU,从这方面看,0#线程相当于是一个空转线程,最后,0#线程还担负着一个特别的使命:
等待系统中所有其他的线程的完成,此时,它将直接撤销自己并恢复原来的时钟中断服务程序,从此终止整个多任务系统。
三、程序流程图
四、实验结果(程序截图)
主界面
先进先出效果
实现线程的并发执行,可设置时间片大小
实现线程对同一资源的互斥访问
实现生产者和消费者同步问题
实现消息缓冲通信
五、思考与探索
(1)为什么时间片不能太小或太大
答:
设置过长的时间片会导致结果和进程在一个时间片内完成任务,从而先进先出算法的效果一样,失去时间片的意,义。
设置过短会导致进程切换频繁,CPU的效率降低
(2)引起调度的原因有哪些?
答:
引起CPU调度的主要原因有:
时间片到时、线程执行完毕或正在执行的线程因等待某事件发生而不能继续执行。
(3)处理中断时控制转移情况
答:
当中断发生时,系统首先将标志寄存器Flags的值压入堆栈,然后将装有被中断程序下一条指令地址的CS和IP寄存器的内容也分别压入堆栈,再从中断向量中获取中断服务程序的入口地址并将它们装入CS和IP寄存器,这样,控制就从被中断的程序转向中断服务程序。
中断返回时,系统自动从栈顶弹出返址1的偏移、返址1的段址和Flags并送到IP、CS和Flags寄存器中,CPU就开始继续从断点处执行被中断程序。
(4)为什么创建的时候,线程的DS和ES都是一样的
答:
因为线程共用进程的数据段。
(5)函数调度时控制转移情况
答:
在执行函数调用指令时,系统会自动地先将主调函数的下一条指令的地址(在CS:
IP中)压入堆栈,然后把被调函数的入口地址装入CS和IP寄存器(段内函数调用只需压入和装配IP),控制就从主调函数转向被调函数;当执行函数返回指令时,系统将当前堆栈的栈顶的两个字(主调函数下一条指令的地址)弹出并送到IP和CS中(段内函数返回只需弹出一个字送到IP中),控制就从被调函数返回到主调函数。
(6)new_int8(void)函数的作用,以及怎样让它自动地定期地运行
答:
该函数要完成的主要工作包括:
首先执行老的时钟中断处理程序的功能;然后判断当前线程的时间片是否到了,如果到了,且DOS不忙,则保存当前线程的运行环境,重新选择一个新的就绪线程,恢复其运行现场,使其在CPU上参加运行。
由于该函数必须是自动地定期地运行,所以我们通过截取时钟中断(int08)来完成。
在PC机上,有一个定时器,每当它发一个时钟信号时(一般情况下,它每秒发出18.2个信号,除非是对产生该中断的定时器芯片重新编程),系统就进入时钟中断处理程序(INT8)来完成系统计时、调用INT1CH、关闭磁盘马达等工作。
实验序号
2
实验名称
linux进程管理
实验时间
15年12月
实验地点
1教南1楼
一、题目说明
1.熟悉linux的命令接口。
2.通过对linux进程控制的相关系统调用的编程应用,进一步加深对进程概念的理解,明确进程和程序的联系和区别,理解进程并发执行的具体含义。
3.通过Linux管道通信机制、消息队列通信机制、共享内存通信机制的使用,加深对不同类型的进程通信方式的理解。
4.通过对linux的Posix信号量的应用,加深对信号量同步机制的理解。
二、设计方案(系统框架)
1.Shell部分
要求:
编写三个不同的程序cmd1.c,cmd2.c,cmd3.c,每个程序输出一句话,分别编译成可执行文件cmd1,cmd2,cmd3。
然后再编写一个程序,模拟shell程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程结束,然后再等待接收下一条命令。
如果接收到的命令为exit,则父进程结束;如果接收到的命令是无效命令,则显示“Commandnotfound”,继续等待。
新建三个不同的程序cmd1,cmd2,cmd3
然后编译成可执行文件cmd1,cmd2,cmd3
之后编写程序my_shell.c通过读取shell命令调用在使用ifelse语句判断识别并分别通过fork()创建子线程,子线程中采用execl(constchar*path,constchar*arg,…);执行先前编译完成的可执行文件。
2.由父进程创建一个管道,然后再创建2个子进程,并由这两个兄弟进程利用管道进行进程通信:
子进程1使用管道的写端,子进程2使用管道的读端。
通信的具体内容可根据自己的需要随意设计,要求能试验阻塞型读写过程中的各种情况。
运行程序,观察各种情况下,进程实际读写的字节数以及进程阻塞唤醒的情况。
3编写程序创建两个线程:
sender线程和receive线程,其中sender线程运行函数sender(),它创建一个消息队列,然后,循环等待用户通过终端输入一串字符,将这串字符通过消息队列发送给receiver线程,直到用户输入“exit”为止;最后,它向receiver线程发送消息“end”,并且等待receiver的应答,等到应答消息后,将接收到的应答信息显示在终端屏幕上,删除相关消息队列,结束程序的运行。
Receiver线程运行receive(),它通过消息队列接收来自sender的消息,将消息显示在终端屏幕上,直至收到内容为“end”的消息为止,此时,它向sender发送一个应答消息“over”,结束程序的运行。
使用无名信号量实现两个线程之间的同步与互斥。
4.编写程序sender,它创建一个共享内存,然后等待用户通过终端输入一串字符,并将这串字符通过共享内存发送给receiver;最后,它等待receiver的应答,等到应答消息后,将接收到的应答信息显示在终端屏幕上,删除共享内存,结束程序的运行。
编写receiver程序,它通过共享内存接收来自sender的消息,将消息显示在终端屏幕上,然后再通过该共享内存向sender发送一个应答消息“over”,结束程序的运行。
使用无名信号量或SystemV信号量实现两个进程对共享内存的互斥使用。
三、程序流程图
shell
无名管道通信
发送者进程(消息队列通信)
接收者进程(消息队列)
主程序(消息队列通信)
共享内存思路
四、实验结果(程序截图)
消息队列
Shell命令
五、思考与探索
当时卡壳的地方
(1)我们在设计程序时,最卡壳的地方在共享内存来实现通信时,能不能用无名信号量,最后向老师求助才知道,用有名信号量。
相对于无名信号量来说,有名信号量通过IPC名字进行进程间的同步,其特点是把信号量保存在文件中,这决定了其用途非常广泛:
既可用于线程,也可用于相关进程和不相关进程。
(2)在父子进程的通信里面,无名管道自带阻塞功能,但他的互斥与同步需要我们自己去实现,经过多次查阅资料和测试,我们最后艰难地选择了SystemV信号量,并自己写函数来实现PV操作
(3)在通过消息队列来实现通信的程序中,我们遇到的问题是,程序莫明其妙的阻塞,但是加入print来测试则又可以正常运行,后来才意识到,这就是进程的异步性的体现哇。
最后我们找到死锁原因,并使用一个资源信号量来解决sender发送的over信息被自己给接收的问题。
(一开始我们还把这个资源信号量当作了互斥信号量,在程序验收时老师告诉我们,只能有一个互斥信号量)
实验序号
3
实验名称
文件系统
实验时间
16年1月
实验地点
1教南1楼
一、题目说明
通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部数据结构、功能以及实现过程的理解。
二、设计方案(系统框架)
(1)在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。
在退出该文件系统的使用时,应将该虚拟文件系统以一个Windows文件的方式保存到磁盘上,以便下次可以再将它恢复到内存的虚拟磁盘空间中。
(2)文件存储空间的分配可采用显式链接分配或其他的办法。
(3)空闲磁盘空间的管理可选择位示图或其他的办法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,那么可以将位示图合并到FAT中。
(4)文件目录结构采用多级目录结构。
为了简单起见,可以不使用索引结点,其中的每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
(5)实现以下函数:
my_format:
对文件存储器进行格式化,即按照文件系统的结构对虚拟磁盘空间进行布局,并在其上创建根目录以及用于管理文件存储空间等的数据结构。
my_mkdir:
用于创建子目录。
my_rmdir:
用于删除子目录。
my_ls:
用于显示目录中的内容。
my_cd:
用于更改当前目录。
my_create:
用于创建文件。
my_open:
用于打开文件。
my_close:
用于关闭文件。
my_write:
用于写文件。
my_read:
用于读文件。
my_rm:
用于删除文件。
my_exitsys:
用于退出文件系统。
三、程序流程图
创建新目录
创建文件和目录相似
删除目录
读文件
初始化
主程序
删除文件
打开文件
四、实验结果(程序截图)
界面
五、思考与探索
文件系统的难点:
文件系统是我们经历的最难的一个实验了。
除了代码量大,还有就是很难理解。
下面是我们在和组员交流我们的代码时,组员的问题和解答(可能有不准确的地方)
(1).和..两个特殊的目录项,他们的first(文件起始盘块号)指向哪里?
答:
在根目录中,它们两个都指向同一个盘块,就是他自己。
但其他文件中,“.”指向他自己的起始盘块号,而“..”指向他父亲的起始盘块号
(2)为什么在my_format()函数中,
fat1=(fat*)(myvhard+BLOCKSIZE);
fat2=(fat*)(myvhard+3*BLOCKSIZE);
root=(fcb*)(myvhard+5*BLOCKSIZE);
为什么都差了2个盘块大小
答:
这个要从磁盘布局说起
虚拟磁盘一共划分成1000个磁盘块,每个块1024个字节,其中引导块占一个盘块,两张FAT各占2个盘块,剩下的空间全部是数据区,在对虚拟磁盘进行格式化的时候,将把数据区第1块(即虚拟磁盘的第6块)分配给根目录文件,如图所示:
(3)为什么创建子目录的时候length=2*sizeof(fcb)
答:
这是因为它在创建子目录就创建两个特殊的目录项
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 材料 31869