Skip to content

Commit

Permalink
add ch8:sec0
Browse files Browse the repository at this point in the history
  • Loading branch information
chyyuu committed Jul 20, 2022
1 parent 8226603 commit 1443ac4
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions source/chapter8/0intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
本章导读
-----------------------------------------

到本章开始之前,我们好像已经完成了组成应用程序执行环境的操作系统的三个重要抽象:进程、地址空间和文件,让应用程序开发、运行和存储数据越来越方便和灵活。特别是操作系统支持分时多任务和抢占式调度,通过硬件中断机制,能强制打断进程的执行,及时处理I/O交互操作,从而提高整个系统的执行效率。有了进程以后,可以让操作系统从宏观层面实现多个应用的并发执行,而并发是通过操作系统基于处理器的时间片不断地切换进程来达到的。对于单核处理器而言,在任意一个时刻只会有一个进程被操作系统调度,在被处理器上执行。到目前为止的并发,仅仅是进程间的并发,而对于一个进程内部,还没有并发性的体现。而这就是线程(Thread)出现的起因:提高一个进程内的并发性。
到本章开始之前,我们已经完成了组成应用程序执行环境的操作系统的三个重要抽象:进程、地址空间和文件,让应用程序开发、运行和存储数据更加方便和灵活。特别是操作系统通过硬件中断机制,支持分时多任务和抢占式调度机制。这样操作系统能强制打断进程的执行,及时处理I/O交互操作,从而提高整个系统的执行效率。有了进程以后,可以让操作系统从宏观层面实现多个应用的 :ref:`并发执行 <term-parallel-concurrency>` ,而并发是通过操作系统不断地切换进程来达到的。

对于单核处理器而言,在任意一个时刻只会有一个进程被操作系统调度,在被处理器上执行。到目前为止的并发,仅仅是进程间的并发,而对于一个进程内部,还没有并发性的体现。而这就是线程(Thread)出现的起因:提高一个进程内的并发性。


.. chyyuu
Expand All @@ -26,29 +28,36 @@
.. note::

解决并发问题的THE操作系统
**解决并发问题的THE操作系统**

早期的计算机硬件没有内存隔离保护机制,多个程序以任务(task)的形式进行执行,但各个任务之间是依次执行(批处理方式)或相互独立执行,基本没有数据共享的情况,所以还没有形成线程的概念。当多个任务需要共享数据和同步行为时,就需要扩展任务针对共享数据的执行特征,并建立相应的同步互斥机制。在1962年,荷兰的E.W.Dijkstra 教授和他的团队正在为 Electrologica X8 计算机开发 THE 操作系统。他们观察到如果多个程序在执行中访问共享变量,在E.W.Dijkstra 教授在信号量机制的研究中,提出了多个“sequential processes”可以通过信号量机制合作访问共享变量,避免冲突导致结果不确定。这里的“sequential processes”的含义就是线程。

早期的计算机硬件没有内存隔离保护机制,多个程序以任务(task)的形式进行执行,但各个任务之间是依次执行(批处理方式)或相互独立执行,基本没有数据共享的情况,所以还没有形成线程的概念。当多个任务需要共享数据和同步行为时,就需要扩展任务的这些新的执行特征,并建立相应的同步互斥机制。在1962年,荷兰的E.W.Dijkstra 教授和他的团队正在为 Electrologica X8 计算机开发 THE 操作系统。他们观察到如果多个程序在执行中访问共享变量,在E.W.Dijkstra 教授在信号量机制的研究中,提出了多个“sequential processes”可以通过信号量机制合作访问共享变量,避免冲突导致结果不确定。这里的“sequential processes”的含义就是线程。
**贝尔实验室Victor A. Vyssotsky提出线程(thead)概念**

1964年开始设计的Multics操作系统已经有进程的概念,也有多处理器并行处理的GE 645硬件设计,甚至提出了线程的概念。1966年,参与Multics开发的MIT博士生 Jerome Howard Saltzer在其博士毕业论文的一个注脚提到贝尔实验室的Victor A. Vyssotsky用“thead”这个名称来表示处理器(processor)执行程序(program)代码序列这个过程的抽象概念,Saltzer进一步把"进程(process)"描述为处理器执行程序代码的当前状态(即线程)和可访问的地址空间。但他们并没有建立类似信号量这样的有效机制来避免并发带来的同步互斥问题。
1964年开始设计的Multics操作系统已经有进程的概念,也有多处理器并行处理的GE 645硬件设计,甚至提出了线程的概念。1966年,参与Multics开发的MIT博士生 Jerome Howard Saltzer在其博士毕业论文的一个注脚提到贝尔实验室的Victor A. Vyssotsky用 **thead** 这个名称来表示处理器(processor)执行程序(program)代码序列这个过程的抽象概念,Saltzer进一步把"进程(process)"描述为处理器执行程序代码的当前状态(即线程)和可访问的地址空间。但他们并没有建立类似信号量这样的有效机制来避免并发带来的同步互斥问题。

