编程语言、计算机硬件、操作系统之间的关系:
人与人之间沟通需要语言,比如:汉语、英语、法语、德语等等;编程语言亦是如此,比如Python、Java、C、C#、C++等等,而程序员一般设计的软件是不能直接操作计算机硬件的,而是要通过操作系统来操作计算机硬件。
应用程序->操作系统->硬件:
应用程序需要运行在操作系统之上,而操作系统必须运行在支持的硬件之上,三者关系如下图:
CPU、内存以及I/O设备都由一条系统总线(bus)连接起来并通过总线与其他设备通信:
主板:
主板又叫主机板(mainboard)、系统板(systemboard)或母板(motherboard);它分为商用主板和工业主板两种。它安装在机箱内,是微机最基本的也是最重要的部件之一。主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有BIOS芯片、I/O控制芯片、键和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件。
典型的主板能提供一系列接合点,供处理器、显卡、声效卡、硬盘、存储器、对外设备等设备接合。它们通常直接插入有关插槽,或用线路连接。主板上最重要的构成组件是芯片组(Chipset)。而芯片组通常由北桥和南桥组成,增强其性能。这些芯片组为主板提供一个通用平台供不同设备连接,控制不同设备的沟通。它亦包含对不同扩充插槽的支持,例如处理器、PCI、ISA、AGP,和PCI Express。
内存:
内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。内存(Memory)也被称为内存储器,其作用是用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算。
内存是一个暂时存储数据的地方,比如我们用键盘和鼠标在编辑word、excel这些程序的时候,里面的内容是暂时保存在内存里面的,等你做保存操作的时候,才真正的存储到计算机硬盘里面的。
内存包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。
只读存储器(ROM)
ROM表示只读存储器(Read Only Memory),在制造ROM的时候,信息(数据或程序)就被存入并永久保存,所以它是非易失性的。这些信息只能读出,不能写入,即使机器停电,这些数据也不会丢失。ROM一般用于存放计算机的基本程序和数据,如BIOS ROM。其物理外形一般是双列直插式(DIP)的集成块。
BIOS是英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
CMOS因为它是易失性的所以需要一个电池来长久存储BIOS里面的设置信息。
随机存储器(RAM)
随机存储器(Random Access Memory)表示既可以从中读取数据,也可以写入数据。当机器电源关闭时,存于其中的数据就会丢失。
EEPROM与闪存
EEPROM(Electrically Erasable PROM,电可擦除可编程ROM)和闪存(flash memory)也是非易失性的,存储器技术的成熟使得RAM和ROM之间的界限变得很模糊,如今有一些类型的存储器(如EEPROM和闪存)组合了两者的特性。这些器件像RAM一样进行读写,并像ROM一样在断电时保持数据,它们都可电擦除且可编程,但各自有它们优缺点。
从软件角度看,独立的EEPROM和闪存器件是类似的,两者主要差别是EEPROM器件可以逐字节地修改,而闪存器件只支持扇区擦除以及对被擦除单元的字、页或扇区进行编程。对闪存的重新编程还需要使用SRAM,因此它要求更长的时间内有更多的器件在工作,从而需要消耗更多的电池能量。设计工程师也必须确认在修改数据时有足够容量的SRAM可用。
存储器密度是决定选择串行EEPROM或者闪存的另一个因素。市场上可用的独立串行EEPROM器件的容量在128KB或以下,独立闪存器件的容量在32KB或以上。
如果把多个器件级联在一起,可以用串行EEPROM实现高于128KB的容量。很高的擦除/写入耐久性要求促使设计工程师选择EEPROM,因为典型的串行EEPROM可擦除/写入100万次。闪存一般可擦除/写入1万次,只有少数几种器件能达到10万次。
高速缓冲存储器(Cache)
Cache也是我们经常遇到的概念,也就是平常看到的一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于CPU与内存之间,是一个读写速度比内存更快的存储器。当CPU向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当CPU再次需要这些数据时,CPU就从高速缓冲存储器读取数据,而不是访问较慢的内存,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。
硬盘:
硬盘是电脑主要的存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成。碟片外覆盖有铁磁性材料。
硬盘有固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 传统硬盘)、混合硬盘(HHD 一块基于传统机械硬盘诞生出来的新硬盘)。SSD采用闪存颗粒来存储,HDD采用磁性碟片来存储,混合硬盘(HHD: Hybrid Hard Disk)是把磁性硬盘和闪存集成到一起的一种硬盘。绝大多数硬盘都是固定硬盘,被永久性地密封固定在硬盘驱动器中。
机械硬盘的内部构造图:
在图中我们可以看到,硬盘内部是有好多盘面被一个转轴为同心圆连接起来的,由转轴来转动,然后磁臂的摆动,磁头在盘面不停的读写数据
机械硬盘存储数据一般是分扇区存储,一个扇区是512Bytes
我们在存储设备是以2进制为基础的单位为bit,8bit=1bytes,1024bytes=1kB,1024KB=1MB,1024MB=1GB,1024GB=1TB
数据都存放于一段一段的扇区,即磁道这个圆圈的一小段圆圈,从磁盘读取一段数据需要经历寻道时间和延迟时间
平均寻道时间
机械手臂从一个柱面随机移动到相邻的柱面的时间成为寻到时间,找到了磁道就以为着招到了数据所在的那个圈圈,但是还不知道数据具体这个圆圈的具体位置
平均延迟时间
机械臂到达正确的磁道之后还必须等待旋转到数据所在的扇区下,这段时间成为延迟时间
虚拟内存
许多计算机支持虚拟内存机制,该机制使计算机可以运行大于物理内存的程序,方法是将正在使用的程序放入内存取执行,而暂时不需要执行的程序放到磁盘的某块地方,这块地方成为虚拟内存,在linux中成为swap,这种机制的核心在于快速地映射内存地址,由cpu中的一个部件负责,成为存储器管理单元(Memory Management Unit MMU)
CPU:计算机中最重要的硬件。
CPU是中央处理单元(Central Process Unit)的缩写,它可以被简称做微处理器。(Microprocessor),不过经常被人们直接称为处理器(processor)。不要因为这些简称而忽视它的作用,CPU是计算机的核心,其重要性好比心脏对于人一样。实际上,处理器的作用和大脑更相似,因为它负责处理、运算计算机内部的所有数据,而主板芯片组则更像是心脏,它控制着数据的交换。CPU的种类决定了你使用的操作系统和相应的软件。CPU主要由运算器、控制器、寄存器组和内部总线等构成,是PC的核心,再配上储存器、输入/输出接口和系统总线组成为完整的PC。
取指令->解码->执行,然后再从内存里面取指->解码->执行,这样不断循环操作直到程序执行完成为止。在这期间,CPU访问内存的得到数据或者指令的时间要比执行的时间要长,所以,就需要一个地方来存储临时数据和关键变量,那就是寄存器。
寄存器的分类:
1.除了用来保存变量和临时结果的通用寄存器外;
2.多数计算机还有一些对程序员课件的专门寄存器,其中之一便是程序计数器,它保存了将要取出的下一条指令的内存地址。在指令取出后,程序计算器就被更新以便执行后期的指令;
3.另外一个寄存器便是堆栈指针,它指向内存中当前栈的顶端。该栈包含已经进入但是还没有退出的每个过程中的一个框架。在一个过程的堆栈框架中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量;
4.最后 一个非常重要的寄存器就是程序状态字寄存器(Program Status Word,PSW),这个寄存器包含了条码位(由比较指令设置)、CPU优先级、模式(用户态或内核态),以及各种其他控制位。用户通常读入整个PSW,但是只对其中少量的字段写入。在系统调用和I/O中,PSW非常非常非常非常非常非常重要。
处理器设计的演变:
1.最开始CPU的取值、解码、执行这三个过程是同时执行的,这样的话,如果一个过程在执行时,另外的两个过程只能等待正在执行的过程完成才能进行,所以,这样大大浪费了时间;
2.后来改成流水线的执行过程,即执行指令n时,可以对指令n+1解码,并且可以读取指令n+2,完全是一套流水线。
3.超变量CPU比流水线更加先进,可以同时执行多个任务,比如在听歌的同时可以打游戏等等,因为两个或更多的指令被同时取出、解码并装入一个保持缓冲区中,直至它们都执行完毕。只有有一个执行单元空闲,就检查保持缓冲区是否还有可处理的指令。
内核态和用户态:
一般在PSW中有一个二进制位控制CPU的两种用户模式,那就是内核态和用户态。
内核态:当CPU以内核态运行时,CPU可执行包含的所有的指令集,包括那些可以操作硬件的指令集,我们的操作系统是运行在内核态的,所以可以操作我们的硬件;
用户态:我们的应用软件是运行在用户态下的,用户态下的CPU只能运行全部指令集内的部分子集,这部分子集不含操作硬件的功能,所以,一般情况下,在用户态下I/O和内存是保护的,因为操作系统的内存是受保护的,不能被占用的,并且,用户态下,PSW设置成内核态也是禁止的。
内核态和用户态的切换:
用户态下工作的软件不能操作硬件,但是我们的软件比如暴风影音,一定会有操作硬件的需求,比如从磁盘上读一个电影文件,那就必须经历从用户态切换到内核态的过程,为此,用户程序必须使用系统调用(system call),系统调用陷入内核并调用操作系统,TRAP指令把用户态切换成内核态,并启用操作系统从而获得服务。
多线程和多核芯片
根据Moore定律,芯片中的晶体管数量每经历18个月就会增加一倍,所以,我们用的CPU不断的在更新强大中:
1、第一步的增强就是在CPU芯片中加入了更大的缓存L1,他是用和CPU相同的的材质制成的,所以执行过程中并没有延时(后来又出现了二级缓存L2,三级缓存L3);
2、第二步的增强就是Intel公司发明了多线程和超线程,使得CPU执行任务时能够同时执行多个任务,对用户来说也就相当于多个CPU来执行多个任务,这样CPU执行任务的效率有很大一步的提升,但是本质上其实是多个线程执行时,在执行过程中是用极短的时间来相互切换任务执行的,对于用户来说用肉眼是无法分辨的,所以多线程并不是真正的多个任务来并行处理。
3、第三步的增强就是出现了2个或者4个或者8个核心的处理器的芯片,如下图:
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
线程有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
进程就好比工厂的车间,它代表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(随机存取存储器)的缓存行。只要存在大量的资源可以划分为小的部分,那么这些资源中的某些部分肯定会比其他部分更频发地得到使用,此时用缓存可以带来性能上的提升。一个典型的例子就是操作系统一直在使用缓存,比如,多数操作系统在内存中保留频繁使用的文件(的一部分),以避免从磁盘中重复地调用这些文件,类似的/root/a/b/c/d/e/f/a.txt的长路径名转换成该文件所在的磁盘地址的结果然后放入缓存,可以避免重复寻找地址,还有一个web页面的url地址转换为网络地址(IP)地址后,这个转换结果也可以缓存起来供将来使用。
缓存是一个好方法,在现代cpu中设计了两个缓存,再看4.1中的两种cpu设计图。第一级缓存称为L1总是在CPU中,通常用来将已经解码的指令调入cpu的执行引擎,对那些频繁使用的数据自,多少芯片还会按照第二L1缓存 。。。另外往往设计有二级缓存L2,用来存放近来经常使用的内存字。L1与L2的差别在于对cpu对L1的访问无时间延迟,而对L2的访问则有1-2个时钟周期(即1-2ns)的延迟。
总线:
1、南北桥,我们的计算机硬件是通过主板上面的北桥和南桥联系起来的,北桥即PCI桥:连接高速设备,南桥即ISA桥:连接慢速设备,所以有了下图:
2.计算机的启动流程:
(1)首先是加电;
(2)BIOS进行检测计算机硬件是否正常;
(3)BIOS读取CMOS中存储的参数,加载启动项;
(4)从启动设备上读取第一个扇区的内容(MBR主引导记录512字节,前446为引导信息,后64为分区信息,最后两个为标志位);
(5)根据分区信息读入bootloader启动装载模块,启动操作系统;
(6)操作系统询问BIOS硬件信息,看硬件是否都有正确的驱动程序,如果没有在进入系统后进行提示,自动或者手动安装驱动程序,正确安装驱动程序后正常调用操作系统内核,进行各项正常操作。