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

📄 handbook.htm

📁 介绍操作系统的毕业论文
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<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="MsoNormal" 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">ax.</span><span style="font-family: 宋体">寄存器的值为</span><span lang="EN-US">3</span><span style="font-family: 宋体">,</span><span lang="EN-US">bx</span><span style="font-family: 宋体">寄存器的值为</span><span lang="EN-US">TRUE</span><span style="font-family: 宋体">表示正常返回,否则为异常返回。如果线程由于异常进入当前的进程,异常返回表示引起线程运行异常的原因没有解决,因此内核将使线程再次返回,直至线程可以正常运行为止。这就是为什么执行一次线程返回调用会引起多次线程返回的原因,而</span><span lang="EN-US">0</span><span style="font-family: 宋体">号功能的返回值当其大于等于零时即为线程返回的次数。</span></p>
<p class="MsoNormal" 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>
<p class="MsoNormal" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">4.<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">#include”../include/os.h”</span></p>
<p class="MsoNormalIndent" style="line-height: 125%; margin-left: 21.0pt">
<span lang="EN-US">{</span></p>
<p class="MsoNormalIndent" style="line-height: 125%; margin-left: 52.5pt">
<span lang="EN-US">REG r;</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 73.5pt">
<span lang="EN-US">r.ax=3;</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 73.5pt">
<span lang="EN-US">r.bx=TRUE;</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 73.5pt">
<span lang="EN-US">call_kernel(&amp;r);</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 52.5pt">
<span lang="EN-US">}</span></p>
<h3 style="line-height: 125%"><!--mstheme--><font color="#666633"><span lang="EN-US">3.5</span><span style="font-family: 宋体">对线程迁移和线程返回的说明</span><!--mstheme--></font></h3>
<p class="MsoNormal" style="text-indent: 20.25pt; line-height: 125%; margin-left: .7pt">
<span style="font-family: 宋体">
在传统操作系统中,线程进入内核时,将从一个固定的地址开始执行,与此类似,在虚地址空间基于文件操作系统中,当线程从一个进程进入另一个进程时,线程从目标进程的初始执行点开始执行。通过设置进程的初始执行点,可以指定线程在进程中开始执行的地址。</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt; line-height: 125%; margin-left: .7pt">
<span style="font-family: 宋体">当线程在目标进程中开始执行时,</span><span lang="EN-US">ax</span><span style="font-family: 宋体">寄存器存放当前线程返回栈的栈顶指针,通过该参数,线程可以判断是否可以再次执行线程迁移,迁移到其它的进程。</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt; line-height: 125%; margin-left: .7pt">
<span lang="EN-US">bx</span><span style="font-family: 宋体">寄存器的绝对值存放着当前线程的</span><span lang="EN-US">ID</span><span style="font-family: 宋体">,也就是当前线程的标志信号量</span><span lang="EN-US">ID</span><span style="font-family: 宋体">,该信号量和当前的进程具有相同的</span><span lang="EN-US">capability</span><span style="font-family: 宋体">校验。如果</span><span lang="EN-US">bx&gt;0</span><span style="font-family: 宋体">,表示线程通过调用线程迁移系统功能调用进入当前进程,如果</span><span lang="EN-US">bx&lt;0</span><span style="font-family: 宋体">,表示线程并没有调用线程迁移系统功能调用,但是线程执行时产生了异常,内核中的异常处理程序使线程迁移到当前的进程,请求进程执行异常处理。</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt; line-height: 125%; margin-left: .7pt">
<span style="font-family: 宋体">
如果当前的进程成功解决了异常(例如,内存管理器成功把页面调入内存从而解决了存储访问失效异常),执行线程返回时,</span><span lang="EN-US">bx</span><span style="font-family: 宋体">中的值为</span><span lang="EN-US">TRUE</span><span style="font-family: 宋体">,线程返回到原来的进程中继续运行;如果当前的进程无法成功解决了异常,表示线程在原来的进程中已无法运行,执行线程返回时,</span><span lang="EN-US">bx</span><span style="font-family: 宋体">中的值为</span><span lang="EN-US">FALSE</span><span style="font-family: 宋体">,內核将执行多次线程返回,直到线程能够正确执行为止。</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt; line-height: 125%; margin-left: .7pt">
<span style="font-family: 宋体">
通过线程迁移和线程返回处理异常,即使线程运行时出现不能解决的异常,仅仅使线程返回到原来的进程中,不会使线程或进程完全退出,解决了</span><span lang="EN-US">UNIX</span><span style="font-family: 宋体">系统中的</span><span lang="EN-US">core 
dump</span><span style="font-family: 宋体">问题。</span></p>
<p class="MsoNormal" style="text-indent: 20.25pt; line-height: 125%; margin-left: .7pt">
<span style="font-family: 宋体">
在虚地址空间基于文件操作系统中,利用线程迁移实现了线程和进程的分离,通过线程迁移实现异常处理。线程在进程中可以使用线程的标志信号量,通过对其执行</span><span lang="EN-US">P</span><span style="font-family: 宋体">、</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作,实现线程之间的同步互斥。</span></p>
<h3 style="line-height: 125%"><!--mstheme--><font color="#666633"><span lang="EN-US">3.5</span><span style="font-family: 宋体">对信号量执行</span><span lang="EN-US">P</span><span style="font-family: 宋体">、</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作:</span><span lang="EN-US">4</span><span style="font-family: 宋体">号功能</span><!--mstheme--></font></h3>
<p class="MsoNormal" 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><span lang="EN-US">P</span><span style="font-family: 宋体">、</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作,实现线程之间的同步互斥。</span></p>
<p class="MsoNormal" 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">ax.</span><span style="font-family: 宋体">寄存器的值为</span><span lang="EN-US">4</span></p>
<p class="MsoNormal" style="text-indent: -21.0pt; line-height: 125%; margin-left: 63.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">bx</span><span style="font-family: 宋体">中为执行</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作的信号量</span><span lang="EN-US">ID</span><span style="font-family: 宋体">的绝对值,如果</span><span lang="EN-US">bx=0</span><span style="font-family: 宋体">,不执行</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作;如果</span><span lang="EN-US">bx&lt;0</span><span style="font-family: 宋体">,则执行</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作以前对该信号量复位。</span><span lang="EN-US">cx</span><span style="font-family: 宋体">中为执行</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作时信号量的增加值,如果</span><span lang="EN-US">cx</span><span style="font-family: 宋体">中的值大于等于零,把信号增加相应的数值,如果必要唤醒在信号量睡眠的线程;如果</span><span lang="EN-US">cx</span><span style="font-family: 宋体">中的值小于零,则把在信号量睡眠的线程全部唤醒。</span></p>
<p class="MsoNormal" style="text-indent: -21.0pt; line-height: 125%; margin-left: 63.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">dx</span><span style="font-family: 宋体">中为执行</span><span lang="EN-US">P</span><span style="font-family: 宋体">操作的信号量</span><span lang="EN-US">ID</span><span style="font-family: 宋体">的绝对值,如果</span><span lang="EN-US">dx=0</span><span style="font-family: 宋体">,不执行</span><span lang="EN-US">P</span><span style="font-family: 宋体">操作;如果</span><span lang="EN-US">dx&lt;0</span><span style="font-family: 宋体">,则执行</span><span lang="EN-US">P</span><span style="font-family: 宋体">操作以前对该信号量复位。</span><span lang="EN-US">si</span><span style="font-family: 宋体">寄存器中的值指定当信号量的值小于</span><span lang="EN-US">0</span><span style="font-family: 宋体">时线程是否睡眠,</span><span lang="EN-US">si</span><span style="font-family: 宋体">寄存器中的值为</span><span lang="EN-US">TRUE</span><span style="font-family: 宋体">,则睡眠,如果为</span><span lang="EN-US">FALSE</span><span style="font-family: 宋体">,不睡眠,</span><span lang="EN-US">di</span><span style="font-family: 宋体">寄存器中的值指定当线程睡眠时,是否允许其它线程进入进程,如果</span><span lang="EN-US">di</span><span style="font-family: 宋体">寄存器中的值为</span><span lang="EN-US">TRUE</span><span style="font-family: 宋体">,允许其它线程进入进程;如果</span><span lang="EN-US">di</span><span style="font-family: 宋体">寄存器中的值为</span><span lang="EN-US">FALSE</span><span style="font-family: 宋体">,不允许其它线程进入进程。</span></p>
<p class="MsoNormal" style="text-indent: -21.0pt; line-height: 125%; margin-left: 63.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 style="font-family: 宋体">在参数区中,</span><span lang="EN-US">get_kernel_parameter()-&gt;capability.capability_1</span><span style="font-family: 宋体">存放</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作信号量的</span><span lang="EN-US">capability</span><span style="font-family: 宋体">校验,</span><span lang="EN-US">get_kernel_parameter()-&gt;capability.capability_2</span><span style="font-family: 宋体">放</span><span lang="EN-US">P</span><span style="font-family: 宋体">作信号量的</span><span lang="EN-US">capability</span><span style="font-family: 宋体">校验。</span></p>
<p class="MsoNormal" 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><span lang="EN-US">bx</span><span style="font-family: 宋体">中存放</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作的执行结果,</span><span lang="EN-US">dx</span><span style="font-family: 宋体">中存放</span><span lang="EN-US">P</span><span style="font-family: 宋体">操作的执行结果,大于等于表示成功,小于零表示失败。</span></p>
<p class="MsoNormal" style="text-indent: -21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">4.<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">1</span><span style="font-family: 宋体">:对信号量执行</span><span lang="EN-US">V</span><span style="font-family: 宋体">操作</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">#include”../include/os.h”</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">{</span></p>
<p class="MsoNormal" style="text-indent: 21.0pt; line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">REG r;</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; union system_call_parameter *par;</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; par= get_kernel_parameter();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span><span style="font-family: 宋体">取参数区地址</span><span lang="EN-US">*/</span></p>
<p class="MsoNormal" style="line-height: 125%; margin-left: 42.0pt">
<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COPY_CAPABILITY((*(memory_body-&gt;capability)),</span></p>
<p class="MsoNormal" style="text-indent: 21.0pt; line-height: 125%; margin-left: 84.0pt">
<span lang="EN-US">(par-&gt;capability.capability_1));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*</span><span style="font-family: 宋体">设置信号量的</span><span lang="EN-US">capability</span><span style="font-family: 宋体">校验</span><span lang="EN-US">*/</span></p>
<p class="MsoNo

⌨️ 快捷键说明

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