Java笔记··By/蜜汁炒酸奶

信马由缰操作系统-进程/线程产生背景

操作系统本身是在计算机硬件上的第一层软件,是对硬件系统的首次扩充,主要用来管理计算机中的硬件设备,提高它们的利用率和吞吐量,同时为用户和应用程序提供接口,充当用户以及应用程序和计算机硬件之间的桥梁,方便用户和应用程序使用其中的硬件设备。

操作系统与用户及应用程序关系

我们再换个更简洁的分层示意图了解操作系统这一重要关系:

  • 处理器可以简单理解为CPU。
  • 主存是一个临时存储设备,可以简单理解成内存条。内存的严格定义本身是大于主存的,包含主存与高速缓存,具体的区别以后有时间再讲。
    计算机系统的分层视图

操作系统作为硬件与应用程序的中间层,有以下两个基本功能,本质上是为应用程序提供有限的控制硬件设备的权限,防止其滥用从而影响到其他程序:

  1. 防止硬件被失控的应用程序滥用。
  2. 为应用程序提供简单一致的机制来控制复杂而通常又不大相同的低级硬件设备。

操作系统通过进程、虚拟内存和文件这几个抽象概念来实现这两个功能。

  • 文件是对I/O设备的抽象表示
  • 虚拟内存是对主存和磁盘 I/O 设备的抽象表示
  • 进程是对处理器、主存和磁盘 I/O 设备的抽象表示
    操作系统提供的抽象表示

在说进程之前,我们先简单看一下操作系统的发展历程,了解一下进程、线程这些是怎么来的。

1. 人工操作方式

从1945年诞生的第一台计算机到20世纪50年代中期所出现的计算机,都属于第一代计算机,此时还未出现操作系统(operating system,OS),也不存在程序和进程一说,此时的工作过程全是由人工操作。

1.1 早期人工操作

早期人工操作过程如下:

  1. 由用户将已打孔的纸带(或卡片)装入纸带输入机(或卡片输入机)
  2. 启动输入机将纸带(或卡片)上的程序和数据输入到计算机,然后启动计算机运行。
  3. 仅当计算机执行完毕且取走计算结果后,才允许下一个用户上机。

这种方案存在的缺点有:

  1. 用户独占全机:计算机的所有资源由当前上机用户独占
  2. CPU 等待人工操作:在上机用户装卸纸带/卡片期间,CPU及内存等资源是空闲的。这种人工操作的方式严重影响了计算机的利用率,这也就是所谓的人机矛盾。虽然 CPU的速度在提高,但I/O输入设备的速度却提升缓慢。

人工操作方式

1.2 脱机I/O

为了解决人机矛盾以及 CPU 与 I/O 设备之间速度不匹配的矛盾,20世纪50年代末出现了脱机I/O模式。其工作原理如下:

  1. 事先将将装有用户程序和数据的纸带/卡片装入纸带输入机等输入设备
  2. 在一台外围机的控制下,将磁带的数据从输入设备将数据保存到磁带上
  3. 当CPU需要这些程序和数据时,再从磁带上将它们高速调入内存中执行。
  4. 当CPU需要输出时,先将结果输入到磁带,再在另一个外围机的控制下,将磁带中的结果通过相应的输出设备输出。

脱机I/O操作方式

这种方案减少了CPU等待时间,提高了I/O速度。

1.3 脱机I/O与联机I/O

  • 脱机I/O :程序的输入和输出都是在外围机的控制下完成的,即在脱离主机的情况下进行的,故称为脱机I/O的方式输入到磁带上
  • 联机I/O:反之在主机的直接控制下进行的I/O操作,被称为联机I/O操作。

2. 批处理系统

2.1 进程

在20世纪50年代中期,出现了第二代晶体管计算机。为了能充分提高计算机的利用率,需要尽可能保持系统的连续运行,以减少系统的空闲时间。如此单道批处理系统出现,这里面的程序被称为作业( Job )。

  1. 为了能保证连续执行,需要先将一批作业以脱机I/O的方式输入到磁带上。
  2. 在系统中配置监督程序,在其控制下,保证这批作业能一个接一个执行。

由于同一时间内存中仅有一道程序,每次该程序发出I/O请求后,CPU都会处于等待状态,直到I/O操作完成才能继续运行。I/O设备自身的低速性导致CPU的利用率明显降低。

为了能执行较大的作业,需要配置较大的内存,但实际多数作业是小型的,占用内存较少,从而造成较多的内存资源浪费。

为了应对这些问题,进一步提高利用率和系统吞吐量,在20世纪60年代中期引入了多道程序设计技术,多道批处理系统由此产生。在此期间,IBM公司生产了第一台小规模集成电路计算机IBM360,这也是第三代计算机,与此同时,为其设计了OS/360,这是第一个能运行多道程序的批处理系统。

在多道程序环境中,程序的并发执行会失去封闭性,并具有间断性和运行结果不可再现性,所以通常程序是不能直接参与并发的,不然程序的执行便没了意义。为了使程序可以并发执行,并且可以对并发执行的程序加以描述和控制,在 OS 中引入“进程”这一概念。

引入进程解决单处理机(可以狭隘的认为是单CPU)环境下的程序并发问题后的20年时间里,多道程序的OS(即多道批处理系统)中一直是以进程为能够拥有资源并独立调度/运行的基本单位

在讨论操作系统时,关于对 CPU 活动的称呼,批处理系统中称为作业( job ),分时系统称为用户程序( user program )或者任务( task )等。所有这些活动在许多方面都是相似的,所以现在统称为进程( process )。

虽然现在的环境下作业和进程这两个概念几乎可以互换,但由于操作系统的许多理论和技术是在操作系统的主要活动被称为作业处理期间发展起来的,如作业调度这种常用短语,如果因为进程取代了作业就简单的进行替换,容易令人误解。

2.2 线程

直到20世纪80年代中期,为提高程序并发执行的程度,引入了线程的概念,在进入20世纪90年代后,多处理机系统得到迅速发展,近些年推出的多处理机OS都引入了线程以提高其OS的性能。

线程又可以简单分为用户级线程和内核级线程,它俩的组合方式常见的有多对一、一对一和多对多,具体的我们会在之后说明。

2.3. 协程

近些年随着技术的发展,出现了一种比线程更加轻量级的存在,即协程( Coroutines ),协程完全由程序控制(即在用户态执行),从而节省了线程所需的上下文切换所需的资源。如同一个操作系统有多个进程,一个进程有多个线程,一个线程也有多个协程。

由于操作系统或者说内核进程等不知道协程的存在,它仅知道当前的线程,所以当执行阻塞I/O操作时,该协程所在整个线程会被阻塞。

根据 Donald Knuth 的说法,Melvin Conway 在1958年创造了协程这个术语,当时他将其应用于一个汇编程序的构建。第一个关于协程的解释出版于1963年。

According to Donald Knuth, Melvin Conway coined the term coroutine in 1958 when he applied it to the construction of an assembly program.The first published explanation of the coroutine appeared later, in 1963. 来源:wiki-Coroutine

目前具有协程的编程语言有 C 、Python 、Golang 等,Java在19中也尝试引入类似的预览版的 Virtual Threads,在Java21已经升级为正式版

在《计算机操作系统》一书中其实还有分时、实时、网络等多种操作系统的介绍,我们这里主要是简述进程、线程这些概念产生的背景,所以不再过多介绍。

5. 参考资料

  1. 《计算机操作系统(慕课版)》汤子瀛等
  2. 《操作系统概念(原书第9版)》
  3. 《深入理解计算机系统(原书第3版)》
预览
Loading comments...
0 条评论

暂无数据

example
预览