1.计算机系统漫游
最后更新于
最后更新于
从程序员的角度,所需要理解的计算机系统知识。
键盘输入指令,回车shell知道我们已经结束了命令的输入。键盘输入通过I/O总线到寄存器文件,触发I/O中断。
shell执行一系列指令,这些指令将hello目标文件中的代码和数据从磁盘拷贝到主存,从而加载hello文件。数据包括最终会被输出的字符串“hello,world\n”
利用DMA(直接存储器存取)的技术,数据可以不通过处理器而直接从磁盘到达主存。
一旦hello目标文件中的代码和数据被加载到了存储器,处理器就开始执行hello程序的主程序中的机器语言指令。这些指令将“hello,world\n”串中的字节从存储器中拷贝到寄存器文件,再从寄存器文件中拷贝到显示设备,最终显示在屏幕上。
通过,上面的简单事例。我们知道,系统花费了大量时间把信息从一个地方挪到另一个地方。hello程序的机器指令最初存放在磁盘上。当程序加载时,它们被拷贝到主存。当处理器运行程序时,指令又从主存拷贝到处理器。相似地,数据串“hello,world/n”开始时在磁盘上,再被拷贝到主存,然后从主存拷贝到显示设备。从一个程序员的角度来看,大量的拷贝减慢了程序的实际工作。因此,系统设计者的一个主要目标就是使这些拷贝操作尽可能的快。
根据机械原理,较大的存储设备要比较小的存储设备运行的得慢。而快速设备的造价远高于低速设备。
高速缓存,存放处理器在将来不久可能会用到的数据。
一个典型的高速缓存存储器。位于处理器芯片上的L1高速缓存的容量可以达到数万个字节,访问速度几乎和访问寄存器的文件一样。一个容量为数十万到数百万的更大的L2高速缓存是通过一条特殊的总线连接到处理器的。访问L2的开销要比访问L1的开销大5倍,但是仍然比访问主存的时间快5~10倍。L1和L2高速缓存是一种叫做静态随机访问存储器的硬件技术实现的。
形成层次结构的存储设备
在处理器和一个较大较慢的设备(例如主存)之间插入一个更小、更快的存储设备(比如高速缓存)的想法成为一个普遍观念。
所有对硬件的操作尝试,都必须通过操作系统
操作系统的两个基本特征:
防止硬件被失控的应用程序滥用
在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法
像hello这样的程序在现代操作系统上运行时,操作系统会提供一种假象,就好像系统上只有这个程序在运行。程序看上去独占地使用处理器、主存和I/O设备,而处理器看上去就像不间断的一条接一条地执行程序中的指令。该程序的代码和数据就好像是系统存储器中唯一的对象。这些假象是通过进程的概念来实现的,进程是计算机科学中最重要和最成功的概念之一。
进程是操作系统对运行程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。我们称之为并发运行,实际上是说一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换(context switching)。
尽管通常我们认为一个进程只有单一的控制流,但是在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。由于网络服务器中对并行处理的要求,线程成为越来越重要的编程模型,因为多个线程之间比多进程之间更容易共享数据,也因为线程一般比进程更高效。
虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,好像每个进程都在独占地使用主存。每个进程看到的存储器都是一致的,称之为虚拟地址空间。
在linux中,最上面的四分之一的地址空间是预留给操作系统中的代码和数据的,这对所有进程都一样。底部的四分之三的地址空间用来存放用户进程定义的代码和数据。
虚拟存储器的运作需要硬件和操作系统软件间的精密复杂的相互合作,包括对处理器生成的每个地址的硬件翻译。基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
文件只不过就是字节序列。每个I/O设备,包括磁盘、键盘、显示器,甚至于网络,都可以被看成是文件。系统中的所有输入输出都是通过使用称为Unix I/O的一小组系统函数调用读写文件来实现的。