Skip to content

Commit

Permalink
update ch8
Browse files Browse the repository at this point in the history
  • Loading branch information
chyyuu committed Jul 19, 2022
1 parent 02ce84c commit 02c4ddb
Show file tree
Hide file tree
Showing 3 changed files with 3 additions and 3 deletions.
2 changes: 1 addition & 1 deletion source/chapter8/1thread-kernel.rst
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ waittid 等待一个线程标识符的值为tid 的线程结束。在具体实
线程控制块
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

在内核中,每个线程的执行状态和线程上下文等均保存在一个被称为线程控制块 (PCB, Process Control Block) 的结构中,它是内核对线程进行管理的核心数据结构。在内核看来,它就等价于一个线程。
在内核中,每个线程的执行状态和线程上下文等均保存在一个被称为任务控制块 (TCB, Task Control Block) 的结构中,它是内核对线程进行管理的核心数据结构。在内核看来,它就等价于一个线程。


.. code-block:: rust
Expand Down
2 changes: 1 addition & 1 deletion source/chapter8/1thread.rst
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@
}
这里需要注意两个细节。第一个是寄存器集合的保存数量。在保存通用寄存器集合时,并没有保存所有的通用寄存器,其原因是根据RISC-V的函数调用约定,有一部分寄存器是有调用函数 `Caller` 来保存的,所以就不需要被调用函数 `switch` 来保存了。第二个是当前指令指针(PC)的切换。在具体切换过程中,是基于函数返回地址来进行切换的。即首先把 `switch` 的函数返回地址 `ra` (即 `x1` )寄存器保存在 `TaskContext` 中,在此函数的倒数第二步,恢复切换后要执行线程的函数返回地址,即 `ra` 寄存器到 `t0` 寄存器,然后调用 `jr t0` 即完成了函数的返回。
这里需要注意两个细节。第一个是寄存器集合的保存数量。在保存通用寄存器集合时,并没有保存所有的通用寄存器,其原因是根据RISC-V的函数调用约定,有一部分寄存器是由调用函数 `Caller` 来保存的,所以就不需要被调用函数 `switch` 来保存了。第二个是当前指令指针(PC)的切换。在具体切换过程中,是基于函数返回地址来进行切换的。即首先把 `switch` 的函数返回地址 `ra` (即 `x1` )寄存器保存在 `TaskContext` 中,在此函数的倒数第二步,恢复切换后要执行线程的函数返回地址,即 `ra` 寄存器到 `t0` 寄存器,然后调用 `jr t0` 即完成了函数的返回。


开始执行
Expand Down
2 changes: 1 addition & 1 deletion source/chapter8/2lock.rst
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@
7 -- -- 切换 0 1
8 L23 -- -- 1 1
9 -- -- 切换 1 1
10 -- L23 -- 1 1
10 -- L23 -- 1 a的高位地址
===== ===== ======= ======= =========== =========

一般情况下,线程T0执行完毕后,再执行线程T1,那么共享全局变量``a``的值为 2 。但在上面的执行过程中,可以看到在线程执行指令的过程中会发生线程切换,这样在时刻10的时候,共享全局变量``a``的值为 1,这不是我们预期的结果。出现这种情况的原因是两个线程在操作系统的调度下(在哪个时刻调度具有不确定性),交错执行 ``a=a+1`` 的不同汇编指令序列,导致虽然增加全局变量 ``a`` 的代码被执行了两次,但结果还是只增加了1。这种多线程的最终执行结果不确定(indeterminate),取决于由于调度导致的不确定指令执行序列的情况就是竞态条件(race condition)。
Expand Down

0 comments on commit 02c4ddb

Please sign in to comment.