Nachos_Project_1_2014-操作系统实验
Nachos同步机制实习报告

同步机制实习报告善良的大姐姐2015.3.30目录一:总体概述 (3)二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)三:遇到的困难以及解决方法 (12)四:收获及感想 (12)内容五:参考文献 (13)一:总体概述Lab3首先要求阅读Nachos系统提供的同步机制代码,即Semaphore的实现。
其次要求修改底层源代码,达到“扩展同步机制,实现同步互斥实例”的目标。
具体来说,即要求在Semaphore的基础上,实现Lock锁和Mesa管程的Condition(条件变量)。
此外,还要利用编写的同步机制,来实现互斥实例,进而证明同步机制编写的正确性。
二:任务完成情况任务完成列表(Y/N)具体Exercise的完成情况Exercise1:调研任务:调研Linux中实现的同步机制调研情况:Linux的同步机制包括好几层。
第一层:原子操作。
以x86体系结构为例,定义在linuxX.X/include/asm-i386/atomic.h文件中。
文件内定义了原子类型atomic_t,其仅有一个字段counter,用于保存32位数据。
其中原子操作函数atomic_inc完成自加原子操作。
第二层:自旋锁。
以x86体系结构为例,定义在linuxX.X/include/asm-i386/spinlock.h文件中。
其中__raw_spin_lock完成自旋锁的加锁功能。
自旋锁达到的效果为,在等待锁的线程会不断地申请锁,直到获得锁或是时间片用尽从而离开CPU。
第三层:信号量以x86体系结构为例,定义在linuxX.X/include/asm-i386/semaphore.h文件中。
信号量的申请操作使用down函数,释放操作使用up函数。
即通常所说的PV操作。
区别于自旋锁,当一个进程在等待一个锁时,会让出CPU进入休眠状态,直到其他进程释放锁后,将该进程放入可运行队列。
Exercise2:源代码阅读任务阅读下列源代码,理解Nachos现有的同步机制。
操作系统实验报告1

姓名: 刘桂良
硬件环境:Ubuntu12.8.1-mips.tar.gz 和 nachos-3.4-2011.tar.gz 拷贝到 主文件夹 中,解压 nachos。 $ tar xzvf nachos-3.4-2011.tar.gz 输入 su,输入密码,进入 root 用户下, cp gcc-2.8.1-mips.tar.gz /usr/local $tar xzvf gcc-2.8.1-mips.tar.gz 在普通用户下,转到 threads 目录下, cd /nachos3.4/code/threads 之后输入 make 之后,测试 nachos 系统 测试成功结果如下:
软件学院实验报告
实验题目:Installation of Nachos System 日期:2013-11-1 班级: 11 级 3 班 Email:61536799@ 实验目的: 安装 Nachos 和 Mips gcc 交叉编译 了解基本 Nachos 系统组织结构 学号: 201100300144
结论分析与体会: 通过这次实验,熟悉了 C++语言和系统开发调试,理解 Nachos 系统的 Makefile, 掌握重构 Nachos 系统的方法。
操作系统实验一(杨婷婷)

实验一熟悉Windows2000/XP中的进程和线程一、实验目的1、熟悉Windows2000/XP中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
二、实验理论基础及教材对应关系1、实验理论基础:(1)操作系统中的进程和线程的概念;(2)进程PCB的各项指标含意;2、本实验内容主要对应于教材第2章。
三、实验内容与步骤1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。
如下图所示:2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):表一:统计进程的各项主要信息3、从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是,原因是。
4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化、得到的结论是(说出explorer.exe进程的作用)。
5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:表二:统计线程的各项信息进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异是。
四、实验材料的提交与成绩评定lsass.exe 系统进程,用于微软Windows系统的安全机制。
services.exe 微软Windows操作系统的一部分。
用于管理启动和停止服务。
winlogon.exe Windows 用户登陆程序,管理用户登录和退出。
nachos系统实验报告:实验二

实验二一.实验目的将nachos 中的lock 和condition 类的实现补充完整,并利用这些同步机制实现两个基础功能。
二.实验内容1) 实现syncy.h 中的Lock 和Condition 类,并利用这些同步机制将实验一中所双向有序链表类修改成可以在多线程线程环境下运行。
2) 实现一个线程安全的Table 。
Table 有一个固定大的Entery 数组。
3) 实现一个大小受限的BoundBuffer ,可以完成读.写功能,其中读写的size 可以超过设定的buffer 大小,当读的东西太快或写的太慢时,就将其挂起。
当buffer 里重新有写的空间或读的空间时在将其线程放入就绪队列中。
三.实验结果1.锁机制的实现 **因为lock 和condition 都有两个版本,所以当调用取得锁和释放锁的函数时我 用的是GetLock()和ReleaseLock(),而不是lock->Acquire(),Condition 同理用的是Signal ()和Wait ()。
这些函数会根据运行程序时输入的参数来决 定用哪个版本的锁或者不用锁。
a)主要代码分析 Lock 类的主要成员{public : void Acquire(); // 得到锁 void Release(); // 解放锁private: Thread *LockedThread ; // 用于储存现在拥有 lock 的线程 LockStatus status ; // 表示此时lock 的状态(Busy ,Free ) List *queue // 用于保存挂起的 线程}Lock 类中Acquire 函数得到锁,如果此时别的线程拥有锁,则此时线程被 挂起放在queue 队列中,直到有人释放锁时,Release 函数将queue 中的一 个线程加入就绪队列,每次只能由一个线程得到锁。
Condition 类主要成员{ public: void Wait(LockO *conditionLock); void Signal(LockO *conditionLock); private:List *queue ; char* name;}Condition 类的所有操作都在线程得到锁时进行操作,且运行其函数时,都 先检测 lock 是否被currentThread 锁拥有。
利用Nachos操作系统研究和实验虚拟内存

利用Nachos操作系统研究和实验虚拟内存摘要:本文分析和论述了如何利用教学指导型操作系统Nachos研究和实验虚拟内存。
通过详细的实例设计与分析,阐述了在Nachos操作系统中如何构建虚拟内存,如何实现虚拟内存的各种调度算法;如何实验和分析虚拟内存的工作过程和性能。
对虚拟内存的教学和科研具有一定的指导辅助作用。
关键词:操作系统;虚拟内存;实践教学;Nachos1引言虚拟内存的实现和运行同时涉及到内存管理、调度与中断、文件系统等内核诸多方面的问题。
因此在操作系统的教学和实验中虚拟内存的讲解和实验是较为棘手和困难的一个问题。
为了能够讲清虚拟内存的基本构造和工作原理或想独立实践一下虚拟内存的构造和各种虚拟内存策略,我们可以利用一下教学指导型操作系统Nachos。
由于Nachos提供了一个自由构造虚拟内存的框架,可让我们在其上开发和构造自主设计的虚拟内存,辅助我们更好的开展好虚拟内存的教学和研究。
2内存管理和虚拟内存构造机制Nachos在它的页表机制中仅提供了可让用户构造虚拟内存的基本机制。
页表结构是由TranslationEntry 类定义的,该定义在文件machine/translation.h中: class TranslationEntry {public:int virtualPage; //逻辑页号int physicalPage; //物理页号bool valid; //有效位bool readOnly; //只读位bool use; //引用位bool dirty; //修改位};为了实现虚拟内存的页置换,我们需要在以上类中增加一个该页在文件中的块偏量:int inFilePage。
原始的Nachos内存无法实现多道程序同时驻留内存,为此可以为其增设了分段式内存管理,从而实现了多道程序同时驻留内存并发执行。
增设的段式内存管理机制的类结构为:class SegmentEntry { //段表public:int segID; //段号int segBase; //段基址int segPages; //段页数} ;class MemManager{ //段管理器public:MemManager();// 段构造~MemManager(); // 段析构SegmentEntry * Allocate(int segPages,int pid);//分配一个段void Deallocate(int Pid); //回收一个段private:List *usedList; //已用内存页表链List *idleList; //空闲内存页表链};用户的可执行文件按段装入到模拟机的物理内存中并发执行的过程(无虚拟内存方案)可参见文献[1]。
Nachos模拟操作系统的实验教学应用

由于实验课 程课 时 的限制 和学生 程序实 现能 力 的差距 , 目前 国 内高校 操 作 系统 实 验 主要 以分 离 的 设计 各管 理功能 仿真 试验 为主 。各 实验 内容 之 间的
系统联 系不够 强 , 生 对各 章 节 知识 点 的理 解 不能 学
及到真正底层硬件操作代码 。其代码量也不大 , 总 共只有 8 多个文件 , 0 最大的一个源文件其代码量也
国外的操作系统教学 的以实际操作 系统 ( 例如 M — I
NX) 目的设 计 与 实 现 为 方式 的 教 学 模 式 还存 在 I 项
较 大 的差距 。
N co 没有涉及到底层的硬件操作代码, ahs 因此修改
里 面的代 码 不 会 涉 及 太 多硬 件 的 基础 。N co ahs简 单 的实现 了现代 操作 系统 的大部 分 重 要 功能 , 进 如 程管 理 , 内存 管 理 , 件 系 统 , 管 理 等 , 没 有 涉 文 I O 而
供 一个 可再生 的调 试环 境 , 能 够使 得 学 生 能 够理 也
于其代码数量较大( 超过 2万行) 且涉及较为底层 ,
的硬 件驱动 的细 节和用 户安 全 系统等 。在理论 和实 践 教学 集 中在一学 期 的课 程 而 言 , 论 对 教师 和学 无 生都有 较ቤተ መጻሕፍቲ ባይዱ 的难度 和工 作量 。
23 0
实验 与 课 程 设 计 :
N co 模拟操作 系统 的实验教 学应用 ahs
二 、hl程 序 的 扩 展 Sel
在 N co 中 Se 是一个命令解释器 , ahs hl l 它解 释
由用 户输 人 的命 令 并 且 通过 E eV或 E e 统调 xc xc系 用 来运 行 相 关 程 序 。通 常 , 验 中对 N co hl 实 ahsSel 的扩展 工作 可 以包含 以下几 个 内容 : 一是 进程 调度 ; 二 是 内存 管理 ; 是 文 件 系统 ; 三 四是 系统 调 用 ; 是 五
中南大学 操作系统安全实验报告

CENTRAL SOUTH UNIVERSITY操作系统安全实验报告学生姓名专业班级学号学院信息科学与工程学院指导教师宋虹实验时间 2014年12月《操作系统安全》实验一……Windows系统安全设置实验一、实验目的1、了解Windows操作系统的安全性2、熟悉Windows操作系统的安全设置3、熟悉MBSA的使用二、实验要求1、根据实验中的安全设置要求,详细观察并记录设置前后系统的变化,给出分析报告。
2、采用MBSA测试系统的安全性,并分析原因。
3、比较Windows系统的安全设置和Linux系统安全设置的异同。
三、实验内容1、配置本地安全设置,完成以下内容:(1)账户策略:包括密码策略(最小密码长度、密码最长存留期、密码最短存留期、强制密码历史等)和账户锁定策略(锁定阈值、锁定时间、锁定计数等)(2)账户和口令的安全设置:检查和删除不必要的账户(User用户、Duplicate User用户、测试用户、共享用户等)、禁用guest账户、禁止枚举帐号、创建两个管理员帐号、创建陷阱用户(用户名为Administrator、权限设置为最低)、不让系统显示上次登录的用户名。
审核登录事件、审核特权使用等(4)设置IP 安全策略(5)其他设置:公钥策略、软件限制策略等2、Windows系统注册表的配置(1)找到用户安全设置的键值、SAM设置的键值(2)修改注册表:禁止建立空连接、禁止管理共享、关闭139端口、防范SYN攻击、减少syn-ack包的响应时间、预防DoS攻击、防止ICMP重定向报文攻击、不支持IGMP协议、禁止死网关监控技术、修改MAC地址等操作。
禁止建立空连接:“Local_Machine\System\CurrentControlSet\Control\LSA-RestrictAnonymous”的值改成“1”即可。
禁止管理共享:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters项对于服务器,添加键值“AutoShareServer”,类型为“REG_DWORD”,值为“0”。
实验三-操作系统实验Nacho

实验内容 利用事实验三 操作系统实验Nacho、实验人员:、实验目的:本次实验的目的在于掌握使用 nachos 中的线程序解决较为复杂的并发问题。
分三部分:实现事件栅栏原语并进行正确性测试; 实现闹钟原语并进行正确性测试; 件栅栏和闹钟原语来解决电梯问题(详细内容请看 nachos-labs.pdf )。
三、实验内容:1. 实现事件栅栏原语2. 实现闹钟原语3. 解决电梯问题四、实验步骤:1. 实现事件栅栏原语#ifndef EVENTBARRIER_H#defi ne EVENTBARRIER_H#in clude "syn ch-sem.h"#defi ne SIGNALED 1#defi ne UNSIGNALED 0 class Eve ntBarrier{ public:Eve ntBarrier();~Eve ntBarrier();void Wait();void Sig nal();void Complete。
;int Waiters。
; private:bool state;Con diti on *waits;Con diti on *waitc;Lock *barrier;Lock *in barrier;int waiter;};#en dif#i nclude "Eve ntBarrier.h"#in clude "thread.h"Even tBarrier::Eve ntBarrier()waits=new Con diti on ("waitsig nal");waitc=new Condition("waitcomplete");barrier=new Lock("barrier"); inbarrier=new Lock("inbarrier");state=UNSIGNALED;waiter=0;}EventBarrier::~EventBarrier() {delete waits;delete waitc;}void EventBarrier::Wait(){barrier->Acquire();waiter++;while(state==UNSIGNALED)waits->Wait(barrier);barrier->Release();}void EventBarrier::Signal()barrier->Acquire();state=SIGNALED;waits->Broadcast(barrier);barrier->Release();inbarrier->Acquire();waitc->Wait(inbarrier);inbarrier->Release();state=UNSIGNALED;}void EventBarrier::Complete(){inbarrier->Acquire();waiter--;if(waiter==0){waitc->Broadcast(inbarrier);}else{waitc->Wait(inbarrier);}inbarrier->Release();int Even tBarrier::Waiters(){return waiter;}2. 实现闹钟原语#defi ne ALARM_H#in clude "system.h"#i nclude "list.h" class Alarm{ public:Alarm();~Alarm();void Pause(i nt howL on g); void Wakeup();int Getpause num(); private:List *queue;int pause num;int leftime;};#en dif#in elude "system.h"#in elude "thread.h"#in elude "Alarm.h"exter n Alarm *alarm;void check(i nt which){while(alarm->Getpause num ()!=0){curre ntThread->Yield();}curre ntThread->Fi nish();}Alarm::Alarm(){queue=new List();pause num=0;}Alarm::~Alarm()queue->~List();}void Alarm::Pause(int howLong){Thread *t;pausenum++;if(pausenum==1){t=new Thread("forked thread");t->Fork(check,0);}if(howLong<=0)return;leftime=stats->totalTicks+howLong*TimerTicks*10000;IntStatus oldlevel=interrupt->SetLevel(IntOff);queue->SortedInsert(currentThread,leftime);currentThread->Sleep();(void) interrupt->SetLevel(oldlevel);}void Alarm::Wakeup()Thread *thread;int ptime=-1;IntStatus oldLevel = interrupt->SetLevel(IntOff);thread = (Thread *)queue->SortedRemove(&ptime);(void) interrupt->SetLevel(oldLevel);while( thread != NULL ){if(stats->totalTicks>=ptime){scheduler->ReadyToRun(thread);pausenum--;oldLevel = interrupt->SetLevel(IntOff);thread = (Thread *)queue->SortedRemove(&ptime);(void) interrupt->SetLevel(oldLevel);continue;}else{oldLevel = interrupt->SetLevel(IntOff);queue->SortedInsert(thread,ptime);(void) interrupt->SetLevel(oldLevel);break;}intAlarm::Getpause num() {retur n pause num;}3. 实现单个电梯class Elevator{public:Elevator(char *debug name,i nt nu mfloors,i nt myid);~Elevator();char *getName() { return n ame; }void OpenDoors(); /* 电梯开门 */void CloseDoors(int i); /* 电梯关门 */bool VisitFloor(int floor); /*查看电梯是否访问某层 */bool Enter(int id); /* 乘客进入电梯 */void Exit(int id); /* 乘客离开电梯 */void RequestFloor(int floor); /* 乘客阻塞在电梯内部 */ intGetlD(){return id;}void SetState(int i);bool IFEMPTY();void GoUp();void GoDown();private:char *name;int id;int numFloorsint currentfloor;int occupancy;int MaxNumber;int states; /* 设置电梯状态*//* 电梯是否为空*//* 电梯上行*//* 电梯下行*/; /* 电梯所能到达的最大楼层*//* 目前所在楼层*//* 目前乘客数目*//* 最大乘客数目*//* 电梯状态*/int GetFloor(){return currentfloor;}int GetState(){return states;}EventBarrier *eventbarrier; /* 电梯栅栏 */bool *ifvisitfloor;/* 判断电梯是否停留某楼层的数组 */Lock *occlock;};class Buildingpublic:Building(char *debugname,int numfloors,int numelevators);~Building();char *getName() { return name; }void CallUp(int fromFloor);void CallDown(int fromFloor);Elevator *AwaitUp(int fromFloor); /* 乘客等待,阻塞 ,返回电梯指针 */ Elevator *AwaitDown(int fromFloor); /* 乘客等待,阻塞,返回电梯指针 */ bool GetDownLight(int floor){return DownLight[floor];}bool GetUpLight(int floor){return UpLight[floor];}void SetDownLight(int t,bool i);void SetUpLight(int t,bool i);void WakeUp();void WakeDown();Elevator *TellElevator();private:char *name;int NumElevators; /* 电梯数目 */int NumFloors; /* 楼层数目 */EventBarrier *eventbarrier_up;/* 上行栅栏 */EventBarrier *eventbarrier_down;/* 下行栅栏 */Elevator *elevator; /* 一个电梯 */bool *UpLight; /*楼层上行按键*/};#i nclude "syn ch-sleep.h" #in clude "system.h" #i nclude "Eve ntBarrier.h" Even tBarrier::Eve ntBarrier(){eve ntlock=new Lock("eve ntlcok"); complete=new Con diti on ("complete");sig nal=new Con diti on ("sig nal"); SIGNALED=false;waiters_co un t=0;}Even tBarrier::~Eve ntBarrier(){delete even tlock;delete sig nal;delete complete;void EventBarrier::Wait(){eventlock->Acquire();waiters_count++;while(!SIGNALED)/* 如果事件栅状态是 UNSIGNALED, 则阻塞 */signal->Wait(eventlock);eventlock->Release();}void EventBarrier::Signal(){eventlock->Acquire();SIGNALED=true;/* 设置事件栅栏的状态为 SIGNALED*///printf("\n set SIGNALED=true,waiting for all forks WakeUp");signal->Broadcast(eventlock);/* 唤醒所有阻塞于 Signal 的线程 */ complete->Wait(eventlock); /* 阻塞于 Complete*///printf("\n has already signaled all waiting forks");SIGNALED=false;/* 恢复事件栅栏的状态为 UNSIGNALED*///printf("\n has already reset SIGNALED=false\n"); eventlock->Release(); }void EventBarrier::Complete()eve ntlock->Acquire();waiters_co un t--;if(waiters_count==O)/* 最后一个应答,唤醒所有阻塞在complete 的线程*/ complete->Broadcast(eve ntlock);else if(waiters_cou nt>0)/* 并非最后一个应答,阻塞在 complete*/complete->Wait(eve ntlock);elseprin tf("\n waiters_cou nt error!");eve ntlock->Release();}int Even tBarrier::Waiters(){retur n waiters_co unt;}五、实验结果1. 事件栅栏测试结果2•闹钟测试结果3.电梯测试结果普通情况严C^1L4018@C56;电梯满六、实验总结本次实验关于电梯的程序难度较大,特别是电梯部分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Nachos实验项目
本实验项目采用纽约大学计算机系相关课程的实验设计。
这些实验的内容以及nachos 的完整介绍请参考相关文档。
Nachos实验项目将采用分组方式完成。
每4人为一组(个别组除外)。
分组确定后,未经特别批准,不得变更。
请各组组长在自己的起始目录下创建试验结果提交目录“nachos”(不含引号,均为小写字母)。
每次实验,我们都将指定需要提交的内容和截止时间,第一次试验的提交内容放在起始目录下的“nachos/1”目录内,第二次的放在“nachos/2”内,依次类推。
请大家关注,并严格按要求操作。
一个小组只要提交一份实验报告即可。
对未按实验提交要求操作而造成提交失败的,将被视为实验未完成(提交内容由程序自动收集)。
从第4周起,双周的周二下午2:30~5:30为试验时间并兼做理论课程答疑时间。
实验地点在404。
实验一体验Nachos下的并发程序设计
(实验指导:os_lab.ppt)
1内容简述
本次实验的目的在于对nachos进行熟悉,并初步体验nachos下的并发程序设计。
实验内容分三部分:安装nachos;用C++实现双向有序链表;在nachos系统中使用你所写的链表程序并演示一些并发错误。
2实验内容(详见英文文档nachos-lab.pdf文档3.1章)
2.1安装nachos
2.2实现双向有序链表(50%)
如对c++不很熟悉,可以参考nachos-3.4/c++example/中的有关实现。
2.3体验nachos线程系统(50%)
需要做的更改有:
1)将dllist.h, , 等文件拷贝到nachos-3.4/code/threads/目录中。
2)修改mon中的THREAD_H、THREAD_C、THREAD_O以保证新的文件确
实被编译了。
3)根据实验内容,,等文件可能需要改动。
3实验结果的提交
本实验应提交的内容:
mon
dllist.h
nachos01.doc
其中,nachos01.doc为实验报告。
4 实验的提交截止时间:2014年4月7日。