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

上传人:b****7 文档编号:24058072 上传时间:2023-05-23 格式:DOCX 页数:23 大小:951.09KB
下载 相关 举报
nachos系统管理与调度分析课程设计说明书.docx_第1页
第1页 / 共23页
nachos系统管理与调度分析课程设计说明书.docx_第2页
第2页 / 共23页
nachos系统管理与调度分析课程设计说明书.docx_第3页
第3页 / 共23页
nachos系统管理与调度分析课程设计说明书.docx_第4页
第4页 / 共23页
nachos系统管理与调度分析课程设计说明书.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

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

《nachos系统管理与调度分析课程设计说明书.docx》由会员分享,可在线阅读,更多相关《nachos系统管理与调度分析课程设计说明书.docx(23页珍藏版)》请在冰豆网上搜索。

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

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

操作系统课程设计

基于NachOS的课程设计

 

目录

一、背景知识1

1、1Nachos的介绍1

1、2Nachos的目录结构2

1、3线程基础知识3

二、设计要求和目的4

2、1Nachos的线程管理模块4

2、2Nachos的线程线程调度算法分析4

2、3编程语言选择对比5

2、4开发环境配置6

2、5NachOS系统和交叉编译器安装6

2、5、1NachOS系统安装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、1Nachos的介绍

Nachos的全称是“NotAnotherCompletelyHeuristicOperatingSystem”,是一个可修改和跟踪的操作系统教学软件。

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

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

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

免费的开源开发包可通过网络下载,通常包括以下几部分:

1)NachOS概述

2)简单可运行的操作系统代码

3)模拟器——个人电脑或工作站

4)任务样本:

任务说明和现代操作系统涉及的所有项,包括线程和并发,多道程序,系统调用,虚拟内存管理,文件系统管理,网络协议,远程过程调用和分布式系统。

5)C++编程索引(NachOS是C++子集编程,简单易学。

这个索引将对C语言程序员有所帮助)

Nachos操作系统本身只提供了一套框架,很多地方的实现都需要我们自己来完善,因此我们可以通过修改其源代码,来丰富和增强Nachos操作系统的功能.更可以在完善这些功能的同时,了解操作系统的内部运行机制.

Nachos模拟了MIPSR2/3000的指令集、主存、中断系统、网络以及磁盘系统等操作系统所必须的硬件系统。

用软件模拟硬件的可靠性比真实硬件高得多,不会因为硬件故障而导致系统出错,便于调试。

虚拟机可以在运行时报告详尽的出错信息,更重要的是采用虚拟机使Nachos的移植变得非常容易,在不同机器上移植Nachos,只需对虚拟机部分作移植即可。

MIPSR2/3000的指令集的优势:

RISC指令集,指令书目少,Nachos模拟其中的63条。

编译器:

GCC可直接将C/C++源程序编译成该指令集的目标代码,而不必重写编译器。

Nachos是一个在宿主机上运行的进程,采用双CPU,即一个宿主CPU,一个虚拟机CPU,不确定性是操作系统所必须具有的特征,而Nachos采用随机因子模拟真实操作系统的不确定性,使系统运行更加真实。

Nachos是一个可扩展的操作系统,可发挥自己的创造性进行扩展。

Nachos限制:

只有一级索引结构限制了系统中最大文件的大小。

Nachos可以用面向对象的思想实现,面向对象的方法能清楚的描述操作系统的各个部分的接口,但是又没有全面的运用到面向对象的性质,例如继承性、多态性,这使得代码更易读和理解。

Nachos分五个功能模块:

机器模拟、线程管理、文件系统管理、用户程序和虚拟存储以及网络系统。

由于Nachos开发没有针对windows平台的移植,Nachos需要在虚拟机上实现,所以需要首先实现创建虚拟机,创建linux虚拟机来实现nachos代码的编译运行。

Nachos运行时更像一个进程,但是它是完全按照操作系统思想开发的操作系统内核,具有完整的操作系统结构。

Nachos系统结构,作为一个简单的系统编程,网络协议和文件系统只需够用即可,这里主要设计线程管理和虚拟内存,在设计时虚拟内存可以暂时不要考虑。

而其他的则可以由现有系统提供,为此,线程管理为主要任务。

1、2Nachos的目录结构

copyright文件Nachos的版权信息

readme文件Nachos的readme信息

nachos.ps文件Nachos的介绍文档(Postscript格式)

c++example目录有关C++介绍和实例

doc目录Nachos各个部分介绍和原有的作业要求

code目录Nachos各个部分的源代码

最主要的Nachos的源代码部分

Makefile

Makefile.dep

Nachos的Makefile文件,当Nachos需要移植到其它系统时,可以修改Makefile.dep中的HOST参数

machine目录Nachos虚拟机模拟部分源代码