**Dijkstra 教授设计出信号量机制**

Dijkstra 教授带领他的小团队在设计开发THE操作系统的过程中,异步中断触发的难以重现的并发错误,让他们在调试操作系统中碰到了困难。这种困难激发了Dijkstra的灵感,他们除了设计了操作系统的分层结构之外,还设计了信号量机制和对应的P和V操作,来确保线程对共享变量的灵活互斥访问,并支持线程之间的同步操作。P和V是来自荷兰语单词“测试”和“增加”的首字母,是很罕见的非英语来源的操作系统术语。


**Brinch Hansen、Tony Hoare和Dijkstra提出管程机制**

丹麦的Brinch Hansen,英国的Tony Hoare和Dijkstra并不满足于信号量来解决操作系统和应用中的并发问题。因为对于复杂一些的同步互斥问题(如哲学家问题),如果使用信号量机制不小心,容易引起死锁等错误。在 1971年 的研讨会上,他们三人开始讨论管程(Monitor)的想法,希望设计一种更高级的并发管理语言结构,便于程序员开发并发程序。在1972年春天,Brinch Hansen 在他写的“操作系统原理”教科书中,提出了管程的概念,并把这一概念嵌入到了Concurrent Pascal 编程语言中,然后他和他的学生再接再厉,在PDP 11/45计算机上编写了Concurrent Pascal 编译器,并用Concurrent Pascal 编写了Solo操作系统。Brinch Hansen在操作系统和语言级并发处理方面的开创性工作影响了后续的操作系统并发处理机制(如条件变量等)和不少的编程语言并发方案。

Brinch Hansen的两句名言:

- 写作是对简单性的严格测试:不可能令人信服地写出无法理解的想法。
- 编程是用清晰的散文写文章并使它们可执行的艺术

.. note::
.. hint::

**并行与并发的区别**

可回顾一下 :ref:`并行与并发的解释 <term-parallel-concurrency>` 。
可回顾一下 :ref:`并行与并发的解释 <term-parallel-concurrency>` 。在单处理器情况下,多个进程或线程是并发执行的。


有了进程以后,为什么还会出现线程(Thread)呢?考虑如下情况,对于很多应用(以单一进程的形式运行)而言,逻辑上存在多个可并行执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的其他任务也被阻塞。举个具体的例子,我们平常用编辑器来编辑文本内容的时候,都会有一个定时自动保存的功能,这个功能的作用是在系统或应用本身出现故障的情况前,已有的文档内容会被提前保存。假设编辑器自动保存时由于磁盘性能导致写入较慢,导致整个进程被操作系统挂起,这就会影响到用户编辑文档的人机交互体验:即软件的及时响应能力不足,用户只有等到磁盘写入完成后,操作系统重新调度该进程运行后,用户才可编辑。如果我们把一个进程内的多个可并行执行任务通过一种更细粒度的方式让操作系统进行调度,那么就可以通过处理器时间片切换实现这种细粒度的并发执行。这种细粒度的调度对象就是线程。
有了进程以后,为什么还会出现线程(Thread)呢?考虑如下情况,对于很多应用(以单一进程的形式运行)而言,逻辑上存在多个可并行执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的其他任务也被阻塞。举个具体的例子,我们平常用编辑器来编辑文本内容的时候,都会有一个定时自动保存的功能,这个功能的作用是在系统或应用本身出现故障的情况前,已有的文档内容会被提前保存。假设编辑器自动保存时由于磁盘性能导致写入较慢,导致整个进程被阻塞,这就会影响到用户编辑文档的人机交互体验:即软件的及时响应能力不足,用户只有等到磁盘写入完成后,操作系统重新调度该进程运行后,用户才可编辑。如果我们把一个进程内的多个可并行执行任务通过一种更细粒度的方式让操作系统进行调度,那么就可以通过处理器时间片切换实现这种细粒度的并发执行。这种细粒度的调度对象就是线程。


.. _term-thread-define:
Expand All @@ -61,7 +70,7 @@
在本章之前,进程是程序的基本执行实体,是程序关于某数据集合上的一次运行活动,是系统进行资源(处理器,地址空间和文件等)分配和调度的基本单位。在有了线程后,对进程的定义也要调整了,进程是线程的资源容器,线程成为了程序的基本执行实体。


.. note::
.. hint::

**线程与进程的区别**

Expand Down

0 comments on commit 1443ac4

Please sign in to comment.