全世界都有各国的语言,各地的方言,而计算机也有很多的编程语言。
编程语言就是程序员让计算机解决问题的工具,例如程序员想要让计算机干一件特定的事情,那这个时候就得先了解计算机其中的原理。
计算机硬件介绍:
计算机硬件包括:CPU\硬盘\内存\输入输出设备, 这些设备都通过总线连接,总线就相当人的大脑神经。
CPU:
CPU=大脑:从内存中 取指令→解码→执行,一直反复执行这一过程,直到整个程序执行完成。
每个CPU都有自己的指令集,相当于每个人的大脑结构都一样,但是每个人会的事情也不一样。
寄存器: 在访问内存得到指令或数据的时间比CPU执行指令的时间要长,所以,CPU内部都有一些用来保存关键变量和临时数据的寄存器。将一个字(理解为数据)从内存调入寄存器,以及将一个字从寄存器存入内存。CPU的一些指令集可以把来自寄存器、内存的操作数据组合,或者用两者产生一个结果,例如将两个字相加将结果存在寄存器中。
寄存器的分类:
通用寄存器:存储变量和临时结果
程序计算器:它保存了将要取出的下一条指令的内存地址。取出指令后,程序计算器就被更新以便执行后期的指令。
堆栈指针:也是一种寄存器,堆栈指针的规则是“先进后出”,先进去的后出来, 举个例子,有一个箱子,刚刚好可以放下一本书的大小,有语文、数学、英语、化学,先将语文放去,然后数学、英语、化学。
那么在出栈的时候,最先出来的是化学、英语、数学、语文。 跟进去的顺序相反,这就是“先进后出”的原则。
程序状态字寄存器(Program Status Word , PSW): 这个寄存器包含了条码位,CPU优先级、模式(用户态或内核态),及其它各种控制位。用户通常读入整个PSW,但是只对其中少量的字段写入。
####用户态与内核态:
CPU划分出来的两个权限等级,限制不同的程序之间的切换。 所有用户程序的运行都是在用户态的,但是有时候程序需要做一些内核态的事情,像硬盘读取数据。
内核态:操作系统在内核态下运行,可以访问整个硬件
用户态:只能受限的访问内存,且不允许访问外围设备。
例子:
打开一个播放器,这个时候是在用户态的,如果播放某一个视频文件,这个时候需要读取硬盘的视频文件,这一个过程需要访问硬盘,用户程序会使用系统调用(system call),就会切换到内核态。
#多线程和多核芯片
多核、多处理器系统中的每颗处理器(每个核),同时间内可以执行各自不同的行程(或线程)
一级缓存:在CPU芯片中加入更大的缓存,用和CPU相同的材质制成,CPU访问它没有时延
二级缓存:一个CPU中的处理逻辑增多,Intel公司首次提出,称为多线程(multithreading)或超线程(hyperthreading),对用户来说一个有两个线程的CPU就相当于两个CPU,进程是资源单位而线程才是CPU的执行单位。
多线程运行CPU保持两个不同的线程状态,可以在纳秒级的时间内来回切换,速度快到你看到的结果是并发的,伪并行的,然而多纯种不提供真正的并行处理一个CPU同一时刻只能处理一个进程(一个进程中至少一个线程)
第三步增强:除了多线程,还出现了2个或者4个完整处理器的CPU芯片。
存储器:
计算机中第二重要的是存储,大家都想存储:速度快(这样,CPU的等待存储器的延迟就降低了)+容量大+价钱便宜。然后同时兼备三者是不可能的,所以不同的处理方式
存储器系统采用如上图的分层结构,顶层的存储器速度较小,与底层的存储器相比每位的成本较高,其差别往往是十亿数量级的。
寄存器即L1缓存:
用与CPU相同材质制造,与CPU一样快,因而CPU访问它无时延,典型容量是:在32位CPU中为32*32,在64位CPU中为64*64,在两种情况下容量均<1kb.
高速缓存即L2缓存:
主要由硬件控制调整缓存的存取,内在中有调整缓存行按照0~64字节为行0,64~127为行1. 最常用的高速缓存行放置在CPU内部或者非常接近CPU的调整缓存中。当某个程序需要读一个存储字时,高速缓存硬件检查所需要的调整缓存行是否在高速缓存中。如果是,则称为高速缓存命中,缓存满足了请求,就不需要通过总线把访问请求送往主存(内存),这还是慢的,高速缓存的命中通常需要两个时钟周期。高速缓存为命中,就必须访问内存,需要付出大量的时间代价。由于高速缓存价格昂贵,所以其在小有限,有些机器具有两级甚至三级高速缓存,每一级高速缓存比前一级慢但是容易大。
缓存不仅仅是RAM(随机存取存储器)的缓存行,只要存在大量的资源可以划分为小的部分,这些资源就会比其他部分更频发的得到使用。这个时候就用缓存可以带来性能上的提升。
缓存是很好的方法,现代CPU中设计了两个缓存,第一级缓存称为L1总是在CPU中,常用来将已解码的指令调入CPU的执行引擎。
另外往往设计有二级缓存L2,用来存放近来经常使用的内存字。L1与L2的差别在于对CPU对L1的访问无时间延迟,而对L2的访问则有1-2个时钟周期(即1-2ns)的延迟。
内存:
再往下一层是主存,此乃存储系统的主力,主存通常称为随机访问存储RAM,就是我们通常所说的内在,容量一直在不断攀升,所有不能再高速缓存中找到的,都会到主存中找,主存是易失性存储,断电后数据全部消失。
除了主存RAM之外,许多计算机已经在使用少量的非易失性随机访问存储如ROM(Read Only Memory,ROM),在电源切断之后,非易失性存储的内容并不会丢失,ROM只读存储器在工厂中就被编程完毕,然后再也不能修改。ROM速度快且便宜,在有些计算机中,用于启动计算机的引导加载模块就存储在ROM中,另外一些I/O卡也采用ROM处理底层设备的控制。
EEPROM(Electrically Erasable PROM,电可擦除可编程) 和闪存(Flash memory)也是非失性的,但是与ROM 相反,他们可以擦除和重写。不过花费的时间比写入RAM要多。与磁盘不同的是闪存擦除的次数过多,就被磨损了。
CMOS存储器,它是易失性的,许多计算机利用CMOS存储器来保持当前时间和日期。CMOS存储器和递增时间的电路由一小块电池驱动,所以,即使计算机没有加电,时间也仍然可以正确地更新,CMOS还可以保存配置的参数,比如,哪一个是启动磁盘等,之所以采用CMOS是因为它耗电非常少,一块工厂原装电池往往能使用若干年,但是当电池失效时,相关的配置和时间等都将丢失。
磁盘:
磁盘低速的原因是因为它是一种机械装置,在磁盘中有一个或多个金属盘片,它们以5400,7200或10800rpm (RPM=revolutions per minute 每分钟的转速)。硬盘有一根机械臂在盘面上,类似于老式黑胶唱片机上的拾音臂。信息卸载盘上的一些列的同心圆上,是一连串的2进制位(称为bit位),为了统计方法,8个bit称为一个字节bytes,1024bytes=1k,1024k=1M,1024M=1G,所以我们平时所说的磁盘容量最终指的是磁盘能写多少2进制。
每个磁头可以读取一段换新区域,称为磁道
把一个戈丁手臂位置上所以的磁道合起来,组成一个柱面
每个磁道划成若干扇区,扇区典型的值是512字节
数据都存放于一段一段的扇区,即磁道这个圆圈的一小段圆圈,从磁盘读取一段数据需要经历寻道时间和延迟时间
平均寻道时间
机械手臂从一个柱面随机移动到相邻的柱面时间成为寻到时间,找到了磁盘就以为找到了数据所在的那个圈圈,但是还不知道数据具体这个圆圈的具体位置
平均延迟时间
机械臂到达正确的磁道之后还必须等待转到数据所在的扇区下,这段时间成为延迟时间
虚拟内存:
许多计算机支持虚拟内在机制,该机制使计算机可以运行大于物理内存的程序,方法是将正在使用的程序放入内存去执行,而暂时不需要执行的程序放到磁盘的某块地方,这块地方称为虚拟内存,在linux中称为swap,这种机制的核心在于快速的映射内存地址,由cpu中的一个部件负责,成为存储器管理单元(Memory Management Unit ,MMU)
PS:从一个程序切换到另外一个程序,成为 上下文切换(context switch),缓存和MMU的出现提升了系统的性能,尤其是上下切换。
磁带:
在价钱相同的情况下比硬盘更高存储容量,但是速度低于磁盘,但是因为其大容量,在地震水灾火灾时可移动性强等特性,常被用来做备份。(常见大型数据库系统中)
I/O设备
CPU和存储器并不是操作系统唯一需要管理的资源,I/O设备也是非常重要的一环。
I/O设备一般包括两个部分:设备控制器和设备本身
控制器:是查找主板上的一块芯片或一组芯片(硬盘、网卡,声卡等都要插到一个口上,这个就是连接控制器的),控制器负责控制连接的设备,它从操作系统接收命令,比如读硬盘数据,然后就对硬盘设备发起读请求来读出内容。
控制器的功能:通常情况下对设备的控制是非常复杂和具体的,控制器的任务就是为操作系统屏蔽这些复杂具体的工作,提供给操作系统一个接口。
设备本身:有相对简单的接口且标准,这样大家都可以为其编写驱动程序了,要想调用设备,必须根据接口编写复杂而具体的程序,于是有了控制器提供设备驱动接口给操作系统。必须把设备驱动程序安装到操作系统中。
总线:
随着处理器和存储器速度越来越快,单总线很难处理总线的交通流量了,于是出现了下图的总线模式,他们处理I/O设备及cpu到存储器的速度都更快。
北桥即PCI桥:连接高速设备
南桥即ISA桥:连接慢速设备
计算机的启动:
在计算机的主板有一个基本的输入输出程序(Basic Input Output system)
BIOS就相当于一个小的操作系统,它有底层的I/O软件,包括读键盘,进行磁盘I/O,该程序存放于 非易失性闪存RAM中。
启动的流程:
、计算机插电
2、BIOS运行,因为物理性BIOS处于主板上的位置,所以会先启动, 然后检测硬件:CPU、内存、硬盘等
3、BIOS 读取CMOS 存储器中的参数,选择启动设备
4、从启动设备上读取第一个扇区的内容(称为MBR ,主引导记录512字节,前446为引导信息,后64为分区信息,最后两个为标志位)
5、根据分区信息读入bootloader启动装载模块,启动操作系统
6、然后 操作询问BIOS,以获得配置信息,对于每一种设备,系统都会检查设备驱动是否存在,如果没有,系统会提示用户安装设备驱动程序,当装了全部的设备驱动程序,操作系统会将它们调入内核,然后初始有关的表格(如进程表),创建需要的进程,并在每个终端上启动登录程序或GUI