计算机系统基础知识
1、基本概念
元宵同返家(打一成语)计算机系统是由硬件和系统软件组成的,它们共同⼯作来运⾏应⽤程序,尽管系统的具体⽅式随着时间不断地变化,但是系统内在的概念却没有改变,所有的计算机系统都有相似的硬件和软件组成,它们⼜执⾏着相似的功能。
2、信息就是位+上下⽂
⼀个最简单的应⽤程序hello,源⽂件名为hello.c,内容如下所⽰:
#include <stdio.h>
int main()
{
printf("hello, world\n");
return0;
}
hello程序的⽣命周期是从⼀个源程序开始的,程序员通过编辑器创建并保存的⽂本⽂件hello.c,源程序实际上就是⼀个由值0和1组成的位序列,8个位被组织成⼀组,称为字节,每个字节表⽰源⽂件的⽂本字符,⼤部分的现代计算机系统都使⽤ASCII标准来表⽰⽂本字符,像hello.c这样由ASCII字符构成的⽂件叫做⽂本⽂件,所有其它⽂件称为⼆进制⽂件。
系统中所有的信息,包括磁盘⽂件、内存中的程序、内存中存放的⽤户数据以及⽹络上传输的数据,都是由⼀串⽐特位表⽰的,区分不同数据对象的唯⼀⽅法是读到这些数据的上下⽂,⽐如在不同的上下⽂中,⼀个同样的字节序列可能表⽰⼀个整数、浮点数、字符串或者机器指令等。
3、程序被其它程序翻译成不同的格式
hello程序的⽣命周期是从⼀个⾼级C语⾔程序开始的,这种形式能够被⼈容易读懂,然⽽,为了在系统上运⾏hello.c程序,每条源⽂件的语句都必须被其它程序转化为⼀系列的低级机器语⾔指令,然后,这些指令按照⼀种称为可执⾏⽬标程序的格式进⾏打包,并以⼆进制磁盘⽂件的形式存放起来,⽬标程序也称为可执⾏⽬标⽂件。
在Linux系统上,从源⽂件到⽬标⽂件的转化是由编译器驱动程序完成的:
爱情笑话短信# gcc -o hello hello.c
上述命令中,GCC编译器驱动程序读取源⽂件hello.c,并把它翻译成⼀个可执⾏⽬标⽂件hello,整个翻译过程可以分为四个阶段完成,分别为预处理、编译、汇编、链接,执⾏这四个阶段的程序(预处理器、编译器、汇编器、链接器)共同构成了编译系统,整个编译阶段如下图所⽰:
预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序,例如hello.c中的第⼀⾏的#include <stdio.h>命令告诉预处理器读取系统头⽂件stdio.h的内容,并把它直接插⼊程序⽂本中,结果就得到了另⼀个C程序,通常是以.i作为⽂件拓展名;
编译阶段:编译器(ccl)将⽂本⽂件hello.i翻译成⽂件⽂件hello.s,它包含⼀个汇编语⾔程序,以⼀种⽂本格式描述低级机器语⾔指令;
刘德华电影汇编阶段:接下来,汇编器(as)将hello.s翻译成机器语⾔指令,把这些指令打包成⼀种叫做可重定位⽬标程序的格式,并将结果保存在⽬标⽂件hello.o中,hello.o⽂件是⼀个⼆进制⽂件;
链接阶段:hello程序调⽤了printf函数,它是每个C编译器都提供的标准C库中的⼀个函数,存在于其它的⽬标⽂件中,⽽这个⽂件必须以某种⽅式合并到hello.o程序中,链接器(ld)就是负责处理这种合并,结果就得到hello可执⾏⽬标⽂件,该程序可以被加载到内存中,由系统执⾏。
4、处理器读并解释存储在内存中的指令
hello.c源⽂件已经被编译系统翻译成了可执⾏⽬标⽂件hello,并被存放在磁盘上,如果想在Linux系统上运⾏该可执⾏⽂件,可以将它的⽂件名输⼊到称为shell的应⽤程序中:
# ./hello
hello, world
#
shell是⼀个命令⾏解释器,它输出⼀个提⽰符,并等待输⼊⼀个命令⾏,然后执⾏这个命令,如果该命令⾏的第⼀个单词不是⼀个内置的shell命令,那么shell就会假设这是⼀个可执⾏⽂件的名字,它将加载并运⾏这个⽂件。
(4.1)系统的硬件组成
⼀个典型系统的硬件组织,如下图所⽰:
(4.1.1)总线
贯穿整个系统的是⼀组电⼦管道,称作总线,它携带信息字节并负责在各个部件间传递,通常总线被设计成传送定长的字节块,也就是字(word),字中的字节数(字长)是⼀个基本的系统参数,各个系统中都不仅相同,现在⼤多数机器字长⼀般是4个字节(32位)或者8个字节(64位)。
(4.1.2)I/O设备
I/O(输⼊/输出)设备是系统与外部世界的联系通道,在上图的典型系统包括了四个I/O设备:作为⽤户输⼊的键盘和⿏标,作为⽤户输出的显⽰器,以及⽤于长期存储数据和程序的磁盘驱动器(磁盘),每个I/O设备都通过⼀个控制器或适配器与I/O总线相连,控制器和适配器的功能是在I/O总线和I/O设备之间传递信息。
(4.1.3)主存
主存是⼀个临时存储设备,在处理器执⾏程序时,⽤来存放程序和程序处理的数据,从物理上来说,主存是由⼀组动态随机存取存储器(DRAM)芯⽚组成的,从逻辑上来说,存储器是⼀个线性的字节数组,每个字节都有唯⼀的地址(数组索引),这些地址是从零开始的,⼀般来说,组成程序的每条机器指令都由不同数量的字节构成,与C程序变量相应的数据项的⼤⼩是根据数据类型变化的。
赚钱方法(4.1.4)处理器
中央处理单元(CPU),简称处理器,是解释存储在主存中指令的引擎,处理器的核⼼是⼀个⼤⼩为⼀个字的存储设备(寄存器),也称为程序计数器(PC),在任何时刻,PC都指向主存中的某条机器语⾔指令(含有该条指令的地址),从系统通电开始,直到系统断电,处理器⼀直在不断地执⾏程序计数器指向的指令,再更新程序计数器,让其指向下⼀条要指向的指令,处理器看上去是按照⼀个⾮常简单的指令执⾏模型来操作的,这个模型是由指令集架构决定的,在这个模型中,指令按照严格的顺序执⾏,⽽执⾏⼀条指令包含⼀系列的步骤,处理器从程序计数器指向的内存处读取指令,解释指令中的位,执⾏该指令指⽰的简单操作,然后更新PC,使其指向下⼀条指令。
CPU在指令的要求下可能会执⾏以下操作:
加载:从主存复制⼀个字节或者⼀个字到寄存器,以覆盖寄存器原来的内容;
存储:从寄存器复制⼀个字节或者⼀个字到主存的某个位置,以覆盖这个位置上原来的内容;
操作:把两个寄存器的内容复制到算术/逻辑单元(ALU),ALU对这两个字做算术运算,并将结果存放到⼀个寄存器中,以覆盖寄存器中原来的内容;
社保转移流程跳转:从指令本⾝中抽取⼀个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值。
(4.2)运⾏hello程序
系统是如何运⾏hello程序的呢?初始时,shell程序执⾏它的指令,等待我们输⼊⼀个命令,当⽤户通过键盘上输⼊字符串"./hello"后,shell 程序将字符逐⼀读⼊寄存器,再把它存放到内存中,如下图所⽰:
当⽤户在键盘上按下回车键后,shell程序知道已经结束了命令的输⼊,然后执⾏⼀系列指令来加载可执⾏⽬标⽂件hello,这些指令将hello ⽬标⽂件中的数据和代码从磁盘复制到主存,利⽤直接存储器存取(DMA)技术,数据可以不通过处理器⽽直接从磁盘到达主存,如下图所⽰:
⼀旦⽬标⽂件hello中的代码和数据被加载到主存,处理器就开始执⾏hello程序中main函数的机器语⾔指令,这些指令将"hello, world\n"字符串中的字节从主存复制到寄存器⽂件,再从寄存器⽂件中复制到显⽰设备,最终显⽰输出到⽤户屏幕上,如下图所⽰:
5、⾼速缓存的重要性
hello程序的运⾏实例揭⽰了⼀个重要的问题,即系统花费了⼤量的时间把信息从⼀个地⽅搬移到另⼀个地⽅,hello程序的机器指令最初是存放到磁盘上,当程序加载时,它们被复制到主存,当处理器运⾏程序时,指令⼜从主存复制到处理器,相似地,数据串"hello, world\n"开始是存到磁盘上,然后被复制到主存中,最后从主存上复制到显⽰设备,系统设计者的⼀个主要⽬标就是使这些复制操作尽可能快地完成。⼀个典型的寄存器⽂件只存储⼏百字节的信息,⽽主存⾥可以存放⼏⼗亿字节,处理器
从寄存器⽂件中读数据⽐从主存中读取⼏乎要快100倍,随着半导体技术的进步,处理器与主存之间的差距还在持续增⼤,针对这种处理器与主存之间的差异,系统设计者采⽤了更⼩更快的存储设备,称为⾼速缓存存储器(cache memory,简称为cache或⾼速缓存),作为暂时的集结区域,存放处理器近期可能会需要的信息,⼀个典型系统中的⾼速缓存存储器如下图所⽰:
位于处理器芯⽚上的L1⾼速缓存的容量可达数万字节,访问速度⼏乎和访问寄存器⽂件⼀样快,系统可以获得⼀个很⼤的存储器,同时访问速度也很快,原因是利⽤了⾼速缓存的局部性原理,即程序具有访问局部区域⾥的数据和代码的趋势,通过让⾼速缓存⾥存放可能经常访问的数据,⼤部分的内存操作都能在快速的⾼速缓存中完成。老人去世第一年的规矩
6、存储设备的层次结构
在处理器和⼀个较⼤较慢的设备(例如主存)之间插⼊⼀个更⼩更快的存储设备(例如⾼速缓存)的想法已经成为⼀个普遍的观念,实际上,每个计算机系统中的存储设备都被组织成了⼀个存储器层次结构,如下图所⽰:
在这个层次结构中,从上⾄下,设备的访问速度越来越慢,容量越来越⼤,并且每字节的造价也越来越便宜。
7、操作系统管理硬件
当shell加载并运⾏hello程序时,以及hello程序输出⾃⼰的消息时,shell和hello程序都没有直接访问键盘、显⽰器、磁盘或者主存,取⽽代之的是,它们依靠操作系统提供的服务,⽤户可以把操作系统看成是应⽤程序和硬件之间插⼊的⼀层软件,所有应⽤程序对硬件的操作尝试都必须通过操作系统,计算机系统的分层如下图所⽰:
操作系统有两个基本功能:
防⽌硬件被失控的应⽤程序滥⽤;
向应⽤程序提供简单⼀致的机制来控制复杂⽽⼜通常不相同的低级硬件设备。
操作系统通过⼏个基本的抽象概念(进程、虚拟内存和⽂件)来实现这两个基本功能,如下图所⽰:
⽂件是对设备的抽象显⽰,虚拟内存是对主存和磁盘I/O设备的抽象表⽰,进程则是对处理器、主存和I/O设备的抽象表⽰。
(7.1)进程
像hello这样的程序在现代计算机系统上运⾏时,操作系统会提供⼀种假象,就好像系统上只有这个程序在运⾏,程序看上去是独占地使⽤处理器、主存和I/O设备的,处理器看上去就像不间断地⼀条接⼀条地执⾏程序中的指令,即该程序的代码和数据是系统内存中唯⼀的对象。
进程是操作系统对⼀个正在运⾏的程序的⼀种抽象,在⼀个系统上可以同时运⾏多个进程,⽽每个进程都好像在独占地使⽤硬件资源,⽽并发运⾏,则是说⼀个进程的指令和另⼀个进程的指令是交错执⾏的,在⼤多数系统中,需要运⾏的进程数是多于可以运⾏它们的CPU个数的,单处理器在⼀个时刻只能执⾏⼀个程序,⽽先进的多核处理器同时能够执⾏多个程序,⽆论是在单核还是多核系统中,⼀个CPU看上去都像是在并发地执⾏多个进程,这是通过处理器在进程间切换来实现的,操作系统实现这种交错执⾏的机制称为上下⽂切换。
操作系统会保持跟踪进程运⾏所需要的全部状态信息,这种状态,也就是上下⽂,包括许多信息,例如PC和寄存器⽂件的当前值,以及主存的内容,在任何⼀个时刻,单处理器系统都只能执⾏⼀个进程的代码,当操作系统决定要把控制权从当前进程转移到某个新进程时,就会进⾏上下⽂切换,即保持当前进程的上下⽂,恢复新进程的上下⽂,然后将控制权传递到新进程,新的进程就会从上次停⽌的地⽅开始执⾏。
hello进程和shell进程的上下⽂切换⽰意图如下:
从⼀个进程到另⼀个进程的转换是由操作系统内核(kernel)管理的,内核是操作系统代码常驻内存的部分,当应⽤程序需要操作系统的某些操作时,⽐如读写⽂件,它就会执⾏⼀条特殊的系统调⽤(system call)指令,将控制权传递给内核,然后内核执⾏被请求的操作并返回应⽤程序,内核不是⼀个独⽴的进程,它是系统管理全部进程所⽤代码和数据结构的集合。
(7.2)线程
尽管通常我们认为⼀个进程只有单⼀的控制流,但是在现代系统中,⼀个进程实际上可以由多个称为线程的执⾏单元组成,每个线程都运⾏在进程的上下⽂中,并共享同样的代码和全局数据,由于⽹络服务器中对并⾏处理的需求,线程成为越来越重要的编程模型,因为多线程之间⽐多进程之间更容易共享数据,线程⼀般来说都⽐进程更⾼效,当有多处理器可⽤的时候,多线程也是⼀种使得程序可以运⾏得更快的⽅法。
(7.3)虚拟内存
虚拟内存是⼀个抽象概念,它为每个进程提供了⼀个假象,即每个进程都在独占地使⽤主存,每个进程看到的内存都是⼀致的,称为虚拟地址空间,下图所显⽰的是Linux进程的虚拟地址空间:
在Linux系统中,地址空间最上⾯的区域是保留给操作系统中的代码和数据的,这对所有进程来说都是⼀致的,地址空间的底部区域存放⽤户进程定义的代码和数据,上图中地址是从下往上增⼤的,每个进程看到的虚拟地址空间由⼤量准确定义的区构成,每个区都有专门的功能,从最低的地址开始,逐步向上介绍:
程序代码和数据:对所有的进程来说,代码是从同⼀固定地址开始,紧接着的是和C全局变量相对应的数据位置,代码和数据区是直接按照可执⾏⽬标⽂件的内容初始化的;
堆:代码和数据区后紧随着的是运⾏时堆,代码和数据区在进程⼀开始运⾏时就被指定了⼤⼩,与此不同,当调⽤像malloc和free这样的C标准库函数时,堆可以在运⾏时动态地拓展和收缩;
共享库:⼤约在地址空间的中间部分是⼀块⽤来存放像C标准库和数学库这样的共享库的代码和数据的区域;
栈:位于⽤户虚拟地址空间顶部的⽤户栈,编译器⽤它来实现函数调⽤,和堆⼀样,⽤户栈在程序执⾏期间可以动态地拓展和收缩,特别地,每次调⽤⼀个函数时,栈就会增长,从⼀个函数返回时,栈就会收缩;
内核虚拟内存:地址空间顶部是为内核所保留的,不允许应⽤程序读写这个区域的内容或者直接调⽤内核代码定义的函数,相反,它们必须调⽤内核来执⾏这些操作。
虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器⽣成的每个地址的硬件翻译,基本思想是把⼀个进程虚拟内存的内容存储在磁盘上,然后⽤主存作为磁盘的⾼速缓存。
(7.4)⽂件
⽂件就是字节序列,每个I/O设备,包括磁盘、键盘、显⽰器,甚⾄⽹络等,都可以看成是⽂件,系统中的所有输⼊输出都是通过使⽤⼀⼩组称为Unix I/O的系统函数调⽤读写⽂件来实现的。
8、计算机系统之间利⽤⽹络通信
现代计算机系统经常通过⽹络和其它系统连接到⼀起,从⼀个单独的系统来看,⽹络可视为⼀个I/O设备,如下图所⽰:
当系统从主存复制⼀串字节到⽹络适配器时,数据流经过⽹络到另⼀台机器,⽽不是⽐如说到达本地磁盘驱动器,相似地,系统可以读取从其它机器发送来的数据,并把数据复制到⾃⼰的主存,随着Internet这样的全球⽹络的出现,从⼀台主机复制信息到另外⼀台主机已经成为计算机系统最重要的⽤途之⼀,⽐如,像电⼦邮件、万维⽹、FTP等应⽤都是基于⽹络复制信息的功能。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论