Linux 版 (精华区)

发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标  题: NACHOS论坛(4)
发信站: 紫 丁 香 (Sun Nov  8 17:27:47 1998), 转信


寄信人: ship.bbs@bbs.xmu.edu.cn 
标  题: NACHOS论坛(4)(转寄)
发信站: 华南理工大学 BBS木棉站
日  期: Sun Mar  9 15:00:35 1997

作  家: solmon (所罗门王) on board 'Unix'
题  目: NACHOS论坛(4)
来  源:  鼓浪听涛站
日  期: Thu Mar  6 23:05:32 1997
出  处: mysu@JingXian.xmu.edu.cn

           第四章    网络及虚拟内存


    Nachos的网络的实现分为两层:Network和PostOffice.首先,请您不要误解Network
的含义,它并不是一个网络操作系统,而是Nachos操作系统在接收或发送网络信息时的
管理模块.换句话说,Nachos的Network只管本地机对网络信息的处理,它并不关心网络
是如何实现信息传递的.Network的结构是,每个主机上有一个邮局(PostOffice)来负责
处理用户的Network请求.每个邮局中有几个信箱(MailBox),它存放着从网络上接收到
的信息.

    如果一个Nachos进程要通过网络将信息从本地发往另一个Nachos工作站,它首先要
象现实生活中那样先填写收信人,发信人的地址.地址由两部分组成:1.节点地址;2.信
箱号.然后将信的内容放在地址信息之后,送到邮局去发送(即调用PostOffice的Send成
员函数).当一个进程要接收一个信息,它就到邮局去取某个信箱中的信息(即调用
PostOffice的Receive成员函数),如果信箱中有信件,邮局会把信件给它,同时把发信人
的节点地址和信箱号也告诉它.与现实生活不同的是:如果信箱里没有信,取信进程并不
返回,而是睡眠等待,直到有信件来到时才唤醒它.Nachos还模拟了信件的丢失,但是由
于现代网络通讯中使用了检验纠错码,可以检查信件内容是否被改动过了.如果信件内
容不对,则认为信件丢失,所以Nachos只对信件丢失进行模拟,而没有模拟信件内容出
错.Nachos假定只要收到信件,就认为它的内容是正确的.Nachos的现有实现中,发信进
程并不知道信是否成功地发到了指定信箱.

    现在让我们看看网络实现的细节.Network模拟了一个物理网络节点.它的具体实现
在机器模拟部分已作了介绍,这里就不再重复了.PostOffice是与网络用户打交道的界
面.PostOffice中有一组信箱类的对象(MailBox),信箱类提供了将信件放入信箱和从信
箱中取出信件的功能.不过这些功能只供PostOffice类使用,网络用户不能直接调用.每
个信箱中有一个信件队列,当进程要从一个信箱中取出信件时,如果信件队列非空,则从
队列头部取出一封信交给取信进程,否则取信进程将睡眠等待信的到来.当一封信放入
信箱时,它被加入此信箱的信件队列.如果有进程在等待这个信箱的信,就唤醒这个进程.
    PostOffice的生成函数的参数有:
        1.本PostOffice所在网络的地址;
        2.网络的可靠性参数;
        3.PostOffice中MailBox的个数.
    PostOffice的生成函数的执行过程如下:
        1.生成两个信号量:报文发送和报文收到信号量.它们的初值都为零.
        2.再生成报文发送锁,几个MailBox对象,一个Network对象.
        3.利用Nachos的进程管理系统生成一个“Postal Worker"进程.
    "Postal Worker"进程做一个无穷循环工作,每次循环的过程如下:
        1.对报文收到信号量作P操作,作用是等待报文的来到.当从网络中收到了一个
                报文时,中断处理程序将对报文收到信号量作V操作,以唤醒本进程.
        2.它重新占用CPU后,从网络上读出这则报文.调用报文中指定的信箱的Put函
                数,将这则报文放入信箱.
    PostOffice发送信件的过程是:
        1.关闭报文发送锁.以保证只有一个报文在发送.
        2.把报文放到网络上发送.
        3.对报文发送信号量作P操作,等待报文发送完毕.报文发送完毕后,中断系统
                将发送中断,在中断处理程序中将对报文发送信号量作V操作.就可以
                唤醒本进程.
        4.打开报文发送锁,让下一个报文可以发送.
    网络用户进程调用PostOffice去取信箱中的信件时,PostOffice调用相应的MailBox
的Get 成员函数取出信箱中的信件.如果信箱中没有信件,在Get函数中,取信进程将睡
眠等待.

    Nachos的虚拟内存管理比较简单,主要是页式管理.用户程序中的虚拟地址向物理
内存地址变换的过程受页表或快表控制.页表和快表的数据项的结构是一样的,都由一
个虚页号,一个实页和一些其它的标志组成.页表和快表的不同点在于大小不同,快表比
页表小得多,里面放的是最常用的页表项,可以看作是页表的高速缓冲区.当快表不存在
时就用页表进行地址转换,否则使用快表.虚实地址转换是由
int translate(int virtAddr,int * physAddr, int size, bool writing)完成的.
其中:
        virAddr --要转换的虚地址;
        physAddr--用来存放转换成功后的实地址;
        size--内存读写的长度;
        writing--是否是写内存操作.
    如果转换成功,则返回无错的标志,否则返回出错类型.
    当用户程序读写内存时,Nachos先调用translate函数进行虚实地址转换,如果
