Nachos_Project_1_2014-操作系统实验
- 格式:pdf
- 大小:50.05 KB
- 文档页数:2
同步机制实习报告善良的大姐姐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现有的同步机制。
实验一熟悉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 中的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操作系统中如何构建虚拟内存,如何实现虚拟内存的各种调度算法;如何实验和分析虚拟内存的工作过程和性能。
对虚拟内存的教学和科研具有一定的指导辅助作用。
关键词:操作系统;虚拟内存;实践教学;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]。
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、实验人员:、实验目的:本次实验的目的在于掌握使用 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;电梯满六、实验总结本次实验关于电梯的程序难度较大,特别是电梯部分。
广州大学学生实验报告开课学院及实验室:计算机科学与工程实验室 2015年11月11日实验课操作系统成绩程名称实验项进程管理与进程通信指导老师陈康民目名称(***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***)进程管理(一)进程的创建实验一、实验目的1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质二、实验内容1、编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
三、实验步骤1、编写一段程序,使用系统调用fork( )创建两个子进程。
代码:#include <stdio.h>main( ){int p1,p2;while((p1=fork( ))= = -1); /*创建子进程p1*/if (p1= =0) putchar('b');else{while((p2=fork( ))= = -1); /*创建子进程p2*/if(p2= =0) putchar('c');else putchar('a');}}运行结果:bca,bac, abc ,……都有可能。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
代码:#include <stdio.h>main( ){int p1,p2,i;while((p1=fork( ))= = -1); /*创建子进程p1*/if (p1= =0)for(i=0;i<10;i++)printf("daughter %d\n",i);else{while((p2=fork( ))= = -1); /*创建子进程p2*/if(p2= =0)for(i=0;i<10;i++)printf("son %d\n",i);elsefor(i=0;i<10;i++)printf("parent %d\n",i);}}结果:parent…son…daughter..daughter..或parent…son…parent…daughter…等四、分析原因除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序执行过程。
目录第一章试验环境介绍 (4)1.1 引言 (4)1.2 Nachos平台的功能特点简介 (4)1.2.1 什么是Nachos (4)1.2.2 Nachos的特点功能介绍 (4)1.3 Nachos平台的搭建与配置 (5)1.3.1 Nachos试验环境文件列表 (5)1.3.2 Nachos试验环境搭建步骤 (6)1.3.3 Nachos的功能模块组成结构 (22)1.3.4 Nachos的编译运行开发环境 (22)第二章Nachos平台技术实现说明 (24)2.1 Nachos的机器模拟机制概述 (24)2.1.1 Sysdep模块实现机制分析 (24)2.1.2 中断处理模块实现机制分析 (27)2.1.3 时钟中断模块实现机制分析 (28)2.1.4 终端设备模块实现机制分析 (29)2.1.5 磁盘设备模块实现机制分析 (29)2.1.6 系统运行情况统计 (30)2.2 Nachos中的进程/线程管理 (30)2.2.1 相关知识点回顾 (30)2.2.2 功能概述 (30)2.2.3 具体模块实现介绍 (31)2.3 Nachos中的文件系统管理 (33)2.3.1 相关知识点回顾 (33)2.3.2 功能概述 (34)2.3.3 具体模块实现介绍 (34)2.4 Nachos中的存储系统管理 (36)2.4.1 相关知识点回顾 (36)2.4.2 功能概述 (36)2.4.3 具体模块实现介绍 (37)2.5 Nachos中的网络系统管理 (37)2.5.1 相关知识点回顾 (37)2.5.2 现有功能分析 (37)2.5.3 具体模块实现介绍 (38)。
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日。