首页 > 代码库 > 1 计算机硬件基础

1 计算机硬件基础

 

一 为什么要学习计算机基础

      python是编程语言,即python是语言,凡是语言都是用来沟通的介质。
      程序员编程的本质就是让计算机去工作,而编程语言就是程序员与计算机沟通的介质。
      程序员要想让计算机工作,必须知道计算机能干什么,怎么干,这也就是我们必须学习计算机基础的原因。
      然而光有编程语言和硬件也并不能满足大家的编程需求,为什么这么说呢?
      程序用编程语言写程序,最终开发出的结果就是一个软件,既然是软件,那就与腾讯qq、暴风影音、快播等软件没有区别了。这些软件必须运行在操作系统之上,你肯定会问:为何要有操作系统呢?没错,远古时代的程序员确实是在没有操作系统的环境下,用编程语言之间操作硬件来编程的,你可能觉得这没有问题,但其实问题是相当严重的,因为此时你必须掌握如何操作硬件的所有具体细节,比如如何具体操作硬盘(现在你得把硬盘拆开,然后你能看见的所有的东西,你都得研究明白,因为你编程时要用到它),这就严重影响了开发的效率,操作系统的出现就是运行于硬件之上,来控制硬件的,我们开发时,只需要调用操作系统为我们提供的简单而优雅的接口就可以了

二 计算机硬件介绍

      从概念上讲,一台简单的个人计算机可以抽象为类似上图的模型,CPU,内存以及I/O设备都由一条系统总线(bus)连接起来并通过总线与其他设备通信。现代计算机结构跟复杂,包括多重中心
技术分享

 

 
      理解各部分功能的一个简单的方法是,把计算机各部分组件往人的身上套,比如 
      cpu是人的大脑,负责运算
      内存是人的记忆,负责临时存储
      硬盘是人的笔记本,负责永久存储
      输入设备是耳朵或眼睛,负责接收外部的信息传给cpu
      输出设备是你的表情,负责经过处理后输出的结果
      以上所有的设备都通过总线连接,总线相当于人的神经

     再举个例子: 

     上课开始,老师讲课,学生听课,老师是程序员,学生是计算机,学生的器官都是计算机各部分组成

     1.老师通过学生的眼睛和耳朵将自己的知识/指令传给学生(输入)

     2.学生在接收知识/指令后,通过自己的神经,将其放入自己的内存/短期记忆(总线、内存)

     3.学生的大脑/cpu从短期记忆里取出知识/指令,分析知识/指令,然后学习知识/执行指令 (cpu取指、分析、执行)

     4.学生的表情会直接反映出自己是否听懂,这就是输出,老师瞅一眼就知道学生有没有学会(输出)

     5.学生想要永久将知识保存下来,只能拿出一个笔记本,把刚刚学会的知识都写到本子上,这个本子就是硬盘(磁盘)

 

2.1  处理器

 2.1.1 处理器指令集

    计算机的大脑就是CPU,它从内存中 取指令-->解码-->执行,然后再取指令-->解码-->执行下一条指令,周而复始,直到整个程序被执行完成。
     每个cpu都有一套可执行的专门指令集,任何软件的执行最终都要转化成cpu的指令去执行。所以Pentium(英特尔第五代x86架构的微处理器)不能执行SPARC(另外一种处理器)的程序

 2.1.2 寄存器

   因为访问内存以得到指令或数据的时间比cpu执行指令花费的时间要长得多,所以,所有cpu内部都有一些用来保存关键变量和临时数据的寄存器。这样通常在cpu的指令集中专门提供一些指令,用来将一个字(可以理解为数据)从内存调入寄存器,以及将一个字从寄存器存入内存。cpu其他的指令集可以把来自寄存器、内存的操作数据组合,或者用两者产生一个结果,比如将两个字相加并把结果存在寄存器或内存中。
 

 2.1.3 寄存器的分类

   1 用于保存变量和临时结果的通用寄存器
   2 程序计数器,它保存了将要取出的下一条指令的内存地址。在指令取出后,程序计算器就被更新以便执行后期的指令。
   3 堆栈指针,它指向内存中当前栈的顶端。该栈包含已经进入但是还没有推出的每个过程中的一个框架。在一个过程的堆栈框架中保存了有关的输入参数、局部变量以及那些没有保存在寄存器中的临时变量。
   4 程序状态字寄存器(Program Status World,PSW),这个寄存器包含了条码位(由比较指令集设置)、CPU优先级、模式(用户态或内核态),以及各种其他控制位。用户通常读入整个PSW,但是只对其中少量的字段写入。在系统调用和I/O中,PSW非常重要
 

 2.1.4 寄存器的维护

    操作系统必须知晓所有的寄存器。在时间多路复用的CPU中,操作系统会经常中止正在运行的某个程序并启动(或再次启动)另一个程序。每次停止一个运行着的程序时,操作系统必须保存所有的寄存器,这样在稍后该程序被再次运行时,可以把这些寄存器数据重新装入。
 

  2.1.5 处理器设计的演变

   1 最开始取值、解码、执行这三个过程是同时进行的,这意味着任何一个过程完成都需要等待其余两个过程执行完毕,时间浪费。
   2 后来被设计成了流水线式,即执行指令n时,可以对指令n+1解码,并且可以读取指令n+2,完全是一套流水线
 技术分享
   3 超变量cpu,比流水线更加先进,有多个执行单元,可以同时负责不同的事情,比如看片的同时,听歌,打游戏。
   4 两个或更多的指令被同时取出、解码并装入一个保持缓冲区中,直至他们都执行完毕。有一个执行单元空闲,就检查保持缓冲区是否还有可处理的指令
 技术分享

 

   这种设计存在一种缺陷,即程序的指令经常不按照顺序执行,在多数情况下,硬件负责保证这种运算结果与顺序执行的指令时的结果相同。
 

 2.1.6 内核态与用户态的概念

    除了嵌入式系统中的非常简答的CPU之外,多数CPU都有两种模式,即内核态与用户态。
    通常,PSW(程序状态字寄存器)中有一个二进制位控制这两种模式。
    内核态:当cpu在内核态运行时,cpu可以执行指令集中所有的指令,很明显,所有的指令中包含了使用硬件的所有的功能,(操作系统就在内核态下运行,从而可以访问整个硬件)
    用户态:用户程序在用户态下运行,仅仅只能执行cpu整个指令集的一个子集,该子集中不包含操作硬件功能的部分,因此,一般情况下,在用户态中有关I/O和内存保护也是可以被别的程序占用的。(操作系统占用的内存是受保护的,不能被别的程序占用),当然,在用户态下,将PSW中的模式设置成内核态也是禁止的。
 

2.1.7 内核态与用户态的切换

     用户态下工作的软件不能操作硬件,但是我们的软件比如暴风影音,一定会有操作硬件的需求,比如从磁盘上读一个电影文件,那就必须经历从用户态切换到内核态的过程,为此,用户程序必须使用系统调用(system call),系统调用系统内核并调用操作系统,TRAP指令把用户态切换成内核态,并启用操作系统从而获得服务。
    请把系统调用看成一个特别的过程调用指令就可以了,该指令具有从用户态切换成内核态的特别能力。调用结束后,操作系统会自动将内核态切换成用户态。
 

2.1.8 异常处理

   计算机使用TRAP来执行系统调用,多数的TRAP是由硬件引起的,用于警告有异常情况发生,如视图I/O等操作。在所有的情况下,操作系统都得到控制权并决定如何处理异常情况,有时,由于出错的原因,程序不得不停止。在其他的情况下可以忽略出错,如果已经提前宣布它希望处理某异常时,那么控制权还必须返回程序,让其处理相关的问题。
   

2.1.9 多线程和多核芯片

 1 第一种增强:在cpu芯片中加入更大的缓存,一级缓存L1,用和cpu相同的材质制成,cpu访问它没有延时
 2 第二种增强:一个cpu中的处理逻辑增多,intel公司首次提出,称为多线程(multithreading)或超线程(hyperthreading),对用户来说一个有两个线程的cpu就相当于两个cpu。
   在这里需要知道进程和线程的关系:进程是资源单位,进程是执行单位。多线程运行cpu保持两个不同的线程状态,可以在纳秒级的时间内来回切换,速度快到你看到的结果是并发的,伪并发的,然而多线程不提供真正的并行处理,一个cpu同一时刻只能处理一个进程(一个进程中至少一个线程)
3 第三种增强:除了多线程,还出现了傲寒2个或4个完整处理器的cpu芯片,如下图。要使用这类多核芯片肯定需要有多处理器操作系统。(引入例如L2缓存)
 技术分享

技术分享

三 存储器 

  存储的速度快,容量大,价格便宜,这3中是不可兼得的
  技术分享
  存储器系统采用如上图的分层结构,顶层的存储器速度较高,容量较小,与底层的存储器相比每位的成本较高,其差别往往是十亿数量级的。
 

3.1 寄存器 即L1缓存

      用与cpu相同材质制造,与cpu一样快,因而cpu访问它无延时,典型容量是:在32位cpu中位32*32,在64位cpu中为64*64,在两种情况下容量均<1KB。
Cpu立刻要用的放寄存器;Cpu经常用的放高速缓存
 

3.2 高速缓存  即L2缓存

    1 主要由硬件控制高速缓存的存取,内存中有高速缓存行按照0~64字节为行0,64~127为行1  
    2 最常用的高速缓存放置在CPU内部或者非常接近cpu的高速缓存中。
    3 当某个程序需要读一个存储数据时,高速缓存硬件检查所需要的高速缓存行是否在高速缓存中。如果是,则称为高速缓存命中,缓存满足了请求,就不需要通过总线把访问请求送往主存(内存),这毕竟是慢的。
    高速缓存的命中通常需要两个时钟周期。高速缓存为命中,就必须访问内存,这需要付出大量的时间代价。由于高速缓存价格昂贵,所以其大小有限,有些机器具有两级甚至三级高速缓存,每一级高速缓存比前一级慢但是容易大。
     缓存在计算机科学的许多领域中起着重要的作用,并不仅仅只是RAM(随机存取存储器)的缓存行。只要存在大量的资源可以划分为小的部分,那么这些资源中的某些部分肯定会比其他部分更频发地得到使用,此时用缓存可以带来性能上的提升。一个典型的例子就是操作系统一直在使用缓存,比如,多数操作系统在内存中保留频繁使用的文件(的一部分),以避免从磁盘中重复地调用这些文件,类似的/root/a/b/c/d/e/f/a.txt的长路径名转换成该文件所在的磁盘地址的结果然后放入缓存,可以避免重复寻找地址,还有一个web页面的url地址转换为网络地址(IP)地址后,这个转换结果也可以缓存起来供将来使用。
     缓存是一个好方法,在现代cpu中设计了两个缓存,再看4.1中的两种cpu设计图。第一行缓存称为L1总是在CPU中,通常用来将已经解码的指令调入cpu的执行引擎,另外还有耳机缓存L2,用来存放近来经常使用的内存字。L1与L2的差别在于对cpu对L1的访问无时间延迟,而对L2的访问规则有1-2个时钟周期(即1-2ns)的延迟。
 

3.3 内存

    主存,即内存,称为随机访问存储RAM。容量一直在不断攀升,所以不能在高速缓存中找到的,都会到主存中找到。
    内存是易失性存储,断电后数据全部消失
 
    除了主存RAM之外,许多计算机已经在使用少量的非易失性随机访问存储ROM(Read Only Memory,ROM),在电源切断之后,非易失性存储的内容并不会丢失,ROM只读存储器在工厂中就被编程完毕,然后再也不能修改。ROM速度快且便宜,在有些计算机中,用于启动计算机的引导加载模块就存放在ROM中,另外一些I/O卡也采用ROM处理底层设备的控制。
 
   EEPROM(Electrically Erasable PROM,电可擦除可编程ROM)和闪存(flash memory)也是非易失性的,但是与ROM相反,他们可擦除和重写。不过重写时花费的时间比写入RAM要多。在便携式电子设备中,闪存通常作为存储媒介。闪存是数码相机中的胶卷,是便携式音译播放器的磁盘,还应用与固态硬盘。闪存在速度上介于RAM和磁盘之间,但与磁盘不同的是,闪存擦除的次数过多,就被磨损了。
 
   还有一类存储器是CMOS,它是易失性的,许多计算机利用CMOS存储器来保持当前时间和日期。CMOS存储器和递增时间的电路由一小块电池驱动,所以即使计算机没有家电,时间也仍然可以正确地更新,除此之外CMOS还可以保存配置的参数,比如,哪个是启动磁盘等,之所以采用CMOS是因为他耗电非常少,一块工厂原装电池往往能使用若干年,但是当电池失效时,相关的配置和时间等都将丢失。
 

3.4 磁盘

  1  磁盘低速的原因是因为他一种机械装置,在磁盘中有一个或多个金属盘片,他们以5400,7200或10800rpm(rpm=revolutions per minute每分钟多少转)的速度旋转。
  2  信息写在磁盘上的一些列的同心圆上,是一连串的2进制位(称为bit位),8个bit称为1个字节Bytes,1024Bytes=1kB,1024kB=1MB,1024MB=1GB,所以我们平时说的磁盘容量最终指的是磁盘能写多少个2进制位
  3 磁盘结构:每个磁头可以读取一段环形区域,称为磁道
                      把一个手臂位置上所有磁道合起来,组成一个柱面
                      每个磁道划成若干扇区,扇区典型的值是512字节
  4 数据都放在一段一段的扇区,即磁道这个圆圈的一小段圆圈,从磁盘读取一段数据需要经历寻道时间和延迟时间
      平均寻道时间:机械手臂从一个柱面随机移动到相邻的柱面的时间成为寻道时间,找到了磁道就找到了数据所在的那个圈圈,但是还不知道数据具体在这个圈圈的具体位置
      平均延迟时间:机械手臂到达正确的磁道之后还必须等待旋转到数据所在的扇区下,这段时间成为延迟时间。
 

 3.5 虚拟内存

     许多计算机支持虚拟内存机制,该机制使计算机可以运行大于物理内存的程序,方法是将正在使用的程序放入内存去执行,而暂时不需要执行的程序放到磁盘的某块地方,这块地方成为虚拟内存,在linux中成为swap,这种机制的核心在于快读地映射内存地址,由cpu中的一个部件负责,成为存储器管理单元(Memory Management Unit MMU)
     从一个程序切换到另外一个程序,成为上下文切换(context switch),缓存和MMU的出现提升了系统的性能,尤其是上下文切换
    

 3.6 磁带 

      在价钱相同的情况下比硬盘拥有更高的存储容量,虽然速度低于磁盘,但是因其大容量,在地震水灾火灾时可移动性强等特性,常被用来备份。(常见于大型数据库系统中)
 
 

四  I/O设备

    I/O设备一般包括两个部分:设备控制器和设备本身
    控制器:是查找主板上的一块芯片或一组芯片(硬盘,网卡,声卡等都需要查到一个口上,这个口连的便是控制器),控制器负责控制连接的设备,它从操作系统接收命令,比如读硬盘数据,然后就对硬盘设备发起读请求来读出内容。
    控制器的功能:通常情况下对设备的控制是非常负责和具体的,控制器的任务就是为操作系统屏蔽这些负责而具体的工作,提供给操作系统一个简单而清晰的接口。
    设备本身:有相对简单的接口且标准的,这样大家都可以为其编写驱动程序了。要想调用设备,必须根据该接口编写复杂而具体的程序,于是有了控制器提供设备驱动接口给操作系统。必须把设备驱动程序安装到操作系统中。
 

五  总线

    随着处理器和存储器速度越来越快,单总线很难处理总线的交通流量了,于是出现了下图的多总线模式,他们处理I/O设备及cpu到储存器的速度都更快。
   北桥即PCI桥:连接高速设备
   南桥即ISA桥:连接慢速设备
 技术分享

 

 

六  启动计算机

   在计算机的主板上有一个基本的输入输出程序(Basic Input Output system)
  BIOS就相当于一个小的操作系统,它有底层的I/O软件,包括读键盘,写屏幕,进行磁盘I/O,该程序存放于一非易失性闪存RAM中。
    
   启动流程:
   1 计算机加电
    2 BIOS开始运行,检测硬件:CPU、内存、硬盘等
    3 BIOS读取CMOS存储器中的参数,选择启动设备
    4 从启动设备上读取第一个扇区的内容(MBR主引导记录512字节,前446为引导信息,后64为分区信息,最后两个为标志位)
    5  根据分区信息读入bootloader启动装载模块,启动操作系统
    6  然后操作系统询问BIOS,以获得配置信息。对于每种信息,系统会检测其设备驱动程序是否存在,如果没有。系统则会要求用户按照设备驱动。一旦有了全部的设备驱动程序,操作系统就将他们调用内核。然后初始有关的表格(如进程表),创建需要的进程,并在每个终端上启动登录程序或GUI。
 
 

七  应用程序的启动流程

 
  1 操作系统提供桌面,并实时监听
  2 鼠标点击,提交打开文件的请求
  3 通过输入设备,输入设备控制程序,提交到操作系统
  4 操作系统寻找文件的位置,并读入内存,程序运行并启动
 
 
参考: http://www.cnblogs.com/linhaifeng/p/6523843.html

1 计算机硬件基础