threads目录Nachos线程管理部分源代码

filesys目录Nachos文件系统管理部分源代码

userprog目录Nachos用户程序部分源代码

network目录Nachos网络管理部分源代码

vm目录Nachos虚拟内存管理部分源代码

test目录一些测试用应用程序

bin目录包含有用户程序目标码变换的程序

1、3线程基础知识

线程基本概念:

是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

由于线程之间的相互制约,致使线程在运行中呈现出间断性。

线程状态:

就绪、阻塞和运行三种基本状态。

线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定.线程的运行中需要使用计算机的内存资源和CPU

线程的周期

新建就绪运行阻塞死亡

线程调度与优先级

有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度.

线程组

每个线程都是一个线程组的一个成员,线程组把多个线程集成一个对象,通过线程组可以同时对其中的多个线程进行操作.在生成线程时必须将线程放在指定的线程组,也可以放在缺省的线程组中,缺省的就是生成该线程的线程所在的线程组.一旦一个线程加入了某个线程组,不能被移出这个组.

进程和线程的关系

在引入线程机制后,进程不再是单一的动态实体,而是由两部分组成:

􀁺各线程活动的环境,包括:

统一的地址控件、全局变量、打开文件和计时器等。

􀁺若干个线程,它们是进程中的活动部分,也是处理机的调度单位,而进程不再是处理机

的最小调度单位。

一个进程中的所有线程在同一地址空间中活动,共享该地址空间中的全局变量,共享打开文

件和计时器等。

它们总是相互协作,各自承担一个作业中的某个部分。

与传统的进程相似,

线程具有状态的变化。

通常,这些状态是:

运行、阻塞、就绪或终止。

 

二、设计要求和目的

Nachos的运宿主机通过软件模拟了各种硬件系统,包括中断系统、存储系统、磁盘文件行必须借助于、网络等。

它的运行是可以跟踪的,因此,我们可以一步一步的观察操作系统是如何运行的.

对于线程的管理,主要涉及到线程的扩充、nachos线程的调度机制和线程优先级。

2、1Nachos的线程管理模块

Nachos平台所使用的是非抢占式调度,线程一旦占用CPU,就会一直运行到结束或者被阻塞(等待I/O事件);Nachos平台中的线程数据结构定义非常简单,并无用户ID、线程ID等数据成员,也就是说,无法基于线程的ID来实现通信、同步互斥等机制。

Nachos平台中并无全局性的线程管理机制,并未限制线程的数目,也无法了解有多少线程存在。

通过修改Nachos系统平台的底层源代码来实现以下目标:

1.扩充线程数据结构。

增加“用户ID、线程ID”两个数据成员,同时在Nachos现有的线程管理机制中增加对这两个数据成员的维护机制。

2.扩展现有的线程状态。

Nachos平台中的线程状态只有“初启态”、“就绪态”、“阻塞态”、“运行态”四种情况。

请增加“挂起(suspending)”这个状态,所谓“挂起”是指当前的线程映象保存在磁盘文件而不是内存中。

“挂起”状态是未来实现“虚拟内存管理”的重要基础。

3.修改线程调度算法。

将Nachos平台的线程管理机制调整为“抢占式”。

具体可选择“时间片轮转”、“优先级调度”、“多级队列”等不同的调度算法。

4.增加全局性的线程管理机制。

扩充Nachos平台的现有操作命令,例如可以增加一个名为“ThreadView”的命令,执行该命令,可以在屏幕上显示目前所有存在的线程信息,包括“用户ID“、“线程ID”、“当前状态”等。

5.实现一个同步与互斥的例子。

在完成以上修改后,可编写一个实例程序,来实现某个“同步-互斥”经典问题的正确解法。

例如可选择“哲学家就餐”问题,实例程序会创建5个哲学家线程,这些线程拥有同样的用户ID,可以遵循“信号量”机制来正确的运行。

也可以选择“生产者-消费者”问题等其他经典IPC问题。

2、2Nachos的线程线程调度算法分析

Nachos平台所使用的是非抢占式调度,线程一旦占用CPU,就会一直运行到结束或者被阻塞(等待I/O事件);Nachos平台中的线程数据结构定义非常简单,并无用户ID、线程ID等数据成员,也就是说,无法基于线程的ID来实现通信、同步互斥等机制。

Nachos平台中并无全局性的线程管理机制,并未限制线程的数目,也无法了解有多少线程存在。

Sysdep模块实现机制分析:

sysdep.ccsysdep.h

屏蔽OS间的系统调用或函数调用在形式和内容上可能有的细微差别

中断处理模块实现机制分析:

interrupt.cc.h

模拟底层中断机制——时钟中断、磁盘中断、终端读/写中断、网络接收/发送中断

时钟中断模块实现机制分析:

timer.cc.h

