nachos系统-Assignment1

合集下载

nachos作法

nachos作法

Nachos作法介绍Nachos(Not Another Completely Heuristic Operating System)是一个教学用的操作系统内核,由加州大学伯克利分校开发。

它是一个简化的操作系统,旨在帮助学生理解操作系统的基本原理和设计。

Nachos提供了一个模拟的计算机环境,可以在上面运行操作系统。

它提供了一些基本的系统调用,如创建进程、文件读写等,并模拟了一些硬件设备,如磁盘、内存等。

通过使用Nachos,学生可以学习操作系统的各个方面,包括进程管理、内存管理、文件系统等。

Nachos的特点Nachos有以下几个特点:1.模拟环境:Nachos提供了一个模拟的计算机环境,可以在上面运行操作系统。

这使得学生可以在不依赖真实硬件的情况下学习操作系统的原理和设计。

2.简化的操作系统:Nachos是一个简化的操作系统,它只实现了一些基本的功能,如进程管理、内存管理、文件系统等。

这使得学生可以更容易地理解和修改Nachos的代码。

3.可扩展性:Nachos的设计非常模块化,各个组件之间的耦合度较低。

这使得学生可以方便地扩展和修改Nachos的功能,以满足不同的教学需求。

4.开放源代码:Nachos是开放源代码的,任何人都可以访问和修改Nachos的代码。

这使得学生可以更深入地理解操作系统的实现细节,并参与到Nachos的开发中。

Nachos的使用方法要使用Nachos,你需要按照以下步骤进行操作:1.下载Nachos:首先,你需要从Nachos的官方网站上下载Nachos的源代码。

Nachos的官方网站提供了不同版本的Nachos,你可以根据自己的需求选择合适的版本。

2.编译Nachos:下载完Nachos的源代码后,你需要将其编译成可执行文件。

Nachos的源代码附带了一个Makefile,你只需要在终端中运行make命令即可编译Nachos。

3.运行Nachos:编译完成后,你可以在终端中运行./nachos命令来启动Nachos。

nachos系统管理与调度分析课程设计说明书

nachos系统管理与调度分析课程设计说明书

操作系统课程设计基于NachOS的课程设计目录一、背景知识 (1)1、1 Nachos的介绍 (1)1、2 Nachos的目录结构 (2)1、3 线程基础知识 (3)二、设计要求和目的 (4)2、1 Nachos的线程管理模块 (4)2、2 Nachos的线程线程调度算法分析 (4)2、3 编程语言选择对比 (5)2、4 开发环境配置 (6)2、5 NachOS 系统和交叉编译器安装 (6)2、5、1 NachOS 系统安装 (6)2、5、2 交叉编译器环境的安装 (7)三、设计思路和程序结构 (8)3、1 线程的生成和状态转换 (8)3、1、1 基于五状态模型 (8)3、1、2 线程创建过程 (8)3、2 线程调度机制 (8)四、关键代码分析 (9)4、1 扩充线程管理 (9)4、2 扩充线程调度机制 (10)4、3 扩充线程调度机制改进 (12)4、3、1 信号量机制 (12)4、3、2 实现用户更改进程优先级 (13)五、测试 (13)5、1 测试NachOS 环境和交叉编译器 (13)5、2 测试创建线程 (14)5、3 测试线程优先级 (15)六、总结 (15)一、背景知识1、1 Nachos的介绍Nachos的全称是“Not Another Completely Heuristic Operating System”,是一个可修改和跟踪的操作系统教学软件。

它给出了一个支持多线程和虚拟存储的操作系统骨架,可让学生在较短的时间内对操作系统中的基本原理和核心算法有一个全面和完整的了解。

NachOS 提供了可重复的调试环境和模拟操作系统及底层硬件。

目的是为学习者展示真实的操作系统运行时的环境,这个简单的操作系统软件可以让学习者在较短的时间内理解并能够用自己的想法来完善它。

免费的开源开发包可通过网络下载,通常包括以下几部分:1)NachOS 概述2)简单可运行的操作系统代码3)模拟器——个人电脑或工作站4)任务样本:任务说明和现代操作系统涉及的所有项,包括线程和并发,多道程序,系统调用,虚拟内存管理,文件系统管理,网络协议,远程过程调用和分布式系统。

讲解的nachos的运行机制

讲解的nachos的运行机制
nachos 的machine类模拟了一台电脑,这台电脑有内存,寄存器,磁盘。
当你的shell源码被 交叉编译器 编译后,形成了 shell.noff 文件,这个文件只能被 nachos 执行,因为这个文件中的机器指令只有nachos 模拟的那台电脑认识.
比如你在shell文件中有一句 Write("abc",3,ConsleOutput);
kernel->machine->WriteRegister(PCReg, kernel->machine->ReadRegister(PCReg) + 4);
/* set next programm counter for brach execution */
kernel->machine->WriteRegister(NextPCReg, kernel->machine->ReadRegister(PCReg)+4);
在ExceptionHandler函数中:
通过 switch 判断出是 SC_WRITE 。
接下来是你要做的事了!!
在RaiseException函数 所在的 文件 中,有一段注释:
// For system calls, the following is the calling convention:
那我们应怎样实现 nachos 系统函数 Write ??
在 中,加入:
case SC_Write: // 调用 nachos 系统函数 Write 就会 产生这个东西,SC_Write 在syscall.h 中有定义
result = SysWrite( (int)kernel->machine->ReadRegister(4), //向处理函数 SysWrite(见后) 传入参数

Nachos模拟操作系统的实验教学应用

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 的扩展 工作 可 以包含 以下几 个 内容 : 一是 进程 调度 ; 二 是 内存 管理 ; 是 文 件 系统 ; 三 四是 系统 调 用 ; 是 五

nachos_内存管理

nachos_内存管理

23
9

内存管理模块
Big-Endian与Little-Endian的比较
Union { long l;/*假设是在32位CPU上,sizeof(long) == 4*/ unsigned char c[4]; } u; u.L = 0x12345678; printf(“c[0] = 0x%x\n”, (unsigned)u.c[0]); printf(“c[1] = 0x%x\n”, (unsigned)u.c[1]); printf(“c[2] = 0x%x\n”, (unsigned)u.c[2]); printf(“c[3] = 0x%x\n”, (unsigned)u.c[3]);
2
内存管理模块
分页的管理和虚拟内存到物理内存的映射:
类TranslationEntry代表了一个页面映射关系:
virtualPage 在虚拟内存中的页面编号 physicalPage 在物理内存中的页面编号 Valid 此页面是否可用(是否被初始化) readOnly 此页面是否只读 Use 此页面是否被使用 Dirty 此页面是否被修改
将所有的寄存器设置为0将指令寄存器pcreg设置到0位置启始代码位置设置nextpcreg到4的位置一条指令占4byte将栈指针stackreg设置到地址空间的末尾nachos的堆栈是从高地址向低地址扩展的恢复状态将当前机器的页表设置为自己的页表开始运行虚拟机17内存管理模块内存管理模块改进的方案
操作系统-NachOS
22
内存管理模块
在Machine::Translate函数中,根据传入的虚地址查 找当前线程地址空间中的地址表(kernel>currentThread->space); 找到对应虚存表中的项,再根据虚拟页表的项判断 该页是在内存中还是在文件中.如果在内存中则直 接返回物理地址,否则返回一个缺页中断的异常. 在ExceptionHandler中处理这个异常,执行页面的 换入换出操作.

nachos01

nachos01

实验一体验Nachos下的并发程序设计实验简述1、在安装nachos2、实现双向链表3、线程切换的一些错误分析实验内容:1、安装nachos:首先是把nachos程序的文件code-linux.tar.gz拷贝到自己的UNIX账户下,然后将其解压,命令是tar -xzvf code-linux.tar.gz然后是测试安装有没有成功:编译,进入工作路径/nachos-3.4/code/threads执行make depend命令,这样就生成了一个名为nachos的可执行程序,运行输入命令./nachos便开始执行默认的功能(两条线程交互打印)2、实现双向链表:dllist.h 双向链表的头文件,以及里面的两个函数的声明 双向链表的具体方法的实现 调用的方法实现双向链表的有序插入和从头开始的删除里面的方法主要有两个:sortedinsert( ):实现双向链表的有序sortedremove( ):删除链表的头一个节点(first),在里面用一个for循环实现删除整个链表具体代码如下:---------------------------------------------------------------------------------------------------------------------- voiddllist::sortedinsert(void *item,int sortkey){dllelement *element=new dllelement(item,sortkey);dllelement *ptr;if(isempty()){ first=element;last=element;}else if(sortkey<first->key){element->next=first;first->prev=element;if(yield_type == 3)//线程切换点3//在first要指向新插入节点element是切换线程,导致程序错误,无法运行{ printf("switch yield_type = 3 \n");currentThread->Yield();}first=element;}else{if(yield_type == 4)//线程切换点4线程切换点4:在寻找插入点的时候(不是头节点)切换程序,导致排序错乱{printf("switch yield_type = 4 \n");currentThread->Yield();}for(ptr=first;ptr->next !=NULL;ptr=ptr->next){if(ptr->next->key>sortkey){element->prev=ptr;element->next=ptr->next;ptr->next->prev=element;ptr->next=element;return;}}last->next=element;element->prev=last;if(yield_type == 1)//线程切换点1//在last要指向新插入节点element是切换线程,导致节点丢失,{printf("switch yield_type = 1 \n");currentThread->Yield();}last=element;}}---------------------------------------------------------------------void *dllist::sortedremove(int *keyptr){ dllelement *element = first;void *thing;if (isempty())return NULL;if(keyptr != NULL)*keyptr = first->key;if(yield_type == 2)//线程切换点2//在准备删除的时候,切换程序,导致重复删除,节点删除不完全{printf("switch thread yield_type = 2 \n");currentThread->Yield();}thing = first->item;if (first == last){ // list had one item, now has nonefirst = NULL;last = NULL;}else{ element->prev=NULL;first = element->next;}delete element;return thing;}都是最基本的数据结构的知识,只是添加了一些参数进行参数线程切换里面是对上面两个函数的调用:dllist dl;char *item="abd";void dllbuild(int n,int which)//创建双向链表{//srand((unsigned)time(NULL));int i;for(int j=0;j<n;j++){i=rand()%100;dl.sortedinsert(item,i);printf("thread %d save key %d\n",which,i);}//dl.output();//printf("\n");}--------------------------------------------------------------------- void dlldeleteall(int n,int which)//删除双向链表(从头开始删){int k;for(int i=0;i<n;i++){dl.sortedremove(&k);printf("dllist thread %d delete element %dkey= %d\n",which,i,k);}}3、修改相关文件,实现多线程运行:的修改:仿造threadTest1的结构,代码如下://------------------------------------------------------------------ // set up dllist and sort\delete//----------------------------------------------------------------- voidSortAndDel(int which){ dllbuild(elenum,which);dlldeleteall(elenum,which);}//------------------------------------------------------------------ // ThreadTest2//------------------------------------------------------------------- voidThreadTest2(){ int i;DEBUG('t',"Entering ThreadTeat2");for(i=1;i<threadnum;i++){ Thread *t =new Thread("forkd dllist thread");t->Fork(SortAndDel,i);}SortAndDel(0);}voidThreadTest(){ switch (testnum) {case 1:ThreadTest1();break;case 2://双向链表ThreadTest2();break;default:printf("No test specified.\n");break;}}的修改:变量声明:extern int testnum;extern int threadnum;//线程数量extern int elenum;//双向链表节点的个数extern int yield_type;//线程切换点参数的输入:for (argc--, argv++; argc > 0; argc -= argCount, argv += argCount) { argCount = 1;switch (argv[0][1]) {case'q':testnum = atoi(argv[1]);argCount++;break;case't':threadnum = atoi(argv[1]);argCount++;break;case'n': elenum = atoi(argv[1]);argCount++;break;//双向链表节点个数case'y':yield_type= atoi(argv[1]);argCount++;break;default:testnum = 1;break;}}ThreadTest();实验结果及分析:1、修改nachos-3.4/code/mon中的THREAD_H、THREAD_C、THREAD_O:2、在nachos-3.4/code/threads/中依次执行make depend和make:4、程序执行的操作如下;-q 2 :表示运行threadTeat2( ),也就是双向链表的相关操作-t n:表示N个线程在运行-n n:表示双向链表有n个节点-y n:表示第n个线程切换点,试验中只有1、2、3、4 四个位置执行:./nachos –q 2 –t 2 –n 3 结果如下:两个线程按照顺序依次执行,结果没有错误执行:./nachos –q 2 –t 2 –n 3 –y 1 结果为:线程切换点1:在last要指向新插入节点element是切换线程,导致节点丢失,截图中可以看到,key=86的节点被覆盖掉了丢失了。

nachos系统管理与调度分析课程设计说明书-推荐下载

nachos系统管理与调度分析课程设计说明书-推荐下载
五、 测试........................................................................................................................................13 5、1 测试 NachOS 环境和交叉编译器 .............................................................................13 5、2 测试创建线程..............................................................................................................14 5、3 测试线程优先级..........................................................................................................15
三、 设计思路和程序结构..............................................................................................................8 3、1 线程的生成和状态转换................................................................................................8 3、1、1 基于五状态模型..............................................................................................8 3、1、2 线程创建过程..................................................................................................8 3、2 线程调度机制................................................................................................................8

Lab1Nachos系统调用.ppt

Lab1Nachos系统调用.ppt
switch (which) { case SyscallException:
switch(type) { case SC_Halt: DEBUG(dbgSys, "Shutdown, initiated by user program.\n"); SysHalt(); ASSERTNOTREACHED(); break;
int Write(char *buffer, int size, OpenFileId id);
/code/test/start.s
#include "syscall.h” start:
jal main move $4,$0 jal Exit .end __start Write: addiu $2,$0,SC_Write syscall j $31 .end Write
o week 13 ~ week 14
• 实验三:Nachos内存管理模块升级
o week 15 ~ week 17
实验一要求
• 实现Nachos的基本系统调用:
Write, Read, Exec, Join
/code/test/shell.c #include “syscall.h”
int main() {
系统调用概述3/6
• Nachos 系统调用
o Nachos的系统调用函数定义在Userprog\ksyscall.h头文件中,其 运行机制与linux 的系统调用相似。
o 在该文件中定义了两个系统调用,分别为: • SysHalt():实现中断操作 • SysAdd():实现两个数的相加操作
系统调用概述4/6
• 以Halt系统调用为例其它异常陷入的入口处理函数都是 Userprog下的ExceptionHandler函数,只是陷入的类型为 SyscallException。在test目录下的start.s模块中描述了具体的系 统调用过程

nachos系统实验报告范文实验三

nachos系统实验报告范文实验三

nachos系统实验报告范文实验三实验三一.实验目的学会运用实验二中实现的工具来实现一些多线程并发问题。

二.实验内容态。

线程想通过事件时必须等待事件被另外线程ignal。

只有当所有进入事件的线程完成动作时发出ignal的线程才将事件状态设为unignaled2)AlarmClock:AlarmClock让某个线程停止指定时间单位。

当事件到达时重新将线程放入就绪队列。

3)Bridge:Bridge是一个单行桥且最大允许3量车在桥上行驶。

实现应解决注意公平性与饥饿问题。

4)Elevator:实现Elevator类,并解决3个并发问题a)一个电梯,电梯容量无限。

b)一个电梯,电梯容量有限。

c)多个电梯。

三.实验结果1.EventBarrier类定义:主要函数1)Wait():线程挂起待事件被ignal,当事件已经处于ignaled状态时直接return测试结果:测试中主线程来释放Signal信号。

另4个线程做为等待线程,名字分别为Thread1~4。

Thread1,2在主线程Signal之前就调用Wait()函数,Thread3,4在事件被标志Signaled状态时才调用Wait()。

最终结果如下图所示,事件在四个线程都repone自后才改变状态,四个线程个主线程都运行正确。

Thread1,2进入等待ignal事件2.AlarmClock类定义claAlarm{public:Alarm();~Alarm();voidPaue(inthowLong);voidTh readRetart();private:LockO某lock;ConditionP某conLock;};主要函数://让线程在howLong事件后开始运行//闹钟结束后重新开始运行线程//此条件变量里的线程队列是按照优先级排列的//每次运行优先级最高的线程voidAlarm::ThreadRetart(){conLock->Signal(NULL);}taticvoidTimeUP(intNoUe){alarmClock->ThreadRetart();}voidAlarm::Paue(inthowLong){lock->Acquire();interrupt->Schedule(TimeUP,0,howLong,AlarmInt);conLock->Wait(lock,tat->totalTick+howLong);lock->Releae();}1)Paue(inthowLong):让事件停止howLong个时间单位。

海纳思系统常用命令

海纳思系统常用命令

海纳思系统常用命令一、查看文件和目录在海纳思系统中,我们可以使用ls命令来查看当前目录下的文件和子目录。

该命令会列出当前目录下的所有文件和目录的名称。

如果想要查看某个目录的详细信息,可以使用ls -l命令,它会显示文件的权限、所有者、大小、创建时间等详细信息。

二、切换目录在使用海纳思系统时,我们经常需要切换目录来进行文件的操作。

使用cd命令可以实现目录之间的切换。

例如,要进入名为"documents"的子目录,可以使用cd documents命令。

如果想要返回上一级目录,可以使用cd ..命令。

三、创建目录在海纳思系统中,我们可以使用mkdir命令来创建新的目录。

例如,要在当前目录下创建一个名为"images"的目录,可以使用mkdir images命令。

如果想要创建多级目录,可以使用mkdir -p命令。

例如,要创建一个名为"documents/files"的多级目录,可以使用mkdir -p documents/files命令。

四、复制文件和目录在海纳思系统中,我们可以使用cp命令来复制文件和目录。

例如,要将一个名为"file1.txt"的文件复制到"documents"目录下,可以使用cp file1.txt documents命令。

如果想要复制整个目录及其内容,可以使用cp -r命令。

例如,要将一个名为"files"的目录复制到"documents"目录下,可以使用cp -r files documents命令。

五、移动文件和目录在海纳思系统中,我们可以使用mv命令来移动文件和目录。

例如,要将一个名为"file1.txt"的文件移动到"documents"目录下,可以使用mv file1.txt documents命令。

Nachos系统调用实习报告

Nachos系统调用实习报告

Nachos系统调用实习报告在本次实习中,我参与了Nachos系统的开发与优化工作。

Nachos是一款开源的嵌入式操作系统,旨在提供安全、高效和可靠的计算环境。

通过实习,我希望能够更深入地理解操作系统的内部机制,提升我的系统编程技能,并且在实际项目中运用所学知识。

在进行系统调用设计时,遇到了参数传递的问题。

经过研究,我们决定采用寄存器传递参数,并优化了寄存器的使用方式,提高了调用效率。

在实现文件系统时,遇到了读写性能的问题。

我们通过对文件系统进行优化,包括缓存机制、文件分割等手段,有效地提高了读写性能。

在多任务调度中,遇到了任务优先级冲突的问题。

我们通过引入任务调度器,实现了任务的动态优先级调整,解决了冲突问题。

团队合作:在实习期间,我与团队成员积极沟通,共同解决了许多问题。

我们经常进行技术讨论,分享解决方案,共同优化系统性能。

这种团队合作的方式让我收获颇丰。

在实习过程中,我运用了所学的操作系统知识,如进程管理、文件系统、设备驱动等,对Nachos系统进行优化。

同时,我还学习了汇编语言、C语言以及嵌入式开发的相关知识,并将其应用到实际项目中。

这些知识的应用让我对操作系统有了更深入的理解。

通过实习,我更加深入地理解了操作系统的内部机制和实现方法。

我学会了如何在实际项目中运用所学知识,提高了我的系统编程技能。

我认识到团队合作的重要性,学会了如何与他人协作解决问题。

我认识到自我学习和持续进步的重要性,需要在工作中不断学习和提升。

对某些专业知识掌握不够深入,需要进一步学习。

在解决问题时,有时过于急躁,需要更加耐心地思考和分析问题。

通过本次实习,我更加深入地理解了操作系统的内部机制和实现方法,提高了我的系统编程技能和解决问题的能力。

我也认识到团队合作的重要性,学会了如何与他人协作解决问题。

这些经验和收获将对我未来的学习和工作产生积极的影响。

在过去的六个月中,我有幸在XYZ科技公司的Nachos团队实习,专注于文件系统的开发与优化。

Nachos的安装和配置

Nachos的安装和配置

实验一:Nachos的安装和配置1.实验目的(1)熟悉和掌握nachos 4.1的安装与配置;(2)理解并掌握编译交叉编译工具coff2noff的生成过程和原理;(3)熟悉和理解gcc-3.4.6使得nachos可以进行编译的机制和原理。

2.实验内容(1)在ubuntu14.04中;(2)安装并编译Nachos 4.1;(3)安装并编译交叉编译工具coff2noff3.实验方法(实验步骤)第一步:安装最新版本的ncurses-dev、bison、flex和build-essential第二步:下载gcc-3.4.6,并复制到指定目录,使用dpkg工具进行安装gcc-3.4.6 第三步:安装gcc完成后,检查安装的gcc版本有哪些,当有其他版本时,将更改gcc3.4.6版本的优先级为最高级,使其替代掉原本的gcc版本。

第四步:对Nachos进行安装和编译,下载nachos 4.1的安装包,将其复制到指定目录下,然后使用tar命令解压该压缩安装包第五步:下载好的交叉编译工具包(mips-decstation. linux-xgcc.gz) 复制到根目录下并解包,然后配置并编译生成coff2noff工具第六步:当coff2noff编译错误时,根据错误信息分别进入指定目录进行符号链接的创建第七步:coff2noff配置无误后,使用make命令进行编译生成coff2noff工具第八步:coff2noff工具生成后,进入nachos test目录的配置文件Makefile.dep 第九步:使用gedit进行文件编辑时将CPP和GCCDIR进行修改第十步:根据gedit的错误进行sysdep.h文件和nachos的Makefile文件进行修改第十一步:使用make depend命令生成配置文件,make命令开始编译第十二步:安装完成后运行已经生成的nachos的可执行文件,看到线程结果即安装完成。

4.实验过程(源代码、配置清单必须带注释)1. 安装ncurses-dev:2. 安装bison:3. 安装flex:4. 安装build-essential在/mnt 下新建名为gcc-3.4.6的目录。

nachos_文件系统

nachos_文件系统
操作系统-NachOS
1
文件系统升级
磁盘类Disk模拟了一个异步的磁盘.
什么是同步/异步:
同步: 所谓同步,就是在发出一个功能调用时,在没有 得到结果之前,该调用就不返回。 异步: 异步的概念和同步相对。当一个异步过程调用 发出后,调用者不能立刻得到结果。实际处理这个调 用的部件在完成后,通过状态、通知和回调来通知调 用者
2
文件系统升级
磁盘异步读写:
CPU发出读写请求,不需要 等待执行完成. 磁盘接收请求后自行完成 读写操作. CPU可自行执行其他事务. 磁盘读/写操作执行完毕后, 通过中断,回调或其他方式 通知CPU.
.
3
文件系统升级
NachOS如何通过同步的文件读写函数模拟异 步磁盘的?
Disk类本身是个回调对象,通过中断回调模拟磁盘 读写完成后发回CPU的消息. 它接受一个回调对象作为读写操作执行后的事件 通知.
20
文件系统升级
文件系统的多线程访问机制:
目前无法实现多线程访问,问题出现在SynchDisk 中. 同步磁盘同一时间只能进行一次读/写操作. 修改方案:
多个线程不能同时对一个文件进行写操作,因为会发生 冲突,但是可以同时进行读操作. 将简单的通过信号量进行控制的同步机制修改为读者/ 写者问题的机制.
打开目录结构 查找是否存在此文件,如果存在返回false 打开空闲表,查找一个空闲的扇区,如果磁盘没有空间则返 回false false 根据名字和文件头扇区向目录结构中添加此文件的记录 创建文件头,并通过Allocate函数和freemap分配文件空间 将文件头写入先前取得的文件头扇区 更新磁盘中的目录文件和空闲表文件
21
文件系统升级
目录结构的多级机制:

Nachos操作系统部分实验说明

Nachos操作系统部分实验说明
} 5、修改 文件中的调度类成员函数,使其按线程优先数大
………
新的设计的实验内容和步骤:
重新执行../lab2中的make 重新执行./nachos –rs 10
可以看到新内核的输出按规定的静态优先数次序在并发执行:
Name:Main Num:0 looped:0 Name:T1 Num:1 looped:0 Name:T2 Num:2 looped:0 Name:T1 Num:1 looped:1 Name:T2 Num:2 looped:1 Name:T1 Num:1 looped:2 ……
以上设计实验输出结果的分析:
主线程首先执行后放弃CPU,T1优先级最高排在队首先被选中。主线程由于优 先级最低被排在队列尾。
T1 线程放弃 CPU,当前 T2 在队首先被选中。T1 优先级最高又被排在队首。 T2线程放弃CPU,当前T1在队首先被选中。T2被排在队首。 如此重复5次,T1和T2线程执行结束,队列中仅有主线程了。主线程连续执行 4次后结束工作。
………… private:
………….. int Priority;//线程的优先数 } 4、在构造线程类时为线程设置一个静态优先数: 在 中的 Thread::Thread(char * debugName,int priority)
{ ……. Priority = priority;
一、内核线程调度策略设计
设计目标:
在 Nachos 系统中实现按优先数调度线程, 研究各种调度策略算法的实现, 分析各种调度算法的性能。 …..
设计背景:
从 Nachos 系统的基本内核./threads/ 文件中可以看出 Nachos 系统的基本内核实现了先进先出的调度策略。
调度类 Scheduler 管理着一个就绪队列 list。它的成员函数 ReadyToRun(currentThread)将当前线程挂入该队列的队尾: Scheduler::ReadyToRun (Thread *thread) {

操作系统实习-第一部分线程机制实习说明

操作系统实习-第一部分线程机制实习说明

2010-2011第二学期“Nachos实习”第一部分 线程机制实习说明时间安排时间内容第2周 2.28 ~3.6 线程调度第3周 3.7 ~3.13 锁&条件变量第4周 3.14 ~3.20 同步&互斥第5周 3.21 ~3.27 Challenges 第一部分报告提交时间3月27日时间24:00推迟报告提交时间4月4日时间24:00实习内容本次实习希望通过修改Nachos系统平台的底层源代码来实现以下目标:第2周实现基于优先级的抢占式线程调度Exercise 1 扩展线程的数据结构增加“用户ID、线程ID”两个数据成员,同时在Nachos现有的线程管理机制中增加对这两个数据成员的维护机制。

增加“挂起(suspending)”状态,即可以将当前线程映像保存在磁盘文件而不是内存中。

Exercise 2 增加全局性线程管理机制在Nachos中增加对线程数量的限制,使得Nachos中最多能够同时存在128个用户线程。

Exercise 3 修改线程调度算法,实现基于优先级的抢占式调度算法第2周完成同步机制:锁和条件变量Exercise 实现锁和条件变量a)阅读源代码code/threads/下synch.h,和,了解原语操作b)实现锁和条件变量可以使用sleep和wakeup两个原语操作(注意屏蔽系统中断),也可以使用Semaphore作为唯一同步原语(不必自己编写开关中断的代码)第4周同步互斥机制应用Exercise 实现同步互斥实例基于Nachos中的信号量、锁和条件变量,采用两种方式实现同步和互斥机制应用(其中使用条件变量实现同步互斥机制为必选题目)。

具体可选择“生产者-消费者问题”、“读者-写者问题”、“哲学家就餐问题”、“睡眠理发师问题”等。

(可选择其他经典的同步互斥问题)第5周 Challenges题目(必做其中一个,也可选做多个)Exercise 1 Send/Receive机制为Nachos的线程管理模块增加通过Send/Receive进行通信的机制。

Nachos源码分析与补充完善

Nachos源码分析与补充完善

山东科技大学信息学院eagle_ 姓名XXX 学号20060105XXXX 班级计算机(计算机科学方向)06-2班指导教师X X 撰写日期2009年1月1日山东科技大学信息学院eagle_ ........................................................................ .................................................. 31、概述................................................................................................. ................................ 32机器模拟................................................................................................. ........................... 43进程管理................................................................................................. ........................... 83.1 Nachos进程概述................................................................................................. ........ 83.2 线程运行与切换................................................................................................. ..... 124. CPU调度................................................................................................. ......................... 145. 用户程序的运行................................................................................................. ........... 166.系统调用................................................................................................. .........................18Nachos ...................................................................................... ................... 201.系统调用部分................................................................................................. ................. 202. 进程调度部分................................................................................................. ............... 24 山东科技大学信息学院eagle_ 一、1 Nachos(全称为Not Another Completely Heuristic Operating System)是加州大学伯克利分校开发的教学用操作系统。

NachOS实验报告(4个全)

NachOS实验报告(4个全)

四川大学操作系统课程设计报告学院:软件学院专业:软件工程专业年级:08级组编号:组成员:提交时间:2010年6月24日指导教师评阅意见:.. . . .指导教师评阅成绩:::实验项目一项目名称:开发Shell程序试验背景知识Shell此处的shell是指命令行式的shell。

文字操作系统与外部最主要的接口就叫做shell。

shell是操作系统最外面的一层。

shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。

shell提供了你与操作系统之间通讯的方式。

这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。

shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。

本质上,shell script是命令行命令简单的组合到一个文件里面。

Shell基本上是一个命令解释器,类似于DOS下的。

它接收用户命令(如ls等),然后调用相应的应用程序。

较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。

交互式shell和非交互式shell交互式模式就是shell等待你的输入,并且执行你提交的命令。

这种模式被称作交互式是因为shell与用户进行交互。

这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。

当你签退后,shell也终止了。

shell也可以运行在另外一种模式:非交互式模式。

在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。

当它读到文件的结尾,shell也就终止了。

实验目的:Shell是一个命令处理器(command processor)——是一个读入并解释你输入的命令的程序,它是介于使用者和操作系统之核心程序(kernel)间的一个接口。

它是一个交互性命令解释器。

shell 独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。

Nachos工作原理

Nachos工作原理
o Run some system testing: • Thread testing, console testing, and netwo20r2k1/4/9 9
Nachos如何工作(7/13)
o Invoke user program if any. Otherwise terminate Nachos. o create an address space to run a user process // AddrSpace *space = new AddrSpace; o code/userprog/ o load program into MIPS machine’s main memory // space->Load(userProgName); o run the program // space->Execute(); code/userprog/ AddrSpace::Execute() • Jump to run the user program // kernel->machine->Run(); code/machine/
2021/4/9 18
课程实践(2/3)
• Task 2 下图是启动Nachos的时候打印出的调 试信息。请在自己的机器上运行Task 1的启动命令,对运行后的桌面进行截 图(应和下图类似),并用文字对截图 中每一行调试信息进行说明。
2021/4/9 19
课程实践(3/3)
2021/4/9 20
Nachos如何工作
week09
2021/4/9 1
目录
• Nachos如何工作 • 课程实践
2021/4/9 2
目录
• Nachos如何工作 • 课程实践
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

——以下是我自己写的,人格担保!
计算机科学与技术学院实验报告
在子进程中,pid 的值为零。

在系统启动时由核心内部地创建的进程0是唯一不通过系统调用fork 而创建的进程。

Fork之后用exec 来执行新进程的代码。

2、描述一下nachos中怎样创建一个线程?
答:Thread::Thread(char* threadName)
{
name = threadName;
stackTop = NULL;
stack = NULL;
status = JUST_CREATED;
#ifdef USER_PROGRAM
space = NULL;
#endif
}
void
Thread::Fork(VoidFunctionPtr func, _int arg)
{
#ifdef HOST_ALPHA
DEBUG('t', "Forking thread \"%s\" with func = 0x%lx, arg = %ld\n",
name, (long) func, arg);
#else
movl %ebx,_EBX(%eax) # save registers
movl %ecx,_ECX(%eax)
movl %edx,_EDX(%eax)
movl %esi,_ESI(%eax)
movl %edi,_EDI(%eax)
movl %ebp,_EBP(%eax)
movl %esp,_ESP(%eax) # save stack pointer
movl _eax_save,%ebx # get the saved value of eax
movl %ebx,_EAX(%eax) # store it
movl 0(%esp),%ebx # get return address from stack into ebx
movl %ebx,_PC(%eax) # save it into the pc storage
movl 8(%esp),%eax # move pointer to t2 into eax
movl _EAX(%eax),%ebx # get new value for eax into ebx
movl %ebx,_eax_save # save it
movl _EBX(%eax),%ebx # retore old registers
movl _ECX(%eax),%ecx
movl _EDX(%eax),%edx
movl _ESI(%eax),%esi
movl _EDI(%eax),%edi
movl _EBP(%eax),%ebp。

相关文档
最新文档