性能之殇(四)-- Unix 进程模型的局限

2018-11-14   /   阅读数:1323   /   分类: 操作系统

Unix 系统 1969 年诞生于 AT&T 旗下的贝尔实验室。1971 年,Ken Thompson(Unix之父) 和 Dennis Ritchie(C语言之父)共同发明了 C 语言,并在 1973 年用 C 语言重写了 Unix。

Unix 自诞生起就是多用户、多任务的分时操作系统,其引入的“进程”概念是计算机科学中最成功的概念之一,几乎所有现代操作系统都是这一概念的受益者。但是进程也有局限,由于 AT&T 是做电话交换起家,所以 Unix 进程在设计之初就是延续的电话交换这个业务需求:保证电话交换的效率,就够了。

1984年,Richard Stallman 发起了 GNU 项目,目标是创建一个完全自由且向下兼容 Unix 的操作系统。之后 Linus Torvalds 与 1991 年发布了 Linux 内核,和 GNU 结合在了一起形成了 GNU/Linux 这个当下最成功的开源操作系统。所以 Redhat、CentOS、Ubuntu 这些如雷贯耳的 Linux 服务器操作系统,他们的内存模型也是高度类似 Unix 的。

Unix 进程模型介绍

进程是操作系统提供的一种抽象,每个进程在自己看来都是一个独立的图灵机:独占 CPU 核心,一个一个地运行指令,读写内存。进程是计算机科学中最重要的概念之一,是进程使多用户、多任务成为了可能。

上下文切换

操作系统使用上下文切换让一个 CPU 核心上可以同时运行多个进程:在宏观时间尺度,例如 5 秒内,一台电脑的用户会认为他的桌面进程、音乐播放进程、鼠标响应进程、浏览器进程是在同时运行的。

  • 图片来自《CS:APP》

上下文切换的过程

以下就是 Linux 上下文切换的过程:

假设正在运行网易云音乐进程,你突然想搜歌,假设焦点已经位于搜索框内。

  1. 当前进程是网易云音乐,它正在优哉游哉的播放着音乐
  2. 你突然打字,CPU 接到键盘发起的中断信号(异常控制流中的一个异常),准备调起键盘处理进程
  3. 将网易云音乐进程的寄存器、栈指针、程序计数器保存到内存中
  4. 将键盘处理进程的寄存器、栈指针、程序计数器从内存中读出来,写入到 CPU 内部相应的模块中
  5. 执行程序计数器的指令,键盘处理程序开始处理键盘输入
  6. 完成了一次上下文切换

名词解释

  • 寄存器:CPU 核心里的用于暂时存储指令、地址和数据的电路,和内核频率一样,速度极快
  • 栈指针:该进程所拥有的栈的指针
  • 程序计数器:简称 PC,它存储着内核将要执行的下一个指令的内存地址。程序计数器是图灵机的核心组成部分。还记得冯·诺依曼架构吗,它的一大创造就是把指令和数据都存在内存里,让计算机获得了极大的自由度。

Unix 进程模型的局限

Unix 进程模型十分的清晰,上下文切换使用了一个非常简单的操作就实现了多个进程的宏观同时运行,是一个伟大的杰作。但是它却存在着一个潜在的缺陷,这个缺陷在 Unix 诞生数十年之后才渐渐浮出了水面。

致命的内存

进程切换过程中需要分别写、读一次内存,这个操作在 Unix 刚发明的时候没有发现有什么性能问题,但是 CPU 裹挟着摩尔定律一路狂奔,2000 年,AMD 领先 Intel 两天发布了第一款 1GHz 的微处理器 “AMD Athlon 1GHz”,此时一个指令的执行时间已经低到了 1ns,而其内存延迟高达 60ns,这导致了一个以前不曾出现的问题:

上下文切换读写内存的时间成了整个系统的性能瓶颈。

软件定义一切

我们将在下一篇文章探讨 SDN(软件定义网络),在这里我们先来看一下“软件定义一切”这个概念。当下,不仅有软件定义网络,还有软件定义存储,甚至出现了软件定义基础架构(这不就是云计算嘛)。是什么导致了软件越来越强势,开始倾入过去只有专业的硬件设备才能提供的高性能高稳定性服务呢?我认为,就是通用计算机的发展导致的,确切地说,是 CPU 和网络的发展导致的。

当前的民用顶级 CPU 的性能已经爆表,因为规模巨大,所以其价格也要显著低于同性能的专用处理器:自建 40G 软路由的价格大约是 40G 专用路由价格的二十分之一。

Jietu20181114-172151

下一篇文章我们将讨论上图中的 DPDK、SDN 以及知名的性能优化方案“大页内存”。

WRITTEN BY

avatar

评论:

yg
2018-11-26 11:53
最后一句话是写反了吗?应该是40G路由设备的价格远高于自建40G软路由?
JohnLui
2018-11-26 12:02
@yg:是的

发表评论:

© 2011-2018 岁寒  |  Powered by Emlog