模拟时钟中断,在nachos指定线程随机切换时启动时钟中断,在每次的时钟中断处理的最后加入线程的切换

终端设备模块实现机制分析:

console.cc.h

模拟终端输入和输出,键盘的输入和显示输出,异步,当发出终端的输入输出请求后系统即返回,需要等待中断发生后才是真正完成了整个过程。

磁盘设备模块实现机制分析:

disk.cc.h

模拟物理磁盘,nachos用宿主机种的一个文件模拟单面物理磁盘,异步

工具模块:

list.cc.hutility.cc.h

定义链表结构及操作

线程启动和调度模块:

switch.sswitch.h

线程定义模块:

thread.cc.h

线程调度算法模块:

scheduler.cc.h

nachos主控模块:

main.ccsystem.ccsystem.h

nachos系统入口,分析nachos命令行参数,根据不同的选项进行不同功能的初始化设置

同步磁盘:

文件synchdisk.cc.h

文件系统模块:

filesys.cc.h

模拟创建文件、删除文件、打开文件操作

文件头模块:

文件filehdr.cc.h

打开文件结构:

文件openfile.cc.h

目录模块:

directory.cc.h

machine.h:

包含了内存的相关定义

machine.cc:

包含了对内存和页表的初始化

translate.h:

定义了页表结构

translate.cc:

包含了地址转换的实现以及读、写内存的操作

address.cc:

包含了用户程序页表的操作

2、3编程语言选择对比

Java编程的优势:

1.简单,面向对象,稳定,跨平台,多线程,动态

2.面向对象基于对象的编程更符合人的思维模式,更容易编写程序

3.类运行时动态加载,使得Java可以在分布式环境下动态的维护程序及类库,当类库升级时也不必重新修改、编译。

缺点:

程序速度较慢,不适合做实时性很强的开发

C++编程的优势:

1.增加了面向对象的思想,但是又兼具面向过程的方法

2.兼容C

缺点:

指针调用完成后需要手工释放内存,容易造成内存泄露而程序崩溃

2、4开发环境配置

开发环境配置:

类型

标准配置

计算机硬件

内存1G;CPUCorei332位

软件

Windows7;ubuntu10.04

交叉编译器

GCC2.95.4

运行环境配置:

类型

标准配置

计算机硬件

内存1G;CPUCorei332位

软件

Windows7;ubuntu10.04

交叉编译器

GCC2.95.4

2、5NachOS系统和交叉编译器安装

2、5、1NachOS系统安装

ubuntu10.04

gcc-vReadingspecsfrom/usr/lib/gcc-lib/i486-linux-gnu/2.95.4/specs

gccversion2.95.420011002(Debianprerelease)

1、解压NachOS-4.1.tgz

root@ubuntu:

~$tar-zxvfNachOS-4.1.gz

2、运行makedepend

root@ubuntu:

~/桌面/NachOS-4.1/code/build.linux#makedepend

3、运行make

root@ubuntu:

~/桌面/NachOS-4.1/code/build.linux#make

4、运行nachos

root@ubuntu:

~/桌面/NachOS-4.1/code/build.linux#./nachos

testssummary:

ok:

0

Machinehalting!

Ticks:

total10,idle0,system10,user0

DiskI/O:

reads0,writes0

ConsoleI/O:

reads0,writes0

Paging:

faults0

NetworkI/O:

packetsreceived0,sent0

2、5、2交叉编译器环境的安装

在编译前直接解压到local根目录下

1、编译生成coff2noff工具:

运行configre

2.运行make生成coff2noff

3.编译test目录下文件

修改test/Makefile.dep中变量cpp和GCCDIR为正确的交叉编译器路径

root@ubuntu:

~/NachOS-4.1/code/test#vimMakefile.dep

4.编译test目录中的程序

root@ubuntu:

~/NachOS-4.1/code/test#make

root@ubuntu:

~/NachOS-4.1/code/test#ls*.noff

add.noffhalt.noffopen.noffshell.noffwrite.noff

exec.noffmatmult.noffread.noffsort.noff

5、执行NachOS格式文件

root@ubuntu:

~/NachOS-4.1/code/build.linux#./nachos-x../test/halt.noff

testssummary:

ok:

0

Machinehalting!

Ticks:

total21,idle0,system10,user11

DiskI/O:

reads0,writes0

ConsoleI/O:

reads0,writes0

Paging:

faults0

NetworkI/O:

packetsreceived0,sent0

 

3、设计思路和程序结构

3、1线程的生成和状态转换

3、1、1基于五状态模型

3、1、2线程创建过程

扩充线程管理,使其最多同时存在128个线程,测试创建线程

1)在Thread类中增加静态成员变量threadNum表示当前线程的总数量

2)Fork()创建一个线程时,threadNum加1,当线程总数超过128个线程时,程序终止。