translate返回值是无错,则用实地址读写内存,否则发出一个异常信号,信号类型就是
translate的返回值.让我们来看看地址转换具体过程:

                      ↓
               ━━━━━━━━
                 虚地址是否             N
                  字对齐了          ━━━━━━┓
               ━━━━━━━━                 ┃
                      ┃                        ┃
                      ┃Y                       ↓
                      ↓             ┏━━━━━━━━┓
              ┏━━━━━━━━┓   ┃  返回地址错误  ┃
              ┃ 计算出虚地址   ┃   ┗━━━━━━━━┛
              ┃ 对应的虚页号vpn┃
              ┃ 和页内偏移量   ┃
              ┗━━━┳━━━━┛
                      ┃
                      ↓
               ━━━━━━━━━       Y
                   快表存在          ━━━━┓
               ━━━━━━━━━            ┃
                      ┃                     ┃
                      ┃ N                   ┃
                      ↓                     ↓
                ━━━━━━━         ━━━━━━━━
          Y       虚页号vpn         N   有一个快表项的
       ┏━━    大于页表个数     ┏━  虚页号等于vpn
       ┃       ━━━━━━━    ┃   ━━━━━━━━
       ↓             ┃          ┃             ┃
┏━━━━━━━━┓  ┃ N        ↓             ┃
┃  返回地址错误  ┃  ┃     ┏━━━━━━━━┓┃ Y
┗━━━━━━━━┛  ┃     ┃ 返回页失效错误 ┃┃
                      ┃     ┗━━━━━━━━┛┃
                      ↓
          N      ━━━━━━                    ↓
       ┏━━     此页已装入          ┏━━━━━━━━┓
       ┃            内存             ┃ entry=此虚页   ┃
       ↓        ━━━━━━         ┃ 对应的快表项   ┃
┏━━━━━━━━┓  ┃              ┃    入口        ┃
┃ 返回页失效错误 ┃  ┃              ┗━━━━┳━━━┛
┗━━━━━━━━┛  ┃ Y                      ┃
                      ↓                        ┃
              ┏━━━━━━━━┓              ┃
              ┃ entry=此虚页   ┃              ┃
              ┃ 对应的页表项   ┃              ┃
              ┃    入口        ┃              ┃
              ┗━━━┳━━━━┛              ┃
                      ┃                        ┃
                      ┃                        ┃
                      ┗━━━━━┳━━━━━━┛
                                  ┃
                                  ↓
                          ━━━━━━━━━━
                 Y         writing参数为TRUE
             ┏━━━      而entry指向的页为
             ┃                 只读页
             ┃           ━━━━━━━━━━
             ┃                   ┃
             ↓                   ┃
     ┏━━━━━━━━┓         ┃   N
     ┃  返回只读错误  ┃         ┃
     ┗━━━━━━━━┛         ↓
                    ┏━━━━━━━━━━━━━━━┓
                    ┃  PageFrame = entry 项中的    ┃
                    ┃         物理页号             ┃
                    ┗━━━━━━┳━━━━━━━━┛
                                  ┃
                                  ↓
               Y     ━━━━━━━━━━━━━━
             ┏━━    PageFrame >= 物理页总数
             ┃      ━━━━━━━━━━━━━━
             ┃                   ┃
             ↓                   ┃
      ┏━━━━━━━━┓        ┃ N
      ┃  返回总线错误  ┃        ┃
      ┗━━━━━━━━┛        ↓
                        ┏━━━━━━━━━━━┓
                        ┃  置entry的使用标志   ┃
                        ┗━━━━┳━━━━━━┛
                                  ┃
                                  ↓
                            ━━━━━━━       N
                              是写请求       ━━━━┓
                            ━━━━━━━           ┃
                                  ┃                 ┃
                                  ┃ Y               ┃
                                  ↓                 ┃
                        ┏━━━━━━━━━━━┓   ┃
                        ┃  置entry的写标志     ┃   ┃
                        ┗━━━━┳━━━━━━┛   ┃
                                  ┃                 ┃
                                  ┃ ←━━━━━━━┛
                                  ↓
                        ┏━━━━━━━━━━━┓
                        ┃ 计算实地址,并放入    ┃
                        ┃     physAddr中       ┃
                        ┗━━━━┳━━━━━━┛
                                  ┃
                                  ↓
                          ┏━━━━━━━━┓
                          ┃  返回无错误    ┃
                          ┗━━━━━━━━┛


--
m※ 来源:.鼓浪听涛站 bbs.xmu.edu.cn.[FROM: mysu@JingXian.xmu.ed] m
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--

                              Enjoy Linux!
                          -----It's FREE!-----

※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:210.125毫秒