1-4 网络通信及计算机思想
系统之间利用网络通信
系统漫游至此,我们一直是把系统视为一个孤立的硬件和软件的集合体。实际上,现代系统经常通过网络和其他系统连接到一起,网络可视为一个I/O设备。当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是比如说到达本地磁盘驱动器,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。
随着Internet这样的全球网络的出现,从一台主机复制信息到另外一台主机已经成为计算机系统最重要的用途之一。比如,像电子邮件、即时通讯、万维网、FTP和 telnet这样的应用都是基于网络复制信息的功能。
回到hello示例,我们可以使用熟悉的telnet应用在一个远程主机上运行hello程序。假设用本地主机上的telnet客户端连接远程主机上的telnet服务器。在我们登录到远程主机并运行shell后,远端的shell就在等待接收输入命令。此后在远端运行hello程序包括5个基本步骤。(shell--> telnet xxx.xxx.xxx.xxx)
当我们在telnet客户端键入“hello”字符串并敲下回车键后,客户端软件就会将这个字符串发送到telnet的服务器。telnet 服务器从网络上接收到这个字符串后,会把它传递给远端shell程序。接下来,远端shell运行hello程序,并将输出行返回给telnet服务器。最后,telnet服务器通过网络把输出串转发给telnet 客户端,客户端就将输出串输出到我们的本地终端上。
这种客户端和服务器之间交互的类型在所有的网络应用中是非常典型的。
重要思想
Amdahl(阿尔达姆定律)
Amdahl 定律是计算机系统中的一个重要定律,核心思想是:我们对计算机系统的某一部分加速的时候,该加速部分对系统整体性能的影响取决于该部分的重要性和加速程度。也就是说,比如一个应用程序A,当系统执行他的时候所需要的时间是T,那么系统执行的时候可能是好几部分在执行他,假设系统某一部分执行所需要的时间为t,t与T的比值是a(t / T = a,也就是说 t = aT), 而该部分性能提升了k倍,那么所需要的时间就变成了 t’ = aT / k。这时候总的执行时间为
T(总) = T - t + t'
= T - aT + aT / k
= (1 - a) *T + (aT) / k
= (1 - a + a/k) * T
这个时候,加速比就是:S = T / T(总)
T 1
s =------------------ = ---------------
(1 - a + a/k ) * T (1 - a + a/k)
假如说:系统中某个部分运行程序耗时比例为60%,他的加速因子为3(k = 3),那么我们可以获得的加速比为
1 / (1 - 0.6 + 0.6 / 3) = 1 / 0.6 = 1.6667
说明,我们对系统一个部分作出重要改进,提速三倍,但是整体的速度却只提速1.6667,明显小于这一部分的提速。这就是Amdahl 的主要观点,要想显著加速整个系统,必须提升全系统中相当大部分的速度。
细节: 表示相对性能:性能提升最好的表示方法就是用比例,T(old) / T(new),如果速度有所改进,那么该比值就会大于1,比如时间由4变成了2,那么比值就是2,我们可以用 ”2.0X“来表示2倍。
Amldahl定律有一个有趣的情况就是考虑k趋向于无穷的时候,这就意味着,我们可以取系统的某一部分将其加速到一个点,在这个点上,这部分花费的时间可以忽略不计,那么就是S(k -> ∞) = 1 / (1 - a)。举个例子:
如果60%的系统能够加速到不花时间的程度,我们获得的净加速比仍只有1 / (1 - 0.6) = 1 / 0.4 = 2.5X。
Amdahl定律描述了改善任何过程的一般原则,除了可以用在加速计算机系统方面,还可以用在公司试图降低刀片制作成本,或者学生提高自己的学分绩点平均值等方面。我们常常把性能提升2倍或者更高的比例因子,这么高的比例因子只有通过优化系统的大部分组件才可以获得。
并发和并行
数字计算机的整个历史中,有两个需求是驱动进步的持续动力:一个是我们想要计算机做得更多,另一个是我们想要计算机运行得更快。当处理器能够同时做更多的事情时,这两个因素都会改进。我们用的术语并发(concurrency)是一个通用的概念,指一个同时具有多个活动的系统;而术语并行(parallelism)指的是用并发来使一个系统运行得更快。并行可以在计算机系统的多个抽象层次上运用。在此,我们按照系统层次结构中由高到低的顺序重点强调三个层次。
-
线程级并发
构建在进程这个抽象之上,我们能够设计出同时有多个程序执行的系统,这就导致了并发。使用线程,我们甚至能够在一个进程中执行多个控制流。自20世纪60年代初期出现时间共享以来,计算机系统中就开始有了对并发执行的支持。传统意义上,这种并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的,就好像一个杂耍艺人保持多个球在空中飞舞一样。这种并发形式允许多个用户同时从事多个任务,例如,在一个窗口中开启Web浏览器,在另一窗口中运行字处理器,同时又播放音乐。在以前,即使处理器必须在多个任务间切换,大多数实际的计算也都是由一个处理器来完成的。这种配置称为单处理器系统
当构建一个由单操作系统内核控制的多处理器组成的系统时,我们就得到了一个多处理器系统。其实从哪20世纪80年代开始,在大规模的计算中就有了这种系统,但是直到最近,随着多核处理器和超线程的出现,这种系统才变得常见。多核处理器是将多个CPU(称为"核")集成到一个集成电路芯片上。图1-17描述的是一个典型多核处理器的组织结构,其中微处理芯片有4个CPU核,每个核都有自己的L1和L2高速缓存,其中的L1高速缓存分为两个部分--一个保存最近取到的指令,另一个存放数据。这些核共享更高层次的高速缓存,以及到主存的接口。
超线程,有时称为同时多线程(simultaneous multi-threading),是一项允许一个CPU执行多个控制流的技术。它涉及CPU某些硬件有多个备件,比如程序计数器和寄存器文件,而其他的硬件部分只有一份,比如执行浮点算数运算的单元。常规的处理器需要大概20000个时钟周期做不同线程间的切换,而超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。这使得CPU能够更好地利用它的处理资源。比如,假设一个线程必须等到某些数据被装载到高速缓存中,那CPU就可以继续去执行另一个线程。举例来说,Intel Core i7处理器可以让每个核执行两个线程,所以一个4核的系统实际上可以并行地执行8个线程。
多处理器的使用可以从两方面提高系统性能。首先,它减少了在执行多个任务时模拟并发的需要。正如前面提到的,即使是只有一个用户使用的个人计算机也需要并发地执行多个活动,其次,它可以使应用程序运行时更快,因此,虽然并发原理的形成和研究已经超过50年的时间了,但是多核和超线程系统的出现才极大地激发了一种愿望,即找到书写应用程序的方法利用硬件开发线程级并行性。
-
指令级并发
在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。早期的微处理器,如1978年的Intel 8086,需要多个(通常是3~10个)时钟周期来执行一条指令。最近的处理器可以保存每个时钟周期24条指令的执行速率。其实每条指令从开始到结束需要长得多的时间,大约20个或者更多周期,但是处理器使用了非常多的聪明技巧同时处理多达100条指令。
如果处理器可以达到比一个周期一条指令更快的执行速率,就称为超标量处理器。大多数现代处理器都支持超标量操作。 -
单指令、多数据并行
在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并发执行的操作,这种方式称为单指令、多数据,即SIMD并行。
计算机系统中抽象的重要性
抽象是计算机科学中最为重要的概念之一。比如我们为一组函数规定一个简单的应用程序接口(API)就是一个很好的编程习惯,程序员无需了解它内部的工作便可以使用这些代码。不同的编程语言提供不同形式和等级的抽象支持,例如Java类的声明和C语言的函数原型。
如下图,在处理器里,指令集架构提供了对实际处理器硬件的抽象。使用这个抽象,机器代码表现得几号箱运行在一个依稀执行一条指令的处理器上。底层的已经远比抽象描述的要复杂惊喜,它并行的执行多条指令,但又总是与那个简单有序的模型保持一致。只要执行的模型一样,不同的处理器实现也能执行同样的机器代码,而有提供不同的开销和性能。
几个抽象概念的额介绍:
文件:对I/O设备的抽象
虚拟内存:对程序存储器的抽象
进程:对一个正在运行的程序的抽象
虚拟机:对整个计算机的抽象,包括操作系统,处理器和程序。
小结
计算机系统是由硬件和系统软件组成,它们共同协作以运行应用程序,计算机内部的信息被表示为一组组位,它们依据上文有不同的解释方式,程序被其他程序翻译成不同形式,开始是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件。
处理器读取并解释存放在主存中的二进制指令,因为计算机花费大量时间在内存,I/O设备和CPU寄存器之间复制数据,所以系统中的存储设备划分成层次结构-CPU寄存器在顶部,接着是多层的硬件告诉缓存存储器,DRSM主存和磁盘存储器。在层次模型中,位于更高层的存储设备比低层的存储设备要快,单位比特造价也更高。层次结构中较高层次的存储设备可作为较低层析的存储设备的告诉缓存。理解这种存储设备,可以优化C程序的性能。

浙公网安备 33010602011771号