并打印终止信息

3)当一个线程终止时threadNum减1

4)当系统关闭时,所有线程都结束

3、2线程调度机制

当前的NachOS系统中,线程没有优先级,每次将线程放入到就绪队列时即是将线程放到队尾,因此若要改变系统调用的线程顺序则需要确定各线程的优先级。

扩充线程调度机制,测试线程数为3个

1)在Scheduler类中增加一个成员函数,表示线程的优先级,增加静态的优先级调度

2)在Thread类中增加一个函数来对就绪队列中的线程根据优先级进行排序,将优先级最高的放到队首

3)先将线程放入就绪队列,然后排序,最后从中选择下一条要执行的线程

4)具有优先级的线程将不再按照顺序执行而是根据线程的优先级执行

 

4、关键代码分析

4、1扩充线程管理

code/threads/下的thread.cc和thread.h是线程管理部分的文件

代码修改:

Thread.h

定义静态成员变量threadNum表示线程数量

Thread.cc

 

SelfTest()测试创建线程

4、2扩充线程调度机制

代码修改:

Scheduler类中添加全局静态优先级

Thread.h

Thread.cc

4、3扩充线程调度机制改进

4、3、1信号量机制

classSemaphore{

public:

voidP();

核心操作:

//禁止中断,并保存初始中断状态。

因为开始时中断也可能处于被禁止//状态,所以操作结束后要恢复到初始状态而不是使能中断。

IntStatusoldLevel=interrupt->SetLevel(IntOff);

//当信号量为0时,将当前进程放到等待队列里面,并设置为睡眠模式,

//参数值为FALSE表示,进程没有正常结束而要被挂起。

voidV();

核心操作:

//禁止中断

IntStatusoldLevel=interrupt->SetLevel(IntOff);

//如果队列不为空说明有当前进程因为要临界资源被别的进程访问而挂//起,所以V操作首先应将当前进程设置为READY状态,以继续运行并//访问临界资源

private:

intvalue;//信号量值(>=0)

List*queue;//线程等待队列

};

 

信号量的私有属性有信号量的值,它是一个阀门。

线程等待队列中存放所有等待该信号量的线程。

信号量有两个操作:

P操作和V操作,这两个操作都是原子操作。

P操作

1.当value等于0时,

1.1.将当前运行线程放入线程等待队列。

1.2.当前运行线程进入睡眠状态,并切换到其它线程运行。

2.当value大于0时,value--。

V操作

1.如果线程等待队列中有等待该信号量的线程,取出其中一个将其设置成就绪态,准备运行。

2.value++;

4、3、2实现用户更改进程优先级

intSysWrite(char*buffer,intsize,OpenFileIdid);

intSysRead(char*buffer,intsize,OpenFileIdid);

SpaceIdSysExec(char*exec_name);

intSysJoin(SpaceIdid);

intSysStrncmp(char*buffer,char*str,intn)

除此外添加一个处理异常的类

Exception.cc

相应的需要修改shell类中的代码,进行测试

root@ubuntu:

~/桌面/NachOS-4.1/code/build.linux#./nachos-x../test/shell.noff

 

5、测试

5、1测试NachOS环境和交叉编译器

root@ubuntu:

~/桌面/18新/a测试创建线程/NachOS-4.1/code/build.linux#make

g++-ftemplate-depth-100-Wno-deprecated-g-Wall-I../network-I../filesys-I../userprog-I../threads-I../machine-I../lib-DFILESYS_STUB-DRDATA-DSIM_FIX-DTUT-Dx86-DLINUX-DCHANGED-c../threads/thread.cc

../threads/thread.cc:

Inmemberfunction‘voidThread:

:

SelfTest()’:

../threads/thread.cc:

471:

warning:

deprecatedconversionfromstringconstantto‘char*’

g++bitmap.odebug.olibtest.osysdep.ointerrupt.ostats.otimer.oconsole.omachine.omipssim.otranslate.onetwork.odisk.oalarm.okernel.omain.oscheduler.osynch.othread.oaddrspace.oexception.osynchconsole.odirectory.ofilehdr.ofilesys.opbitmap.oopenfile.osynchdisk.opost.oswitch.o-onachos

root@ubuntu:

~/桌面/18新/a测试创建线程/NachOS-4.1/code/build.linux#./nachos

root@ubuntu:

~/桌面/18新/a测试创建线程/NachOS-4.1/code/build.linux#./nachos-x../test/halt.noff

5、2测试创建线程

root@ubuntu:

~/桌面/18新/a测试创建线程/NachOS-4.1/code/build.linux#./nachos-K

5、3测试线程优先级

root@ubuntu:

~/NachOS-4.1/code/build.linux#./nachos-K

6、总结

通过这次对nachos线程机制的扩充

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1