⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 handbook.htm

📁 介绍操作系统的毕业论文
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<h3 style="line-height: 125%"><!--mstheme--><font color="#666633"><span lang="EN-US">1.2</span><span style="font-family: 宋体">实现了数据存储、数据计算和资源管理的分离</span><!--mstheme--></font></h3>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
在虚地址空间基于文件操作系统中,数据存储由文件抽象实现,数据计算由线程抽象实现,资源管理由进程抽象实现,三者在系统中是分离的,表现在以下三个方面:</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">1.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体">
线程和文件之间不存在任何确定的对应关系:数据存储在文件中,只要不影响安全性,任何文件可以被任何线程访问,任何线程也都可以计算任何文件中的数据。</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">2.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体">
线程和进程之间也不存在确定的对应关系:线程可以在不同的进程之间迁移,在不同时刻线程以不同进程的身份申请和使用资源。由于所有应用程序在同一个文件空间中运行,线程迁移时,仅仅需要执行</span><span lang="EN-US">CPU</span><span style="font-family: 宋体">现场的迁移,不需要执行程序代码、数据和堆栈等的迁移。</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">3.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体">
文件和进程之间也不存在确定的对应关系:文件属于文件服务器,是文件服务器维护的一个对象,进程是系统进行资源管理的对象,是操作系统内核实施资源管理的抽象,是系统资源的持有者。</span></p>
<h3 style="line-height: 125%"><!--mstheme--><font color="#666633"><span lang="EN-US">1.3</span><span style="font-family: 宋体">应用程序之间的依赖关系</span><!--mstheme--></font></h3>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
在虚拟地址空间基于文件操作系统中,当应用程序运行时,如果文件数据在物理内存中不存在,线程请求文件服务器执行读写文件操作,执行完毕后线程继续运行。一个应用程序的运行,需要其它的应用程序(文件服务器)在后台的支持,而该文件服务器又可能需要其它的文件服务器在后台的支持。如果文件服务器无法运行,线程在当前应用程序中就无法运行,因此所谓虚拟地址空间基于文件,也可以说就是一个应用程序执行的程序和访问的数据,是由另一个应用程序为其维护的,一个应用程序的运行,需要依赖于其它应用程序的运行,因此在各个应用程序之间必然存在一个相互之间的依赖关系,并最终所有应用程序依赖于传统意义下的文件系统。</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
在虚拟地址空间基于文件操作系统中,应用程序之间存在相互依赖关系,那么所有应用程序最终依赖的是哪个应用程序?该应用程序是如何运行的?它是否也依赖于某个应用程序呢?</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">就象在</span><span lang="EN-US">UNIX</span><span style="font-family: 宋体">中必须存在</span><span lang="EN-US">0<sup>#</sup></span><span style="font-family: 宋体">进程一样,在虚拟地址空间基于文件操作系统中,必须至少存在一个文件服务器直接在物理内存上运行而不依赖其它任何服务器。常驻内存的文件服务器可以是一个具体的文件服务器,也可以是虚拟文件服务器。</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
如果常驻内存的文件服务器是一个具体的文件服务器,例如管理硬盘、软盘或者光盘等的文件服务器,那么所有的应用程序最终都将依赖于这个常驻内存的文件服务器,如果常驻内存的文件服务器消亡,就象传统操作系统中对换设备损坏一样,整个系统也将不能运行,因此要求系统至少存在一个具体的外部存储设备,同时常驻这个设备的文件服务器。</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
如果常驻内存的服务器是一个虚拟文件服务器,例如通信服务器,那么系统可能不需要任何外部存储设备,而是利用通信服务器在远程的文件服务器上存取数据,在这种情况下,要求通信服务器直接常驻内存而不依赖于任何其它的应用程序。</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
总之,在系统内存中至少需要常驻以下三个部件,其它的内容可以在系统运行时动态地安装和卸载,可以在系统运行时动态地换入换出:</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">1.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体">内核</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">2.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体">内存管理器</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">3.<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体">至少一个具体的文件服务器或者一个通信服务器</span></p>
<h3 style="line-height: 125%"><!--mstheme--><font color="#666633"><span lang="EN-US">2</span><span style="font-family: 宋体">内核提供的系统功能调用</span><!--mstheme--></font></h3>
<h3 style="line-height: 125%"><!--mstheme--><font color="#666633"><span lang="EN-US">2.</span><span style="font-family: 宋体">1参数传递</span><!--mstheme--></font></h3>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">
线程请求内核执行系统功能调用时,通过寄存器传递参数,如果需要传递的参数很多,无法全部放在寄存器中,其它参数存放线性地址空间的</span><span lang="EN-US">3G</span><span style="font-family: 宋体">-</span><span lang="EN-US">3G</span><span style="font-family: 宋体">+</span><span lang="EN-US">4K</span><span style="font-family: 宋体">的页面。在以后的实现中,可能把参数区分配在其它地址,为了实现兼容,可以通过以下三个宏取得参数区地址:</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US" style="font-family: Wingdings">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span lang="EN-US">get_kernel_parameter() </span>
<span style="font-family: 宋体">定义为指向联合</span><span lang="EN-US">union 
system_call_parameter</span><span style="font-family: 宋体">的指针,用于向内核传递参数。其值为</span><span lang="EN-US">3G</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US" style="font-family: Wingdings">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span lang="EN-US">get_memory_parameter()</span><span style="font-family: 宋体">定义为指向联合</span><span lang="EN-US">union 
memory_call_parameter</span><span style="font-family: 宋体">的指针,用于向内存管理器传递参数。其值为</span><span lang="EN-US">3G</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US" style="font-family: Wingdings">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span lang="EN-US">get_file_system_parameter()</span><span style="font-family: 宋体">定义为指向结构</span><span lang="EN-US">struct 
file_system_call_parameter</span><span style="font-family: 宋体">的指针,用于向文件系统进程传递参数。其值为</span><span lang="EN-US">3G</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormalIndent" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US" style="font-family: Wingdings">l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7.0pt; font-family: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span lang="EN-US">get_thread_physical_block()</span><span style="font-family: 宋体">定义为指向字符指针,当内存管理器请求文件系统读写文件时,文件系统从此处读取数据,或向此处存放数据。其值为</span><span lang="EN-US">3G</span><span style="font-family: 宋体">+</span><span lang="EN-US">4K</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">为了在</span><span lang="EN-US">C</span><span style="font-family: 宋体">语言中调用内核提供系统功能调用,我们编制了一段用内嵌汇编实现的</span><span lang="EN-US">C</span><span style="font-family: 宋体">函数,该程序接收</span><span lang="EN-US">C</span><span style="font-family: 宋体">语言传送的一个结构指针(</span><span lang="EN-US">struct 
thread_environment</span><span style="font-family: 宋体"> *),把该指针指向的数据装入寄存器中,然后调用内核,并把返回后各个寄存器中的值保存到指针指向的数据结构中。该函数是一个静态的</span><span lang="EN-US">inline</span><span style="font-family: 宋体">函数,其原型为:</span></p>
<p class="MsoNormalIndent" style="line-height: 125%"><span lang="EN-US">void 
call_kernel(struct thread_environment *env)</span><span style="font-family: 宋体">;</span></p>
<p class="MsoNormalIndent" style="line-height: 125%">
<span style="font-family: 宋体">其中,数据结构</span><span lang="EN-US">struct 
thread_environment </span><span style="font-family: 宋体">的定义为:</span></p>
<p class="MsoNormalIndent" style="line-height: 125%"><span lang="EN-US">struct 
thread_environment{</span></p>
<p class="MsoNormalIndent" style="line-height: 125%"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
int system_call,system_call_arg1;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*ax,bx*/</span></p>
<p class="MsoNormalIndent" style="line-height: 125%"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
int system_call_arg2,system_call_arg3; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*cx,dx*/</span></p>
<p class="MsoNormalIndent" style="line-height: 125%"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
int system_call_arg4,system_call_arg5; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*si,di*/</span></p>
<p class="MsoNormalIndent" style="line-height: 125%"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
int system_call_arg6,system_call_arg7; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*bp,r7*/ </span></p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -