操作系统实验报告 下载本文

内容发布更新时间 : 2024/5/1 13:23:12星期一 下面是文章的全部内容请认真阅读。

实现生产者和消费者同步问题 实现消息缓冲通信 五、思考与探索 (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上参加运行。 由于该函数必须是自动地定期地运行,所以我们通过截取时钟中断(int 08)来完成。在PC机上,有一个定时器,每当它发一个时钟信号时(一般情况下,它每秒发出18.2个信号,除非是对产生该中断的定时器芯片重新编程),系统就进入时钟中断处理程序(INT 8)来完成系统计时、调用INT 1CH、关闭磁盘马达等工作。 实验序号 实验时间 2 15年12月 实验名称 实验地点 一、题目说明 linux进程管理 1教南1楼 1. 熟悉linux的命令接口。 2. 通过对linux进程控制的相关系统调用的编程应用,进一步加深对进程概念的理解,明确进程和程序的联系和区别,理解进程并发执行的具体含义。 3. 通过Linux管道通信机制、消息队列通信机制、共享内存通信机制的使用,加深对不同类型的进程通信方式的理解。 4. 通过对linux的Posix 信号量的应用,加深对信号量同步机制的理解。 二、设计方案(系统框架) 1. Shell部分 要求:编写三个不同的程序 cmd1.c, cmd2.c, cmd3.c,每个程序输出一句话,分别编译成可执行文件 cmd1, cmd2, cmd3。然后再编写一个程序,模拟 shell 程序的功能,能根据用户输入的字符串(表示相应的命令名),去为相应的命令创建子进程并让它去执行相应的程序,而父进程则等待子进程结束,然后再等待接收下一条命令。如果接收到的命令为 exit,则父进程结束;如果接收到的命令是无效命令,则显示“ Command not found”,继续等待。 新建三个不同的程序cmd1,cmd2,cmd3 然后编译成可执行文件cmd1,cmd2,cmd3 之后编写程序my_shell.c 通过读取shell命令调用在使用if else语句判断识别并分别通过fork()创建子线程,子线程中采用execl(const char *path,const char *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”,结束程序的运行。使用无名信号量或System V信号量实现两个进程对共享内存的互斥使用。 三、程序流程图 shell