📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: raner (lilo), 信区: Linux <BR>标 题: NACHOS论坛(4) <BR>发信站: BBS 水木调试站 (Thu Jun 4 16:48:44 1998) <BR> <BR>作 家: solmon (所罗门王) on board 'Unix' <BR>题 目: NACHOS论坛(4) <BR>来 源: 鼓浪听涛站 <BR>日 期: Thu Mar 6 23:05:32 1997 <BR>出 处: <A HREF="mailto:mysu@JingXian.xmu.edu.cn">mysu@JingXian.xmu.edu.cn</A> <BR> <BR> 第四章 网络及虚拟内存 <BR> <BR> <BR> Nachos的网络的实现分为两层:Network和PostOffice.首先,请您不要误解Network <BR>的含义,它并不是一个网络操作系统,而是Nachos操作系统在接收或发送网络信息时的 <BR>管理模块.换句话说,Nachos的Network只管本地机对网络信息的处理,它并不关心网络 <BR>是如何实现信息传递的.Network的结构是,每个主机上有一个邮局(PostOffice)来负责 <BR>处理用户的Network请求.每个邮局中有几个信箱(MailBox),它存放着从网络上接收到 <BR>的信息. <BR> <BR> 如果一个Nachos进程要通过网络将信息从本地发往另一个Nachos工作站,它首先要 <BR>象现实生活中那样先填写收信人,发信人的地址.地址由两部分组成:1.节点地址;2.信 <BR>箱号.然后将信的内容放在地址信息之后,送到邮局去发送(即调用PostOffice的Send成 <BR>员函数).当一个进程要接收一个信息,它就到邮局去取某个信箱中的信息(即调用 <BR>PostOffice的Receive成员函数),如果信箱中有信件,邮局会把信件给它,同时把发信人 <BR>的节点地址和信箱号也告诉它.与现实生活不同的是:如果信箱里没有信,取信进程并不 <BR>返回,而是睡眠等待,直到有信件来到时才唤醒它.Nachos还模拟了信件的丢失,但是由 <BR>于现代网络通讯中使用了检验纠错码,可以检查信件内容是否被改动过了.如果信件内 <BR>容不对,则认为信件丢失,所以Nachos只对信件丢失进行模拟,而没有模拟信件内容出 <BR>错.Nachos假定只要收到信件,就认为它的内容是正确的.Nachos的现有实现中,发信进 <BR>程并不知道信是否成功地发到了指定信箱. <BR> <BR> 现在让我们看看网络实现的细节.Network模拟了一个物理网络节点.它的具体实现 <BR>在机器模拟部分已作了介绍,这里就不再重复了.PostOffice是与网络用户打交道的界 <BR>面.PostOffice中有一组信箱类的对象(MailBox),信箱类提供了将信件放入信箱和从信 <BR>箱中取出信件的功能.不过这些功能只供PostOffice类使用,网络用户不能直接调用.每 <BR>个信箱中有一个信件队列,当进程要从一个信箱中取出信件时,如果信件队列非空,则从 <BR>队列头部取出一封信交给取信进程,否则取信进程将睡眠等待信的到来.当一封信放入 <BR>信箱时,它被加入此信箱的信件队列.如果有进程在等待这个信箱的信,就唤醒这个进程. <BR> PostOffice的生成函数的参数有: <BR> 1.本PostOffice所在网络的地址; <BR> 2.网络的可靠性参数; <BR> 3.PostOffice中MailBox的个数. <BR> PostOffice的生成函数的执行过程如下: <BR> 1.生成两个信号量:报文发送和报文收到信号量.它们的初值都为零. <BR> 2.再生成报文发送锁,几个MailBox对象,一个Network对象. <BR> 3.利用Nachos的进程管理系统生成一个“Postal Worker"进程. <BR> "Postal Worker"进程做一个无穷循环工作,每次循环的过程如下: <BR> 1.对报文收到信号量作P操作,作用是等待报文的来到.当从网络中收到了一个 <BR> 报文时,中断处理程序将对报文收到信号量作V操作,以唤醒本进程. <BR> 2.它重新占用CPU后,从网络上读出这则报文.调用报文中指定的信箱的Put函 <BR> 数,将这则报文放入信箱. <BR> PostOffice发送信件的过程是: <BR> 1.关闭报文发送锁.以保证只有一个报文在发送. <BR> 2.把报文放到网络上发送. <BR> 3.对报文发送信号量作P操作,等待报文发送完毕.报文发送完毕后,中断系统 <BR> 将发送中断,在中断处理程序中将对报文发送信号量作V操作.就可以 <BR> 唤醒本进程. <BR> 4.打开报文发送锁,让下一个报文可以发送. <BR> 网络用户进程调用PostOffice去取信箱中的信件时,PostOffice调用相应的MailBox <BR>的Get 成员函数取出信箱中的信件.如果信箱中没有信件,在Get函数中,取信进程将睡 <BR>眠等待. <BR> <BR> Nachos的虚拟内存管理比较简单,主要是页式管理.用户程序中的虚拟地址向物理 <BR>内存地址变换的过程受页表或快表控制.页表和快表的数据项的结构是一样的,都由一 <BR>个虚页号,一个实页和一些其它的标志组成.页表和快表的不同点在于大小不同,快表比 <BR>页表小得多,里面放的是最常用的页表项,可以看作是页表的高速缓冲区.当快表不存在 <BR>时就用页表进行地址转换,否则使用快表.虚实地址转换是由 <BR>int translate(int virtAddr,int * physAddr, int size, bool writing)完成的. <BR>其中: <BR> virAddr --要转换的虚地址; <BR> physAddr--用来存放转换成功后的实地址; <BR> size--内存读写的长度; <BR> writing--是否是写内存操作. <BR> 如果转换成功,则返回无错的标志,否则返回出错类型. <BR> 当用户程序读写内存时,Nachos先调用translate函数进行虚实地址转换,如果 <BR>translate返回值是无错,则用实地址读写内存,否则发出一个异常信号,信号类型就是 <BR>translate的返回值.让我们来看看地址转换具体过程: <BR> <BR> ↓ <BR> ━━━━━━━━ <BR> 虚地址是否 N <BR> 字对齐了 ━━━━━━┓ <BR> ━━━━━━━━ ┃ <BR> ┃ ┃ <BR> ┃Y ↓ <BR> ↓ ┏━━━━━━━━┓ <BR> ┏━━━━━━━━┓ ┃ 返回地址错误 ┃ <BR> ┃ 计算出虚地址 ┃ ┗━━━━━━━━┛ <BR> ┃ 对应的虚页号vpn┃ <BR> ┃ 和页内偏移量 ┃ <BR> ┗━━━┳━━━━┛ <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -