关于操作系统:当我们说起多线程与高并发时

4次阅读

共计 3933 个字符,预计需要花费 10 分钟才能阅读完成。

高并发与多线程可为 java 畛域内的显学矣,某种程度上也能够算是软件畛域的显学,大家都谋求的货色。然而这其中也有些误会,比方很多人认为没有多线程,你的电脑就在听歌的时候不能打游戏,这是一种误会。我写的货色大多都成一个零碎,本篇是多线程篇的总纲,并不依附于特定的语言,我记得线程也是放在操作系统中探讨的。

并发 VS 并行

我在刚学 Java 的时候,一边看视频,一遍看书,入门选的是官网写的教程《The Java™ Tutorials》,在讲到多线程之前的话是这样的:
Computer users take it for granted that their systems can do more than one thing at a time. They assume that they can continue to work in a word processor, while other applications download files, manage the print queue, and stream audio. Even a single application is often expected to do more than one thing at a time. For example, that streaming audio application must simultaneously read the digital audio off the network, decompress it, manage playback, and update its display. Even the word processor should always be ready to respond to keyboard and mouse events, no matter how busy it is reformatting text or updating the display. Software that can do such things is known as concurrent software.

计算机用户通常认为操作系统可能同时做很多事件是无比失常的事件,因为他们通常会在应用办公软件解决文字的时候,其余程序在下载文件,治理打印,解决音频。甚至是一个应用程序也是心愿同时可能做不止一件事。例如,一个音频处理程序必须同时从网络上读取音频,而后解压缩,治理播放,更新进度(这是当初很稀松平时的事件,也就是在线听歌)。不论是文字处理软件有多忙,它也总是在时刻响应键盘和鼠标。可能同时做不止一件事件的软件,咱们称之为并发软件。

下面的并发强调的是同时做不止一件事件,这是一种操作系统提供给程序的假象,事实上他们可能是交替执行的(并发),当然也可能是同时执行的(并行),这取决于以后计算机系统的根本配置和繁忙水平无关。假如以后计算机不是很繁忙,也就是说运行的程序并不多, 又假如 CPU 很弱小, 过程的两个动作(古代操作系统来说个别是线程,古代操作系统调度的根本单位就是线程),就可能会被调配到这两个外围上同时执行。如果此时以后计算机系统相对来说初遇一种比拟繁忙的状态,那么他们就只能排队执行,交替执行。

从不同的视角去对待问题,你会失去不同的答案。运行在操作系统上的任何过程,是无奈独占 CPU 的,所以在一段时间内 CPU 会执行很多过程,这就是并发,即便说程序员做了一个不反对并发的软件(不能同时做不止一件事件),下面咱们探讨的,一个音乐软件不反对在线播放,只能是缓冲完了再播放,那么咱们只能说该程序从构造上来说是不反对并发的。从操作系统上来说,各个过程依然是并发的,古代操作系统不会容许哪个过程齐全独占 CPU,过程们总是轮流应用 CPU,在一段时间内重叠了,就是并发。比方过程 A 的起始工夫是 0,完结工夫 2,而过程 B 的起始工夫是 1,完结工夫是 4,那咱们就能够说过程 A 和 B 是并发的,起因在于这两个的过程执行时间段存在交加。如果多个过程的执行时间段存在交加,那么咱们能够称这些过程即为并发执行的。从操作系统的角度上来说,总是存在并发的,操作系统后盾总是运行着很多过程,他们监控着操作系统的运行状态,执行工夫存在交加。因而从全局上探讨并发意义并不是很大,咱们须要独自的察看程序,也就是程序外部的并发,也就是程序自身在一段时间内能够做很多事件。

程序同时能够做不止一件事件,这样的软件,咱们称之为并发软件,你很难见到非并发的软件。当咱们说某个程序是并发程序的时候,通常说的是这个程序采纳了并发的设计,也就是这个程序内的多个操作能够在重叠的时间段内进行,很经典的一个场景就是在线听歌,一个很简略的在线听歌,粗略的说能够拆成三个操作: 1. 向指定服务器发动申请获取音频下载到本地 2. 将下载的音频解压 3. 播放。

对于对并行的阐释《深刻了解计算机系统》相当精妙: 如果两个过程并发的运行在不同的计算机或者 CPU 外围上,那咱们就称这两个过程是并行的。咱们来粗疏的剖析一下这段话,并发的运行象征这两个过程的执行时间段存在交加,在这个交加上两个过程都在应用 CPU,那么此时两个过程就是并行的。

对于操作系统来说,引入并发机制晋升了资源的使用率,加强了操作系统的可用性。于计算机用户来说,他们就能够同时做不止一件事了,比方在解决 word 文档的时候,听听音乐,现在这都是司空见惯的事件。

然而故事到这里就完结了吗?应该不是,万事万物都在一直倒退,很快多过程的并发就碰到了一些问题,这也操作系统引入多线程的起因。咱们须要明确,在一些波及资源相干的操作的时候(比方 I /O、线程、网络),咱们总是调用操作系统的接口。

为什么要引入多线程?

咱们尝试编写一个 MP3 播放软件,来领会一下多线程带来的益处,
外围功能模块有三个:
(1) 从 MP3 音频文件当中读取数据
(2) 对数据进行解压缩
(3) 把解压缩后的音频数据播放进去。
非并发版本,单过程的实现办法(为了不绑定在某一种语言上,这里咱们用伪码来简略示意):

main(){while (true) {read(); // I/O 
            decompress(); // CPU
            play();}
}

下面的伪码,当然非常的简略,粗心是不一次性读完,而后读一些,CPU 解压一些,而后播放、
咱们来大抵的剖析一下这个程序的弊病,咱们晓得 I / O 是很慢的,有的时候等半天,你能力听到一点点。
这样的软件体验是很差的,那么很天然咱们就心愿这个函数不用严格的相互期待,然而还是要有一点简略的主次关系,他们是并发执行,也就是说你必定是先读,能够读的多一点,而后再解压、播放。这样的软件结构在没有多线程之前就是多过程形式,像上面这样

这样做长处是体验更好了,咱们晓得 CPU 是很快的,就像当初我的电脑上运行了很多过程,我仍然在晦涩的写博客。
所以咱们能够先让读过程先跑一段时间,也就是多读一点数据,这样的话,这个 MP3 播放软件放音乐就更为让人称心。
然而问题又来了:

  • 多个过程如何共享数据,留神每个过程的地址空间都是公有的。
  • 除此之外,创立过程来说,开销是很大的,很多时候资源都是无限的。

共享数据来说,这个是有解决方案的,各位有兴致的话,能够去查查,然而还是不如在一个地址空间不便。节约资源的话,
在过程身上寻求解决方案,是没有后果的,过程的开销无奈防止,在过程身上找不到解决方案的话,咱们无妨跳出去,也就是说提出一种新的实体,该当满足以下个性:

  • 实体之间能够并发地执行
  • 实体之间共享雷同的地址空间,这样实体之间共享数据相对来说更为简略。

基于此,咱们须要再度扫视一下咱们的过程:

  • 从资源组合的角度: 过程把一组相干的资源组合起来,形成了一个资源平台,包含地址空间(代码段、数据段)、关上的文件等各种资源,
  • 从运行的角度: 代码在这个资源平台上的一条执行流程。

粗略的说,咱们能够将过程当做资源和执行流程的复合体,过程 = 资源 + 执行流程。执行流程往前再进一步就是线程,下面用过程展现的 MP3 播放软件,咱们关注的也就是执行流程: 读取、解压、播放,咱们能够将这三个执行流程放在一个过程外面,咱们大抵上能够这么讲,线程 = 过程 – 共享资源。显然咱们能够看出多线程绝对于多过程的劣势,留神这里要强调一点,多线程绝对于多过程来说并非是碾压级别的劣势,比方 chrome 浏览器就是多过程,为什么 chrome 浏览器采取多过程机制呢,咱们考虑一下,线程们是处在一个地址空间的,假如 chrome 是多线程,那么一个网页的某个线程因为某些起因产生了异样,那么势必影响到所有的网页,这是咱们不想看到的。多线程是一种伎俩,多过程也是,要依据场景灵便的抉择。多线程绝对于多过程的长处就是:

  • 共享资源更为容易,因为都处于一个地址空间。
  • 各个线程之间能够并发的执行
  • 一个过程内能够有多个线程,更为节俭资源。

毛病:

  • 一个线程的解体,可能会影响整个过程

过程 VS 线程

呈现线程之后,过程的位置就又产生了变动。

  • 过程是资源分配单位,线程是 CPU 调度单位。
  • 过程领有一个残缺的资源平台,而线程只独享必不可少的资源,如寄存器和栈。
  • 线程同样具备就绪、阻塞和执行三种根本状态,同样具备状态之间的状态关系。
  • 线程能缩小并发执行的工夫和空间开销:

    • 线程的创立工夫比过程短,因为所需资源更少。
    • 线程的终止工夫比过程短。
    • 同一过程内线程切换工夫比过程短
    • 因为同一过程的各线程共享内存和文件资源,可间接进行不通过内核的通信。

当咱们说起多线程与高并发时

当咱们说起多线程与高并发时,咱们就权且了解为以后计算机上的资源使用率很高,场景在具体一些,比方购物节,用户访问量会比平时高很多,一般来说服务端的做法是,为一个用户开启一个线程来解决用户的申请,用户很多,而后就是多线程,很多线程必然是并发执行,所以说是高并发。

所以我集体认为当咱们说起多线程与高并发时,说的就是在用户量访问量在一段时间猛增时,应该怎么去解决。

参考资料:
《操作系统》向勇、陈渝。

正文完
 0