计算机硬件
一套完整的计算机系统分为:计算机硬件,操作系统,应用软件.(如下图)
一. 计算机硬件介绍
- 计算机硬件有五大部分组成:
1、控制器:计算机的指挥系统。控制器通过地址访问存储器,从存储器中取出指令,经译码器分析后,
- 根据指令分析结果产生相应的操作控制信号作用于其他部件,使得各部件在控制器控制下有条不紊地协调工作。
2、运算器:实现算术运算和逻辑运算的部件。
3、存储器:是计算机用来存放所有数据和程序的记忆部件。它的基本功能是按指定的地址存(写)入或者取(读)出信息。
- 计算机中的存储器可分成两大类:一类是内存储器,简称内存或主存;另一类是外存储器(辅助存储器),简称外存或辅存。
- 存储器由若干个存储单元组成,每个存储单元都有一个地址,计算机通过地址对存储单元进行读写。
- 一个存储器所包含的字节数称为存储容量,单位有B、KB、MB、GB、TB等。
4、输入设备:是向计算机中输入信息(程序、数据、声音、文字、图形、图像等)的设备 - 常见的输入设备有:键盘、鼠标、图形扫描仪、触摸屏、条形码输入器、光笔等。 外存储器也是一种输入设备。
5、输出设备:主要有显示器、打印机和绘图仪等。外存储器也当作一种输出设备。
#总结:
控制器+运算器=cpu(中央处理器)
内存储器:比如内存条--------------------------》大脑的记忆功能
基于电存取数据,断电数据全部丢失
用于临时保存数据,存取速度都快
外存储器:比如磁盘----------------------------》本子
基于磁存取数据,断电数据仍然存在
用于永久保存数据,存取速度都慢
人类通过编写程序/软件可以实现更好的控制计算机硬件,因此可以说,软件是计算机硬件的灵魂.而CPU中央处理器相当于计算机的大脑,它具有控制,运算的能力,CPU内部集成了用来控制计算机其他硬件操作的二进制指令集,人类编写的程序/软件最终都是转换成了CPU指令,然后去操作计算机其他硬件的.即:
人类运行的程序---------》cpu内部的二进制指令------》计算机其他硬件
程序的运行与计算机三大核心硬件cpu、内存、硬盘的关系
程序最先是存放于硬盘中的
程序的运行需要先经历加载的过程:程序的代码/数据从硬盘读入内存
然后cpu再从内存中读取指令来运行
ps:
安装软件都装到硬盘里,软件的运行都是把数据加载到内存中了
所以说计算机硬盘的大小决定了能够安装的软件数目
而计算机内存的大小决定了计算机能够同时运行的软件数
二. CPU处理器详解
通常将运算器和控制器合称为中央处理器(Central Processing Unit,CPU)。其中运算器用来主要负责程序运算与逻辑判断,控制器则主要协调各组件和各单元的工作,所以CPU的工作主要在于管理和运算。可以说计算机的大脑就是CPU,它从内存中取指令->解码->执行,然后再取指->解码->执行下一条指令,周而复始,直至整个程序被执行完成。
CPU读取的数据都是从主存储器(内存)来的!主存储器(内存)里的数据则是从输入单元所传输进来!而CPU
处理完毕的数据也必须先写回主存储器中,最后数据才从主存储器传输到输出单元。如图
:
我们已经知道CPU内部是含有微指令集的,我们所使用的的软件都要经过CPU内部的微指令集来完成才行。
这些指令集的设计主要又被分为两种设计理念,这就是目前世界上常见到的两种主要的CPU种类:分别是精简指令集(RISC)与复杂指令集(CISC)系统。
1、精简指令集(Reduced Instruction Set Computing,RISC):这种CPU的设计中,微指令集较为精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳;但是若要做复杂的事情,就要由多个指令来完成。
2、复杂指令集(Complex Instruction Set Computer,CISC)与RISC不同,在CISC的微指令集中,每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂,每条指令的长度并不相同。
因此指令执行较为复杂所以每条指令花费的时间较长,但每条个别指令可以处理的工作较为丰富。常见的CISC微指令集CPU主要有AMD、Intel、VIA等的x86架构的CPU。
#总结: CPU按照指令集可以分为精简指令集CPU和复杂指令集CPU两种,区别在于前者的指令集精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳;但是若要做复杂的事情,就要由多个指令来完成。后者的指令集每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂,每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长,但每条个别指令可以处理的工作较为丰富。
3、x86架构
x86是针对cpu的型号或者说架构的一种统称,详细地讲,最早的那颗Intel发明出来的CPU代号称为8086,后来在8086的基础上又开发出了80285、80386....,因此这种架构的CPU就被统称为x86架构了。
由于AMD、Intel、VIA所开发出来的x86架构CPU被大量使用于个人计算机上面,因此,个人计算机常被称为x86架构的计算机!
程序员开发出的软件最终都要翻译成cpu的指令集才能运行,因此软件的版本必须与cpu的架构契合,举个例子,我们在MySQL官网下载软件MySQL时名字为:
Windows(x86,32-bit),ZIP Archive
(mysql-5.7.20-win32.zip)
我们发现名字中有x86,这其实就是告诉我们:该软件应该运行在x86架构的计算机上。
4、32位和64位
cpu的位数指的是cpu一次性能从内存中取出多少位二进制指令,64位指的是一次性能从内存中取出64位二进制指令(64bit),而32位则只能从内存中取出32位二进制指令.
在2003年以前由Intel所开发的x86架构CPU由8位升级到16、32位,后来AMD依此架构修改新一代的CPU为64位,到现在,个人计算机CPU通常都是x86_64的架构。
cpu具有向下兼容性,指的是64位的cpu既可以运行64位的软件,也可以运行32位的软件,而32位的cpu只能运行32位的软件。
处理器的演变
1.最开始取值、解码、执行这三个过程是同时进行的,这意味着任何一个过程完成都需要等待其余两个过程执行完毕,时间浪费
2.后来被设计成了流水线式的设计,即执行指令n时,可以对指令n+1解码,并且可以读取指令n+2,完全是一套流水线。
3.超变量cpu,比流水线更加先进,有多个执行单元,可以同时负责不同的事情,比如看片的同时,听歌,打游戏。
两个或更多的指令被同时取出、解码并装入一个保持缓冲区中,直至它们都执行完毕。只有有一个执行单元空闲,就检查保持缓冲区是否还有可处理的指令
这种设计存在一种缺陷,即程序的指令经常不按照顺序执行,在多数情况下,硬件负责保证这种运算结果与顺序执行的指令时的结果相同。
多核
仅仅提高单核芯片的速度会遇到很多问题,英特尔工程师转而“横向发展”,提高计算机性能。线程应用能够充分利用多个内核,在同样的时间内完成更多的任务,大大提高cpu的性能。多核处理器是单枚芯片,可以插入一个处理器卡槽内,操作系统会利用相关资源将单枚芯片中的多个执行内核分立为多个处理器。
多线程(不同于程序中的多线程)
事实上单个执行内核的性能并没有被充分利用,因此工程师们又采用了另一个思路去提高cpu性能,即让单个执行内核可以同时执行多重线程,从而进一步提高cpu性能,这就是所谓的超线程技术。
虽然单线程核心每秒能处理成千上万条指令,但任一时刻,内核只能对一条线程进行操作,而其实这个内核还有很多性能没有被利用到,空闲着。超线程技术就是在一个执行内核上同时执行两个线程,两个线程共享这一个内核的资源。理论上来说就像两个独立的执行内核分别同时执行两个线程一样,但其实并不是这样。当两个线程同时需要同一个内核资源时,其中一个线程必须等待另一个线程使用完后释放资源,才能继续执行。所以超线程性能并不等于两个执行内核的性能。这里的多线程只是逻辑上的多线程,并不是真正意义上独立的多线程。
多进程与多线程
1.多任务
思考这样一个场景,你正在使用电脑一边播放音乐,一边浏览网页,同时还在聊QQ。此时电脑上至少有三个任务在“同时”运行,其实还有许多任务在后台执行只是你看不到罢了。任务数远大于cpu核心数,所以这里的多任务同时运行往往指的是并发执行,而不是并行执行。大量任务在cpu的多个内核上交替切换执行,但由于cpu执行速度太快,以至于我们感觉不到任务的切换,让人感觉所有任务都是在同时运行着。事实上,如果cpu是2核2进程的,则同一时刻只能有2个任务同时执行;如果cpu是2核4进程的,理论上同一时刻能够同时执行4个任务,实际上往往并不会达到4个任务并行执行,原因上节已经讲述在此不再赘述。
2. 多进程与多线程
对于操作系统来说,一个任务就是一个进程。比如打开一个world就是一个进程,打开两个world就是两个进程,打开浏览器也是一个进程。但有些进程不单单只完成一件事,比如在浏览器上看电影时,浏览器既要播放视频又要播放音频还要播放字幕等,这样在一个进程内就要做多件事,这多个子任务实际上就是进程中的线程。
由于每个进程至少要干一件事,多以每个进程至少有一个线程。多个线程的执行方式和多进程执行方式一样,是由操作系统在多个线程间切换执行的,切换速度极快导致我们感觉多个线程是同时执行的,事实上,现代操作系统都将线程作为最小的调度单位,而将进程作为资源分配的最小单位。一个进程内的多个线程是可以并行运行在多个核上的,但这也并不是一定的,比如python的线程模型并不支持并行运行在多个核上。
3. 多任务与多进程,多线程的关系
结合以上两节我们可以总结出同时执行多个任务的3种解决方案:
- 多进程模式:开启多个进程,每个进程开启一个线程,每个线程完成一件事,多个进程就完成多件事
- 多线程模式:开启一个进程,一个进程里开启多个线程,每个线程完成一件事,1个进程就完成多件事
- 多进程和多线程组合模式:开启多个进程,每个进程内开启多个线程,每个线程完成一件事,多个进程就完成多件事
以上三个解决方案中,方案三实现起来很复杂,需要解决的问题很多,使用的较少。而方案二,看似很好,一个进程就能完成多件事,那我们是不是可以将多个任务都在一个进程内的多个线程上完成呢?事实上,一个进程内不能无限制地开启很多个线程,当线程数量超过一定上限时,进程内线程间的切换,上下文环境的保存恢复需要占用大量时间,导致cpu性能下降。
4. 多进程与多线程的关系及优缺点
进程与线程间的关系:
- 一个进程至少有一个线程,可以有多个线程,但不可有过多的线程,否则性能下降
- 一个进程内的多个线程可以并行运行在多核多线程的处理器上
- 一个线程只属于一个进程,不可能两个或多个进程拥有同一个线程
- 进程是操作系统资源分配的基本单位,一个进程内的多个线程共享该进程的资源
- 线程是操作系统调度和执行的基本单位,即cpu分配给线程,真正在cpu上执行的是线程
多进程的优缺点
优点:每个进程间是相互独立的,一个进程的崩溃不会影响到其他进程的执行,稳定性高。
缺点:进程创建,调度等开销大。
多线程优缺点
优点:多线程直接共享进程资源,创建调度等开销小。
缺点:正是由于多线程共享进程资源导致任何一个线程挂掉都可能导致整个进程奔溃。
不管是多进程还是多线程,如果数量一多,效率就会下降,因为系统调度会占用大量cpu时间。
三. 存储器详解
寄存器===>一级缓存,存取速度非常快,几乎没有延迟,容量<1KB
高速缓存===>二级缓存,存取速度比一级缓存稍慢.
内存
RAM===》内存,可读可写,断电数据丢失.
存放的都是cpu要运行的程序,如qq、暴风影音、微信、爱奇艺视频等.
ROM====》只读内存,存取速度与内存一样,只能用于读,断电数据不丢失.
存放的是BIOS(Basic Input Output System基本的输入输出操作系统)系统.
CMOS===>是易失性的,断电数据丢失,由一小块电池来驱动, 但耗电非常少,一块工厂原装电池往往能使用若干年.
主要用来保持系统当前时间和日期,以及保存BIOS配置的参数.比如哪个是启动磁盘,存储BIOS密码设置等.
linux系统会把内存分出两种区域:
Buffer:缓冲区, buffer是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的。buffer将数据缓冲下来,解决速度慢和快的交接问题;速度快的需要通过缓冲区将数据一点一点传给速度慢的区域。例如:从内存中将数据往硬盘中写入,并不是直接写入,而是缓冲到一定大小之后刷入硬盘中。
Cache: 缓存区, cache就是从磁盘读取数据然后存起来方便以后使用。cache实现数据的重复使用,速度慢的设备需要通过缓存将经常要用到的数据缓存起来,缓存下来的数据可以提供高速的传输速度给速度快的设备。例如:将硬盘中的数据读取出来放在内存的缓存区中,这样以后cpu取的时候可以直接从内存的cache中取,速度会快很多。
硬盘
机械磁盘:
磁道:
当磁盘旋转时,磁头若保持在一个位置上,则每个磁头都会在磁盘表面划出一个圆形轨迹,这些圆形轨迹就叫做磁道。
扇区:
磁盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区,每个扇区可以存放512个字节的信息,磁盘驱动器在向磁盘读取和写入数据时,是以扇区为单位。磁盘的最小读写单位是一个扇区=512Bytes,操作系统的最小读写单位是一个block块=8个扇区=4KB
柱面:
在多个盘片构成的盘组中,由不同盘片的面,但处于同一半径圆的多个磁道组成的一个圆柱面称之为磁盘的柱面。磁盘的柱面数与一个盘面上的磁道数是相等的。分区指的就是从一个柱面开始到另外一个柱面结束,中间所包含的所有盘片对应的磁盘.
数据都存放于一段一段的扇区,即磁道这个圆圈的一小段圆圈,从磁盘读取一段数据需要经历寻道时间和延迟时间
读取扇区的数据,需要将磁头放到这个扇区上方,为了实现这一点:
1)首先必须找到柱面,即磁头需要移动对准相应磁道,这个过程叫做寻道或定位.
2) 盘面确定以后,盘片开始旋转,将目标扇区旋转到磁头下.
一次访盘请求(读/写)完成过程由三个动作组成:
1)寻道(时间):磁头移动定位到指定磁道,这部分时间代价最高(以7200转/分的硬盘为例,平均寻道时间为5ms).
2)旋转延迟(时间):等待指定扇区旋转至磁头下。与硬盘自身性能有关(以7200转/分的硬盘为例,平均延迟时间为4ms).
3)数据传输(时间):数据通过系统总线从磁盘传送到内存的时间.
虚拟内存
linux中有一个swap交换分区。swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间中的信息被临时保存到swap空间中,等到那些程序要运行时,再从swap中恢复保存的数据到内存中。系统总是在物理内存不够时,才进行swap交换。swap交换分区,其实就相当于承担了内存的作用(只是速度很慢罢了)。swap交换区起到了扩大内存的作用。所以从某些意义上来讲,swap区也可以叫做虚拟内存,但是这个虚拟内存是字面意思。
四. 计算机启动过程
1. 计算机加电
2. BIOS开始运行,检测硬件:cpu、内存、硬盘等
3. BIOS读取CMOS存储器中的参数,选择启动设备,从某一个启动设备中找到操作系统
4. 从启动设备上读取第一个扇区的内容,称之为MBR主引导记录,共512字节大小,前446字节为引导加载程序(bootloader)也就是grub程序,后64字节为分区信息,最后两个字节为标志位.
5. grub程序负责将操作系统内核装载入内存,启动操作系统
6. 操作系统会让BIOS去检测驱动程序
五. 电源
1,服务器双电源模块
2,电源模块的连接线接到不同的插件板上
3,ups(不间断电源):ups类似于一个蓄电池,相当于服务器的电池,可以在断电的情况下,为服务器供电一段时间,服务器ups一般可以撑到几个小时,期间可以为运维人员腾出时间解决电的问题.
4,生产中一般单个服务器核心业务最好使用双电源AB线路(由IDC机房提供双路电源,双路电源接到不同的市电电源).如果集群(一堆服务器做一件事)的情况可以不用双电源.
5,如果双路电源全停,UPS为服务器续命,续到一定时间UPS也快没电了,通常机房会有小型柴油发电机来应急,一般机房会和附近的加油站签订紧急供油协议.
六.硬盘接口
硬盘类型:机械与固态
硬盘性能与价格:
1. 硬盘层面性能: SSD(固态) > 机械磁盘
2. 硬盘接口层面性能: SAS > SATA
性能从高到低,价格从高到低:
1. SSD硬盘+SAS接口==>价格最高,土豪玩法
2. SSD硬盘+SATA接口==>对速度要求比较高的场景下的常规组合
3. 机械硬盘+SAS接口==>对速度没有特殊要求的场景下的常规组合
4. 机械硬盘+SATA接口==>穷人套餐,对速度要求较低,通常用于企业内部使用
具体应用案例:
1. 高并发场景下:冷热数据区分对待
热点数据: SSD+SAS接口或SATA接口,个人建议组合SSD+SAS接口
冷数据: 机械硬盘+SAS接口,钱不够可以采用穷人套餐.
什么是冷数据?什么是热数据?
用户经常访问的数据====>热点数据
不经常被用户访问====>冷数据
2. 常规正式工作场景 (线上的生产环境==> 即已经对外提供服务的环境, 给客户/ 用户用) 主选SAS (结合了SATA和SCSI的优点) 硬盘 (转速是1 5000转/分, 机械磁盘转数高的性能好) ,比较核心的业务都推荐使用SAS.
3. 不对外提供访问的服务器(自己人用的), 例如: 线下的数据备份, 可选SATA (7200或1 0000转/分).
阵列卡 (RAID卡)
网站数据量很大的时候, 单块盘装不下了, 购买多块盘, 又不想单个盘存放数据, 就需要工具(raid) 把所有硬盘整合成一个大磁盘, 再在这个大磁盘上在分区 (划分隔断、虚拟磁盘) 存放数据。
另外一大功能, 多块盘放在一起可以有冗余 (备份) 。
总结: 阵列卡, RAID卡好处:
1 .把所有硬盘的容量加在一起
2 .可以让数据更安全
3 .可以获得更高的性能
RAID有多种整合方式, RAID 0 1 5 10
有RAID卡后, 一般磁盘就会插到RAID卡上, 而不是直接插到主板上了。
raid0
至少1块盘
容量:n块盘合在一起的总容量
性能:理论上是n块盘合在一起的读写速度,实际上是要略低一些
冗余性:不允许坏任何一块盘
场合:追求读写性能,但是对数据安全性没有啥要求,例如集群服务器
特点:追求速度,不考虑数据安全
raid1
只能2块盘
容量:1块盘的容量
性能:几乎就是一块盘的读写速度
冗余性:可以坏一块盘,另外一块盘有完整的数据
场合:对数据安全性有要求,对读写速度没有特殊要求,例如服务器的系统盘
特点:追求数据安全,不考虑速度
raid5(介于raid0与raid1之间,是一种折中的方案)
至少3块盘,两两之间做奇偶校验===>异或运算,相同结果为0,不同结果为1
容量:去掉1块盘的容量,等量盘的情况下,容量低于raid0
性能:读写速度低于raid0,高于raid1
冗余性:可以坏一块盘,其余两块盘可以通过奇偶校验推导出坏盘的数据
场合:一般的场合都可以使用
raid10
至少有4块盘
raid1和raid0整合的产物,兼顾了raid1的数据安全性与raid0的性能,但是成本大幅度提升
通常用于数据库服务器
优化的基本原则
1、针对读操作,数据能从内存取就不要从硬盘
2、针对写操作,在内存中积攒一波再写入硬盘