Skip to content

Commit b7a541b

Browse files
committed
update ch7:0 for os arch and code intro for signal
1 parent ca7367a commit b7a541b

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

source/chapter7/0intro.rst

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,29 @@
119119
本章代码树
120120
-----------------------------------------
121121

122+
123+
迅猛龙操作系统 -- IPCOS的总体结构如下图所示:
124+
125+
.. image:: ../../os-lectures/lec10/figs/ipc-os-detail-2.png
126+
:align: center
127+
:scale: 25 %
128+
:name: ipc-os-detail
129+
:alt: 迅猛龙操作系统 - IPC OS总体结构
130+
131+
通过上图,大致可以看出迅猛龙操作系统 -- IPCOS增加了两种通信机制,一种是交换数据的管道(Pipe)机制,另外一种是发送异步通知事件的信号(signal)机制,应用程序通过新增的管道和信号相关的系统调用可以完成进程间通信。这两种机制所对应的资源都被进程管理,如下图所示。
132+
133+
.. image:: ../../os-lectures/lec10/figs/tcb-ipc-standard-file.png
134+
:align: center
135+
:scale: 10 %
136+
:name: tcb-ipc-standard-file
137+
:alt: 进程管理的管道与信号
138+
139+
140+
这里把管道看成是一种特殊的内存文件,并在进程的打开文件表 `fd_talbe` 中被管理,而且进程通过文件读写系统调用就可以很方便地基于管道实现进程间的数据交换。而信号是进程管理的一种资源,发送信号的进程可以通过系统调用给接收信号的目标进程控制块中的 `signal` 结构更新所发信号信息,操作系统再通过扩展 `trap_handler` 中从内核态返回到用户态的处理流程, 改变了接收信号的目标进程的执行上下文,从而让接收信号的目标进程可以优先执行处理信号事件的预设函数 `signal_handler` ,在处理完信号后,再继续执行之前暂停的工作。
141+
142+
位于 ``ch7`` 分支上的迅猛龙操作系统 - IPCOS的源代码如下所示:
143+
144+
122145
.. code-block::
123146
124147
./os/src
@@ -215,6 +238,7 @@
215238
- 支持管道文件
216239
- 支持对应用程序的命令行参数的解析和传递
217240
- 实现标准 I/O 重定向功能
241+
- 支持信号
218242

219243

220244
**支持标准输入/输出文件**
@@ -235,4 +259,14 @@
235259

236260
具体思路是,在某应用进程执行之前,父进程(比如 user_shell进程)要对子进程的文件描述符表进行某种替换。以输出为例,父进程在创建子进程前,提前打开一个常规文件 A,然后 ``fork`` 子进程,在子进程的最初执行中,通过 ``sys_close`` 关闭 Stdout 文件描述符,用 ``sys_dup`` 复制常规文件 A 的文件描述符,这样 Stdout 文件描述符实际上指向的就是常规文件A了,这时再通过 ``sys_close`` 关闭常规文件 A 的文件描述符。至此,常规文件 A 替换掉了应用文件描述符表位置 1 处的标准输出文件,这就完成了所谓的 **重定向** ,即完成了执行新应用前的准备工作。接下来,子进程调用 ``sys_exec`` 系统调用,创建并开始执行新应用。在重定向之后,新应用所在进程认为自己输出到 fd=1 的标准输出文件,但实际上是输出到父进程(比如 user_shell进程)指定的文件A中,从而实现了两个进程之间的信息传递。
237261

262+
263+
**支持信号**
264+
265+
信号(Signals)是操作系统中实现进程间通信的一种异步通知机制,可以看成是一个应用发出某种信号,希望另外一个应用能及时响应。操作系统为支持这一目标,需要解决三个主要问题:如何向进程发送信号、进程如何接收信号、而信号如何被处理。
266+
267+
操作系统首先需要定义信号类型,表明不同含义的事件。接下来需要扩展进程控制块的内容,把与信号作为一种资源管理起来。发送信号的进程要做的事情比较简单,通过系统调用 `kill` 给接收信号的目标进程发信号,操作系统会在目标进程控制块中的 `signal` 结构中记录要接收信号。
268+
269+
这里比较复杂的是接收信号的进程要处理的事务。在进程控制块中,包含了接收到的信号集合 `signals` ,以及要接收的信号对应的信号处理函数的地址 `SignalAction.handler`。当操作系统从内核态返回到目标进程的用户态继续执行时,具体的处理过程由 `trap_handler` 负责, `trap_handler` 分析目标进程控制块,如果该进程有带接收的信号,且提供了该信号对应的信号处理例程,则备份目标进程的用户态执行上下文,再修改目标进程的用户态执行上下文,让目标进程先执行信号处理函数。目标进程执行完毕信号处理函数后,需要执行一个系统调用 `sys_sigreturn` 回到内核态,这时内核再恢复刚才备份的目标进程的用户态执行上下文,这样目标进程就可以恢复之前的执行流程了。
270+
271+
238272
.. [#velociraptor] 迅猛龙是一种中型恐龙,生活于8300 至7000万年前的晚白垩纪,它们是活跃的团队合作型捕食动物,可以组队捕食行动迅速的猎物。

0 commit comments

Comments
 (0)