nachos下的线程编程3

                  nachos下的线程编程

一、 实验内容

本次实验的目的在于掌握使用nachos中的线程来解决较为复杂的并发问题。实验内容分三部分:实现事件栅栏原语并进行正确性测试;实现闹钟原语并进行正确性测试;利用事件栅栏和闹钟原语来解决电梯问题

二、 实验思路

首先使用Semaphore来编写锁,相应的接口在synch.h中,对于synch.h,我们只要在类里面添加某些变量即可。然后对于synch.cc,我们的具体实现要在这里编写。只要补全空的构造函数和析构函数即可。特别注意,其中的环境变量要和锁一起使用,线程在Sleep之前要释放锁,网站空间,在恢复执行后要重新获取锁。编写完后,在dllist.h中引用synch.h,然后在类中定义锁,在dllist.cc中新建锁后就可以使用了。在dllist.cc中,移除节点的时候,如果遇到链表是空的,要listempty->Wait(lock),在sortedinsert和sortedremove中,进入函数的时候加锁lock->Acquire(),出去的时候释放锁lock->Release()。并且,在sortedinsert出去的时候,同样要发listempty->Signal(lock)。在dllist-driver.cc和threadtest.cc中,分别定义一个外部锁即可。用Thread::Sleep实现与上面的思路类似。至于实现一个线程安全的表结构和实现一个大小受限的缓冲区,有了以上的编写经验,然后参照头文件的接口声明编写相关函数即可。

三、 实验结果

PS:本次实验默认情况下是5个乘客10个楼层

1)

实验中第一个参数是:乘客数 第二个参数是楼层数:比如

四、 实验总结

实验过程中又不懂的就看nachos中文教程及实验上的ppt指导主要理解到:

时间栅栏

Wait

Wait操作的调用者在事件栅栏上等待Signal的发出。

收到Signal后调用Complete操作表示应答结束。

Wait操作的调用者与Signal操作的调用者最终都将同步地通过栅栏

Signal的发出者必须等待,香港服务器,并保持事件栅栏处于“SIGNALED”状态。

直到所有的Wait操作的调用者都已经应答之后才能通过事件栅栏

然后离开事件栅栏并恢复事件栅栏的初始状态“UNSIGNALED”

timer类的实现很简单,当生成出一个Timer类的实例时,就设计了一个模拟的时钟中断。这里考虑的问题是:怎样实现定期发生时钟中断?

一旦中断时刻到来,立即进行中断处理,处理结束后并没有机会将下一个时钟中断插入到等待处理中断队列。

调用TimerHandler函数,其调用TimerExpired方法,该方法将新的时钟中断插入到等待处理中断队列中,然后再调用真正的时钟中断处理函数。这样Nachos就可以定时的收到时钟中断。

处理始终的中断处理函数在interrupt类当中。

这个函数又加入了一个了刚才一模一样的中断,这样的话就可以实现每隔一段时间就发一个类似的中断,然后再执行中断处理函数,这个中断处理函数是在构造函数中赋值的,专门用来处理时钟中断

而闹钟

第一步: timer = new Timer(TimerInterruptHandler, 0, randomYield); 在终端等待队列中添加一个时钟中断,中断参数就是本对象

第二步 固定时间后固定中断会自动产生(系统固定时钟中断),然后判断是否就是时钟中断,如果是,则通过里面的中断参数调用时钟中断处理函数,中断处理函数首先是添加一个时钟中断,然后是调用中断的另一个参数,该参数就是实际中断处理函数。(也就是timer类里面的第一个参数)

第三步 重复第二步

电梯:

对于电梯主要是需要用到前面做过的实验,主要是事件栅栏(用于人到电梯前时们还没开则堵塞到向上或向下的栅栏上,在电梯里面则根据电梯现在在哪,堵塞到相应的楼层的事件栅栏上面等到电梯开门在一起出去,同时最后一个告诉电梯关门)信号量(1判断是否有乘客要用电梯否则把电梯进程堵塞empty信号量上面去)闹钟则是用来限制人到底以多大的频率使用电梯通过闹钟的pause()把自己堵塞到闹钟的堵塞队列知道时间到在将进程通过调度器:scheduler调度到就绪队列当中(该就绪队列的具体实现在scheduler类里面的readyList)锁则用到了每次只能一个进程运行改变每层楼上面的等待电梯向上或向下的人数计数等。

通过本次实验把书上的知识彻底的由抽象到直观,对书上的信号量,服务器空间,锁互斥等概念有个更好的理解。

旅行还在继续,这个过程是艰难而又孤单的。

nachos下的线程编程3

相关文章:

你感兴趣的文章:

标签云: