小白入门之一:计算机基础
计算机系统
计算机系统由硬件(Hardware)系统和软件(Software)系统两大部分组成。
计算机硬件
计算机(Computer):俗称电脑,是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速地处理,然后把处理结果输出的现代化智能电子设备。 发展历史: * 第一代计算机(1946-1957) 电子管时代 * 第二代计算机(1958-1964) 晶体管时代 * 第三代计算机(1965-1970) 集成电路时代 * 第四代计算机(1971以后) 大规模集成电路时代
1946年,世界上第一台计算机ENIAC(electronic numerical integrator and calculator)在美国宾州大学诞生,是美国奥伯丁武器试验场为了满足计算弹道需要而研成的。使用了17468只电子管,占地170平方米,重达30吨,耗电174千瓦,耗资40多万美元。每秒可进行5000次加法或减法运算。
计算机的体系结构
程序是由指令和数据组成的,而程序只有载入内存才能被计算机执行,那么计算机开机之后怎么知道CPU、内存等硬件是否良好,怎么知道自身有几块硬盘以及启动次序呢?也就是如何实现“加电自检”?这就需要计算机要有能够实现自举的能力将自身的元件激活,然后加载操作系统,让操作系统去实现自举程序无法实现的功能。那么我们所说的自举程序是什么呢?计算机有是如何实现自举的呢?我们先来了解计算机的体系结构!
计算机的体系结构包括运算器、控制器、存储器和输入输出设备五大部件组成,这是由美籍匈牙利科学家冯.诺唯曼于 1946 年提出的。运算器实现运算,控制器控制运算器到内存的什么位置取数据又将数据存在什么位置,存储器在这里我们指的是内存,键盘鼠标是我们的常见的输入设备,屏幕是我们常见的输出设备,而硬盘既是输入设备又是输出设备。
我们以加法器来说一下运算器,其实运算器是由许多个加法器组成的,即使是做减法运算也是将减法换算成加法来进行运算。例如要做二进制“1+0”的加法运算,输入 A 的开关就闭合的,输入 B 的开关就是断开的,然后输出端的就有了电压。但是,运算的过程中有可能会产生进位,因此还有有进位输出。计算机只能进行二进制的运算,为什么呢?如果运算器可以进行十进制“3+5”的运算, 我们是否可以将输入 A 加一个 3V 的电压, 输入 B 加 5V 电压,最后输出一个 8V 的电压。但是线路是有电阻的,在电的传输过程中就会产生压降,整数的运算尚可以接受,那么小数呢?“0.03+0.05”该如何运算?显然十进制不可以的!
其实这种推论很荒唐,但是不管怎么说运算器是进行二进制的运算。运算器是基于电学和逻辑学实现计算的一种电子设备,是电子设备就要符合电路的基本原理,要实现计算就要通过运算器中大规模逻辑门电路来实现逻辑运算。
内存是平面编址设备,所谓平面编址就是将内存的基本单位从一排到最后。与之相反的一种编址方式是三维编址,例如我们把一个国家分成 34 个省直辖市特别行政区,然后一个省又分成若干个市,市又分成若干个县。所以,到这里大家应该就能明白什么叫平面编址了吧!内存在计算机中起到一个什么作用呢?其实内存存储的是磁信号,而电磁是是可以相互转换的。运算器读内存中的数据时,内存中的磁信号转换成 CPU 针脚上的电信号;反过来,运算器写数据时是通过针脚上有无电压转换到内存中磁信号。
说到内存,我们不得不提一提计算机的位,常见的有 32 位和 64 位。有人常说 32 位的操作系统内存最大可以使用 4G 的内存。这里的位相对于寄存器的位数而言的,现在计算机的寄存器,物理地址总线宽度是相同的,因此在保护模式下 32 位的 CPU 的寻址能力 2^32,也就是 4G;而 64 位的 CPU 的寻址能力为 2^64,也就是 4G 个 4G,当然不是 16G 啊!一般而言,64 位的 CPU 比 32 位的 CPU 运算速度快,但是要想让一个软件有 64 位的速度,前提是 CPU、操作系统和软件都是 64 位!
由于内存是易失性存储设备,我们就期望有一种设备能将运算的结果长久的保存,这就用到了硬盘。输入输出设备其实就是我们与计算机之间交互的一种中间设备,那么当我们敲键盘或点鼠标这种信息是如何被计算机捕捉到呢?在 CPU 内部有一种叫可编程中断控制器用于捕捉我们这种动作信息,然后交由运算器进行处理。
在计算机中运算器的运算速度要比内存快的的多的多,为了提高计算机的运算速度,CPU 内部集成了缓存,缓存的速度比运算器的速度慢但是比内存的速度快。因此,相同主频的 CPU 未必运算速度就一样。缓存要想工作,就要遵循程序的局部性原理,所谓程序的局部性原理包括时间上的局部性和空间上的局部性。时间上的局部性是指上一次访问的数据很有可能再次访问就放到二级缓存再放到一级缓存,空间上的局部性是指现在访问的数据的周围的数据将可能被访问到就载入缓存。
最后,我们回过头来说计算机的自举。ROM 是只读存储器,内部存储了 BIOS(Basic Input Output System)程序,这段程序由计算机的硬件逻辑完成的。计算一开机的时候,ROM 芯片中的 BIOS 程序(也就我们之前所说的自举程序)会被映射到内存最开始的地方,然后由这段程序来完成加电自检。我们为什么要花时间来讲计算机的体系结构呢?因为,我们后期的系统调优要用到这些理论性的东西。
计算机的主板上有北桥控制器和南桥控制器,北桥控制器是高速总线控制器,一般用于连接内存等需要速度快且数据量大的设备,然后连接到 CPU;而南桥是低速总线控制器,用于连接速度较慢的键盘鼠标网卡等,然后汇总交由北桥,最后传输到 CPU。而现在,为了提速,内存有可能不在通过北桥连接到 CPU,而是直接连到 CPU;硬盘是机械设备,有的服务器直接采用固态硬盘,然后将固态硬盘接入北桥控制器。这就是硬件调优!
操作系统
试想一下,我们写一个程序在 Intel CPU 上能运行,在 Motorola CPU 上能运行吗?不能!因为这两种 CPU 的运行机制是不同的。CPU 只能识别二进制,如果我们用二进制来编程那就太困难了,因此 CPU 自带微码,也就是汇编语言,汇编语言是人类容易识别的语言,但是汇编语言跟硬件的结合成都很高,在 Intel CPU 上写的程序依然无法在 Motorola CPU 上运行。 因此就有人将底层的功能抽象出来提供统一的 API 接口, 程序员只需要根据接口编程,不用管底层硬件的不同。这种程序所用的语言就是高级语言。
早期的计算机,输入设备穿孔纸带,输出设备发光二极管,然后由记录员记录计算机的执行结果。再后来就出现了磁带机,磁带机的速度比穿孔纸带的速度快了许多。这个时期出现了批处理系统,所谓批处理系统就是将一批作业提交给操作系统之后就不再干预,由操作系统控制他们自动运行。各个任务之间会有间隔符号,当一个任务结束后,监督程序会识别到任务结束,然后将控制权交由下一个任务。虽然批处理系统能让程序连续运行,减少任务与任务之间空闲时间所消耗的成本,但是计算机计算的速度很快而输入很慢。
于是,在 1964 年,由 AT&T 的 bell 实验室、MIT(麻省理工学院)和 GE(美国通用电气公司)共同研发名为multics 的分时操作系统,也由此开启了现代操作系统的新纪元。现代操作系统与以往不同之处在于可以实现多任务,使得计算机的计算能力被充分利用。但是计算机只有一颗 CPU 和一段内存,那么该如何实现多任务呢?CPU 的计算能力是根据时间的流逝而完成, 因此将 CPU 的运算资源划分成一个一个时间片(slice)。 假设每个时间片 1ms、有两个程序,那么第一个程序运行 1ms,然后第二个程序再运行 1ms,这样交替执行。内存呢?将内存分段,这里就有了虚拟地址空间的概念,也就是说,32 位操作系统下的程序假设自身有 4G 内存!
CPU 和内存计算机最核心的硬件设备,是计算机得以运行的基础,因此我们将 CPU 和抽象成计算机的硬件;硬件之上就是操作系统的内核,内核将 CPU 的计算功能抽象成系统调用,由于系统调用太过底层(所谓底层就是如果 word 和 excel 都需要一个打印的功能,那么依据系统调用编程 word 和 excel 必须都要开发一个打印模块,而依据库调用只要开发一个打印模块),因此将系统调用封装成库向外提供 API 接口供程序员编程时调用。库也是一种程序,但是不能独立执行,只有被调用的时候才会执行。当然,程序员也可以直接使用系统调用来编程!计算机的顶端就是程序,其中最重要最基本的程序就是 shell,shell 是人机接口界面。
操作系统也是软件, 只不过它是一种通用软件, 不实现具体的功能而是协调各个程序以完成具体的功能。当然,操作系统要想运行起来就必须要载入内存,但是内存中也有其他进程,我们怎样才能保证其他进程无法破坏操作系统的进程呢?CPU 有四个环,操作系统运行在第 0 环,应用程序运行在最外面一环,中间两环保留。第 0 环直接映射到内核空间,保证操作系统的安全。
Kernel 的存在使得应用程序无法直接与硬件设备打交道,所有的操作都要经过内核来处理。当我们敲击 delete键的时候,这个中断信息会被 CPU 内部的可编程中断控制器捕捉到;然后,CPU 将这个信息提交给内核来处理,那么内核怎么知道是这个信息是作用于哪个程序的,前面我们说过操作系统协调各个程序的运行,所以操作系统当然知道了。于是内核将“delete”这个信息交由焦点进程来处理。当然内核功能不仅包括进程管理,还包括内存管理、文件系统、网络功能、硬件驱动和安全机制等。
最后,我们来总结一下操作系统,一方面,操作系统使得应用程序无法直接与硬件打交道必须经由操作系统的内核,协调多个程序运行避免恶意程序破坏其他进程独占资源,保证了多任务平稳的运行;另一方面,操作系统向外提供系统调用,然后系统调用被封装成库向外提供库调用,程序员只需要根据库的 API 接口进行编程,不用关心底层硬件的不同,便于程序的移植。
linux操作系统
首先,讲一下 Linux 的基本原则:
- 由目的单一的小程序组成;组合小程序完成复杂任务
- 一切皆文件
- 尽量避免捕获用户接口
- 配置文件保存为纯文本格式
其次,讲一下 Linux 的 shell,shell 有壳的意思,是人机接口。Linux 的 shell 包括 GUI 和 CLI 两种类型。GUI (Graphical User Interface)图型用户接口,比较常见的有 gnome、KDE 和 xface 等,其中 gnome 和 xface 用 C 语 言开发的,KDE 是用 C++开发的。CLI(Command Line Interface)是命令行接口,比较常见的有 bash、csh、zsh、 ksh 和 tcsh 等,我们用 bash。
最后,讲一下用户的登录和命令的执行过程。用户名是 Linux 系统的访问认证标识,但是用户名不能作为用户 是否可以访问资源的限定标识;因此需要认证(Authentication),认证就是为了确定某个人确实是他所声称的那个用 户;认证之后系统要对用户进行授权(Authorization);任何行为都都需要监督,因此,审计(Audition),审计是通 过日志来完成的。
登录之后会出现命令提示符(Prompt)等待我们输入命令,既然是命令(即程序),那么无论是二进制的可执行文件还是脚本程序都必须有可执行入口。所谓的可执行入口就是在程序开始的地方有一段用于标识文件特殊性的字符,我们成为 magic number 或 shebang。当我们输入命令的时候,shell 会将我们的命令提交给内核,内核会找到这个命令并根据 magic number 判断此命令是否是可以执行的程序。由于 magic number 的不同,也决定了他们所能理解的二进制格式不一样的,因此在 Windows 上编译的程序在 Linux 上未必能运行,即使他们的库完全一样。
文章来源于网络,侵删!
文章来源于网络,侵删!