进程的同步实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char s[40];
sprintf(s, "the plus process is waiting");
putfonts8_asc_sht(sht_back, 24, 180, COL8_FFFFFF, COL8_00
北京邮电大学实验报告
进程同步实验
学院: 计算机学院
科目: 操作系统实验
姓名: 陈星曼 孙博文 周鹏
张建南 何若愚 陈宇
组号:
3
一、实验概述 1. 实验名称 30 天自制操作系统 2. 实验目的 (1)阅读 30 天自制操作系统,理解操作系统的实现原理。 (2)理解操作系统中的竞争条件的产生和带来的问题。 (3)理解如何利用临界区来解决进程间的竞争条件。 (4)对操作系统有从底层向上的认识,再实现由表及里的深入
4
为了使显示效果更加明显,采用定时器的方式,使生产需要一定 时间,且生产之后休息很短时间。
(5)实验主要算法 基于 13 天 c 版本
void Producter() {
//produce items wait(empty); wait(mutex); //add to buffer signal(mutex); signal(full); } void Customer() { wait(full); wait(mutex); //remove an item signal(mutex); signal(empty); } void semwait(int *value){ for(;;){
if((*value)>0) break;
} io_cli(); *value=(*value)-1; io_sti(); } void semsignal(int *value){ io_cli(); *value=(*value)+1; io_sti(); } (6)实验结论 信号量是一种十分有效的解决临界区问题的方法,通过设定不允 许系统中断来有效保证了操作系统不会发生竞争条件,在进程进入临 界区后能阻止其他进程使用变量,在使用结束后能快速选择下一个进 入临界区的进程,信号量有效地解决了临界区难题。
2
i-- for 100000 times 如果不出现错误结果应该是 0,如果结果非 0 则意味着出现错误。
3.如何观察 为了方便观察我们把++ 和 -- 的数目增加,通过把 i++对应指 令数目增加(i+i-i+i-i……),并通过设置优先级(减少时间片) 来实现更快速的进程切换,最后设置大量循环,多次模拟此过程(自 定义同步算法:ready=1 0 -1),以实现更容易观察竞争条件的目的 。 4.思路:原子操作的实现 算法:通过查找资料我们可以看到,临界区问题的解决算法有信 号量等,实现也有硬件和软件之分。 在当前的实验环境下,CPU 关中断可以使任务不会被抢,从而保 证操作的原子性;Test&Set 等特殊指令也可以实现,但是在当前指 令集中不存在。 上面的开关中断针对的是单 cpu,针对多 cpu 的解决方式比较复 杂,这里就不再展开。
6
本次实验十分生动的描述了哲学家上厕所问题这一经典同步问 题,实现了同一时间内只有一个哲学家使用厕所,能从抢占队列中选 择一个哲学家,以及有限等待,完整地解决了同步问题中的等待与抢 占问题。
(三)进一步探索,系统优化 1.自旋锁等待时间优化
(1)实验说明 进程位于临界区时,其他进程需要不停循环,浪费 CPU 时间。我
for (;;) { io_cli(); if (fifo32_status(&fifo) == 0) { io_sti();
} else {
i = fifo32_get(&fifo);
io_sti();
if (i == 1) {
io_cli();
ready = 0;
io_sti();
while(ready == 0){
struct FIFO32 fifo; struct TIMER *timer_1s; int i, fifobuf[128]; char s[12];
11
fifo32_init(&fifo, 128, fifobuf, self);//struct TASK *task = 0, 不用自动唤醒 timer_1s = timer_alloc(); timer_init(timer_1s, &fifo, 1); timer_settime(timer_1s, 1);
(2)实验操作 由于模拟器环境下条件有限,为了构造这种情况我们需要很巧妙 的构造内存分配条件。首先分配比第一块内存最大大小大的内存 n 块,直到后一块无法分配再分配很小的内存块系统算法默认是选择最 先找到的,也就是前面一块但这时是后面一块更小,前一块更大,一 旦当分配完这些小的内存后,我们需要一个稍大的内存,本来如果不 把前面的内存分出去,我们的内存是可以分配的,但是前一块分配了 小内存后,产生了很多的内存碎片,这也就是让这一块内存无法分配 而我们的算法则可以最优分配,直到系统每一块都无法分配内存。
探索。 3. 实验类型 设计+验证+优化 4. 实验内容 (1)阅读 30 天自制操作系统,并选择合适版本进行实验。 (2)对原系统的进程同步机制予以修改,实现竞争条件,并通
过信号量解决生产者—消费者问题。 (3)通过 TEST&SET 算法实现哲学家上厕所问题,加深理解进程
同步的原理。 (4)对自旋锁算法进行优化,并对原系统的内存分配机制进行
四. 实验中遇到的问题 (1)如何实现竞争条件 答:通过不断切换进程,增加每个进程内的执行操作数目,使多
次 count 操作发生重叠 (2)思考在信号量中为什么要使用原子操作? 答:在执行等待信号量和释放信号量的时候,是不允许 cpu 响应
外部中断的,如果此时 cpu 响应了外部中断,会产生不可预料的结 果,无法正常完成原子操作。
们通过算法优化实现等待时间的缩短,提升操作系统的效率。 (2)改进措施
设置循环的睡眠时间,“等一会再敲门”。 睡眠时间可设置随检查次数而减少(aging)。 (3)具体实现 增加睡眠时间新系统模块:sleep_manager 与系统调用 void sleep(task,seconds)实现进程睡眠一定时间的功能。往与 process_ manager 共享的 buffer 中写入任务句柄、睡眠时间,执行睡眠函数, 让当前任务睡眠。循环检测睡眠缓冲区,如果有新的睡眠任务,把该 任务加入到睡眠列表中,并为之创建计时器,检测计时器,根据计时 器唤醒相应任务。
通过适当的 sleep 操作,aging 算法明显节约 cpu 等待时间,提 升了系统效率。对系统其它模块,如鼠标操作流畅度等都有了明显的 提升。
2.内存分配算法优化 (1)实验说明:原算法使用了最先选择算法,这种算法效率高,
运行速度快,但在某些情况下会产生很多的碎片,一旦碎片过多会导 致后续的内存无法分配,最终引起系统的异常,在此我们对最先算法 进行了修改,使用了最优的算法,为了区分这两种算法的区别,我们 设计实验来验证在不同情况下两种算法的区别。
(二)临界区问题:经典问题的解决临界区解决方 1.信号量解决生产者消费者问题 (1)实验流程图
3
准备实验 解决生产者-消费者问题
实现信号量
创建信 号量
等待释放 信号量
等待信号 量(不阻 塞)
释放信号 量(不唤 醒)
等待信号 释放信号 量(阻塞) 量(唤醒)
解决生产者消费者问题
结束实验
图 4-1.整体试验流程图
} //Philosopher uses toilet for a while Lock=false; }int TestAndSet(int *target) { io_cli(); int rv=*target; *target=1;// 1 means true; io_sti(); return rv; } (5)实验结论
5
2.TEST&SET 解决哲学家上厕所问题 (1)实验说明
本实验实现了对哲学家上厕所问题的模拟,通过 TEST&SET 的方 法实现了哲学家等待以及抢占的过程,实验中通过对函数的不同传参 ,解决了确定哲学家身份的难题,并设定了验证代码来明显的显示哲 学家等待和抢占的效果。
(2)具体实现 哲学家:思考 3s,上厕所 2s(定时器) 厕所:需要有锁 上厕所动作:如果锁关闭(正在被占用)需要等待,否则占用并 锁门,使用完毕打开锁。 (3)实验操作
(3)实验主要算法 while(!end){
if(size>need){ //save sizediff and serial if(sizediff<mindiff){ mindiff=sizediff; }
} (4)实验结论:
8
由于在随后的验证中发现了本系统的内存块只有两块,这里的改 进在本操作系统中实际上在大部分时间中加重了系统的负担,但还是 能在某些情况下分配最先算法无法分配的内存,而随着内存快的增加 和内存块的不连续,最优算法的性能会初步体现,在这里我们只是提 出一种方案,其实在更复杂的操作系统中应该采用两种复合的方案来 实现内存的管理!
首先进入哲学家上厕所算法,首先哲学家进行思考,然后某哲学
家开始使用厕所,其他哲学家进入等待,哲学家使用完厕所后,释放
等待变量,其他哲学家开始抢占,选择一个哲学家进行上厕所,其他
进入等待。
(4)实验主要算法 基于 13 天 e 版本
void T来自百度文库ilet() {
while(testandset(lock)){ //the Philosopher is waiting
五.程序运行时的初值和运行结果 1.模拟竞争条件
9
2.生产者消费者问题 3.哲学家上厕所问题
4.内存优化验证: 初始情况
10
最先分配
最优分配
六.实验关键代码(源程序打包在附件中) 1.竞争条件模拟代码
void operate_plus(struct SHEET *sht_back,struct TASK* self) {
优化,操作系统性能上的提高。
二、实验环境 WindowsXP(Windows7,8.1) + QEMU 模拟器
三、实验过程 (一)竞争条件的实现
1.问题的提出 临界区问题是嵌入式软件编程一个不得不面对的关键性问题。特 别对于底层驱动,代码在内存中只有一份,上层的多任务或者多进 程,都会对同一个驱动去访问,这样不可避免的遇到了任务之间打架 的问题,首先我们基于原操作系统实现竞争条件,通过大量的 count ++,count--操作增加碰撞几率。 2.实现算法: Proc 1: i++ for 100000 times Proc 2:
(3)实验算法实现 void semwait(int *value){
for(;;){ if((*value)>0) break; sleep(thistask,sleeptime); sleeptime-=1;//或者不变
} io_cli(); *value=(*value)-1;
7
io_sti(); } (4)实验结论
(2)实验说明 原操作系统中并没有对进程的同步机制进行处理,这也就导致了 当系统出现竞争条件时,会导致程序运行结果的错误,本实验首先验 证了原程序不经改进可能会出现的竞争条件错误,然后使用了信号量 实现了生产者消费者问题,运用硬件关中断的方法实现了原子操作, 解决了临界区问题。 (3)实验操作 首先制定生产者消费者算法,启动函数,生产者进入生产,关闭 中断,生产产品,打开中断,进入消费者,关闭中断,消费产品,打 开中断,执行其他操作。 (4)具体实现 首先设置“仓库的大小”为 5,初始为空 进入生产后后,生产者向仓库中写入“Pd:no id”,意为生产出 第 id 号产品放入仓库。
(3)信号量和 TESTANDSET 有什么局限性 答:需要中断 cpu,通过软件的方式实现,必然会影响系统的效 率。 (4)为什么要对自旋锁进行优化 答:在进程等待过程中,进程在不断地等待接受可以执行的信号 ,这样大量的循环操作是的系统负担加重,适当的优化可以有效的提 高系统效率。 (5)内存分配算法优化如何验证 答:首先要看一下内存块的大小分别是多少事实上这里边只有两 个内存块,通过不断地分配内存,查看两种方式所能分配的内存多少 来衡量算法的性能。