计算机组成原理
简单易学、开源免费、可移植、可拓展、可嵌入、面向对象,比java、c#等更彻底
谷歌、CIA、nasa、YouTube、Dropbox、Instagram、Facebook、redhat、豆瓣、知乎、春雨医生、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、土豆、新浪、果壳等都在使用Python
1. 初识计算机
1.1 什么是计算机
计算机俗称电脑,是现代化一种用于电子高速计算的电子计算机器,可以进行数值计算,又可以作逻辑计算(条件),还有逻辑记忆功能,能够按照程序运行,自动、高速处理海量数据嗯现代化智能电子设备。
- 程序自动化:可以将预先编译好的程序组纳入计算机内存,在程序的控制之下,计算机可以连续、自动地工作,不需要人为的干预
- 高速:当今计算机的运算速度已经达到每秒万亿次,普通电脑也能达到每秒亿次以上,使大量复杂的科学计算问题能够得以解决
1.2 计算机的发展历程
- 数手指
- 算盘
- 莱布尼茨发明 二进制设计思路,想法来自中国的八卦(阴阳 0/1)
- 提花纺织机
- 差分机 —— 巴贝奇、阿达(齿轮、蒸汽)
- 马克 1 号(世界上第一台大型计算机,1944年2月在哈佛大学正式运行,在巴贝奇基础上设计出来的)—— 艾肯
- 马克 1 号第三位程序员(格蕾丝.霍波调试程序时,发现有只飞蛾卡在触点中间,阻止了机器的运行,于是她诙谐地把程序故障统称为 臭虫(bug)
- 1946年2月14日,又美国军方定制的第一台 电子计算机 “电子数字积分计算机” 在宾夕法尼亚大学问世,表明电子计算机时代的到来
- 冯诺依曼要点:计算机采用二进制,计算机程序要按顺序进行
- 之所以用二进制,是为了底层方便(高低电平)设置
1.3 计算机的构成
由硬件和软件系统两大部分组成:
硬件(主机、外部设备):
- 运算器、控制器、存储器、输入设备、输出设备
- 运算器:是负责算术运算与逻辑运算,与控制器共同组成了中央处理器 (CPU)
- 控制器:负责发送和接收指令
- 存储器:用来存储最够的进行程序、将要进行程序的数据及刚处理完的数据
- 输入设备:用来进行输入的设备。如键盘、扫描仪等
- 输出设备:用来输出的设备。如显示器。音箱等
- 内存:基于电存储,停电丢失,速度快 —— 临时存储
- 硬盘:基于磁存储 —— 永久存储(没有内存存储速度快)
- 主机包含:中央处理器CPU、内存
- 中央处理器cpu
- 运算器
- 控制器
- 寄存器(缓存)
- 内存
- 只读存储器ROM
- 随机存储器RAM
软件(系统软件 —— 操作系统、程序设计语言、应用软件):
分为系统软件(基于硬件)、应用软件(基于系统软件)
硬件 —— 系统软件 —— 应用软件 —— 用户
软件的本身是一堆数据,运行软件时,加载到内存,CPU到内存读取数据,通过运算再显示出来
2. 数据
计算机采用二进制的主要原因:
- 技术实现简单:计算机由逻辑电路组成,只有两个状态,开关的接通和断开,正好对应 1 和 0
- 简化运算规则
- 适合逻辑运算
- 易于进行转换:二进制与十进制之间易于转换
- 抗干扰能力强,可靠性高等
2.1 进制转换
十进制转二进制
- 除2取余法(倒着取)
- 将十进制转换为任意 n 进制,除 n 取余法
二进制转十进制
(1101)2 = 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1*2^0 = 13
八进制
由于二进制数据的基 R 较小,书写和阅读不方便,因此在小型机上引入了八进制。八进制的基 R = 8 = 2 ^3,有数码 0 、1 、2 、3 、4 、 5、 6 、7,并且每个数码正好对应三位二进制数,所以能够很好地反应二进制。用下标 8 或后面跟 0 表示。
二进制数据(11 101 010 . 010 110 100)2 对应 八进制数据(3 5 2 . 2 6 4) 或 352.2640
八进制转十进制
(13)8 = 1*8^1 + 3*8^0 = 11
十六进制
由于二进制在使用中位数太长,不容易记忆,所以就提出了十六进制数(如 4AC8)16,它有两个特点:
- 由十六个字符 0 ~ 9 以及 A B C D E F 组成(分别表示 10 ~ 15)
- 逢十六进一,即基 R = 16 = 2 ^4
- 通常在尾部标志 H 或下标 16 来区别
十六进制转十进制:
(4AC8)16 = 4*16^3 + 10*16^2 + 12*16^1 + 8*16^0
十六进制转二进制:
只要将每一位十六进制数用对应的 4 位 二进制数替代即可 —— 简称 四位一分
4 A F 8 B = 0100 1010 1111 1000 1011 = (1001010111110001011)2
二进制转十六进制:
分别向左,向右每四位一组,依次写出每组 4 位二进制所对应的十六进制数 —— 简称 四位合一位
(0001 1101 0110)2 = (1 D 6)16 只需将每四位转换成十进制即可,最后一位不足时用 0 补齐
二进制转八进制
将二进制数分为三个一组,每组转为十进制 —— 三位二进制
(0 101 011)2 = (0 5 3)8
2.2 二进制四则运算
逢二进一
2.3 机器数与真值
2.3.1 机器数
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数带符号,用一个数的最高存放符号,正数为 0,负数为 1
如,十进制数 +3 ,计算机字长为 8 位,转换为二进制是(0000 0011),如果是 -3 ,那么就是(1000 0011)
2.3.2 真值
机器数不等于真正的数值,去掉最高位的符号位,余下的七位即为机器数的真值
2.4 原码、反码、补码
都是有符号的二进制表示数的方法,均有符号位和数值位构成
2.4.1 原码
符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,如八位二进制:
[+1] 的原码为 0 000 0001[-1] 的原码为 1 000 0001
取值范围为 (1111 1111,0111 1111),即 [-127, 127]
2.4.2 反码
- 正数的反码是其本身
- 负数的反码是其原码的基础上,符号位不变,其余各个位取反
[+1] = [0000 0001]原 = [0000 0001] 反[-1] = [1000 0001]原 = [1111 1110] 反
2.4.3 补码
- 正数的补码是其本身
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后 + 1(即在反码的基础上 +1)
[+1] = [0000 0001]原 = [0000 0001] 反 = [0000 0001] 补[-1] = [1000 0001]原 = [1111 1110] 反 = [1111 1111] 补
说到底是补码之间的运算,如 1 + (-1),逢二进一,到机器只认识八位,第九位不认识,即为 0
[0000 0001] + [1111 1111] = 0
总结: 在计算机系统中,数值一律用补码来表示(存储),主要使用补码,可以将符号位和其他位统一处理,可以将其他数值运算简化为 加法运算。
3. 物理层和数据链路层
3.1 网络基础之网络协议篇
每台计算机需要互相通讯需要用到网络协议,互联网本质是一系列网络协议
3.1.1 osi 七层协议(网络标准)
互联网协议按照功能不同分为 osi 七层或 tcp/ip 五层 或 tcp/ip 四层
每层运行常见设备:
3.1.2 物理层
计算机之间需要用(光缆、电缆、双绞线、无线电波等连接,完成组网,才能通讯
物理层功能:主要是基于电器特性发送高低电压(电信号),高电压对应 1,低电压对应 0
3.1.3 数据链路层
单纯的电信号 0 和 1 没有任何意义,必须规定电信号多少位一组,每组什么意思
数据链路层功能:定义; 电信号的分组方式
以太网协议
早期时各个公司都有自己的分组方式,后来形成了统一的标准,即以太网协议(ethernet)
规定:
一组点消耗构成一个数据包,叫做 帧
每一数据帧分成:报头 head 和数据 data 两部分
head包含(固定 18 个字节)
- 发送者/源地址,6个字节
- 接受者/目标地址,6个字节
- 数据类型,6个字节
data包含(最短46个字节,最长1500字节)
- 数据包的具体内容
head 长度 + data 长度 = 最短 64字节,最长1518字节,超过最大限制就分片发送
mac地址
head 中包含的源和目标地址由来,ethernet 规定介入 Internet 的设备都必须具备网卡,发送端和接收端的地址便是 mac地址,以便能找到发送和接收者。
mac 地址:每块网卡出厂时都有一个唯一的 mac地址,长度为 48 位 2进制,通常由 12 位 16 进制数表示(前六位是厂商编号,后六位是流水线号)
查看mac地址:本地连接 —— 详细信息 —— 物理地址
广播:
有了 mac 地址,同一网络内(同一局域网)的两台主机就可以互相通讯了(一台主机通过 arp 协议获取另一台主机的mac地址),ethernet 采用最原始的方式,广播的方式进行通讯,即计算机基本靠吼
3.1.4 网络层
有了 以太网协议、mac 地址、广播的发送方式,理论上世界上的计算机都可以互相通讯了。但是世界上的互联网是由一个个的局域网构成的,如果所有的通讯都是以以太网的广播方式传播,那么一台机器发送,全世界的机器都会收到,这将是一种灾难。
于是就有了网络层,定义了一种协议 —— ip 协议
ip 协议
- 规定网络地址的协议叫 ip 协议,定义的地址为 ip 地址, 广泛地采用 v4版本即 ipv4,它规定网络地址由 32 位 2进制表示
- 范围 0.0.0.0 -- 255.255.255.255
- 一个 ip 地址通常写成四段十进制数,例如:172.16.10.1
总结:各个局域网间要想要想通讯需要用到 ip 协议(即跨网络传输),首先将包发送给默认网关,再由网关转发给 ip 地址所在局域网
mac 地址相当于一个人教师所在位置,独一无二,ip 地址相当于教室,,默认网关为这个教室的负责人
arp 协议
通信是基于 mac 的广播方式实现,计算机在发包时,获取自身的mac 是容易的,如何获取目标主机的 mac 地址,就需要通过 arp 协议
arp 协议功能:广播的方式发送数据包,获取目标主机的 mac 地址
协议工作方式:每台主机 ip 都是已知的
例如:主机 172.16.10.10/24 访问 172.16.10.11/24
01. 首先通过 ip 地址和子网掩码区分出自己所处的子网
场景 | 数据包地址 |
---|---|
同一子网 | 目标主机mac,目标主机 ip |
不同子网 | 网关 mac,目标主机 ip |
02. 分析172.16.10.10/24 与 172.16.10.11/24 处于同一网络(如果不是,那么下表中目标 ip 为 172.16.10.1 ,通过 arp 协议获取网关的mac,由网关去获取目标的 mac
源 mac | 目标 mac | 源 ip | 目标 ip | 数据部分 | |
---|---|---|---|---|---|
发送端主机 | 发送端 mac | FF:FF:FF:FF:FF:FF | 172.16.10.10/24 | 172.16.10.11/24 | 数据 |
03. 这个包含以广播的方式在发送端所处的自网内传输,所有主机接收后拆开包,发现目标 ip 为自己的,就响应,返回自己 mac
同一局域网内,pc 1 与 pc 2 怎么通讯
- 计算是否在同一局域网内(连接同一交换机在同一局域网内,即 ip 网段前面一样就在同一局域网内)
- 利用 arp 协议获取 pc 2 的 mac 地址
pc1 mac FF:FF:FF:FF:FF:FF 192.168.11.10/24 192.168.11.11/24
首先以上述格式发包,通过交换机广播,所有 pc 拆包,然后根据 ip 来区分是否是自己的包,当符合时,回包:
pc2 mac pc1 mac 192.168.11.11/24 192.168.11.10/24
这样,pc 1 就获得了 pc 2的 mac 地址
- 发包(pc 1 --> pc 2)
pc1 mac pc2 mac 192.168.11.10/24 192.168.11.11/24 数据
不在同一局域网内,pc1 与 pc4 通讯
- 计算,是否在同一局域网内
- 利用 arp 协议获取 网关 1 的mac,再由网关去联络网关2,最后获得 pc4 的mac
# 获取 网关 1 macpc1 mac FF:FF:FF:FF:FF:FF 192.168.11.10/24 192.168.11.1/24(网关)
再将数据发给网关 1,由网关1 转发给网关 2
# 将数据发给网关1,这里的目标 ip 是 pc4,而不是网关1pc1 mac 网关1 mac 192.168.11.10/24 172.16.45.10/24 数据
- pc4 --> pc1(回包),也是先判断是否在同一局域网,再按照上述的方式回
注意:网关之间是通过路由传输
3.1.5 传输层
网络层的 ip 区分子网,以太网的 mac 找到目标 主机,但是实际使用的是 应用程序,那么要实现应用程序之间的通讯,是通过 端口来标识应用程序的,即应用程序与网卡光联的编号。
传输层的功能:简历端口到端口的通信
补充:端口范围:0 - 65535 , 0 -1023 为系统占用端口
tcp协议:
可靠传输,TCP数据包没有长度限制,理论上可以无限长,但是为了保证网络的效率,通常TCP数据包的长度不会超过IP数据包的长度,以确保单个TCP数据包不必再分割。
以太网头 | ip 头 | tcp头 | 数据 |
---|---|---|---|
udp协议:
不可靠传输,”报头”部分一共只有8个字节,总长度不超过65,535字节,正好放进一个IP数据包。
以太网头 | ip头 | udp头 | 数据 |
---|---|---|---|
3.1.6 应用层
用户使用的应用程序,工作于应用层
应用层功能:规定应用程序的数据格式
例:TCP协议可以为各种各样的程序传递数据,比如Email、WWW、FTP等等。那么,必须有不同协议规定电子邮件、网页、FTP数据的格式,这些应用程序协议就构成了”应用层”。
3.1.7 socket
两个进程需要进行通讯,最基本的一个前提是能够唯一的标识一个进程,在本地进程中我们可以使用 PID 来唯一标识一个进程,但 PID 只在本地唯一,网络中的两个进程 PID 冲突的几率很大。这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程 。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
3.2 总结
- 物理层:形成一堆电信号
- 数据链路层:将电信号分组(以太网协议 ethernet)
- 规定每台计算机都必须有一个网卡,上面有 mac 地址(唯一标识)
- 同一局域网以广播形式传播,不同局域网通过 网关
- 网络层:ip 协议、arp 协议
- ip 协议可以区分是否在同一局域网
- arp 协议可以获取目标计算机 mac 地址
- 传输层:TCP、UDP协议,应用软件之间通过端口传输,不同计算机的同一端口不冲突
- 应用层:规定应用程序的数据格式,在不同层上有不同的格式
- socket 抽象层:在 tcp、udp 协议之上,用户编写出一个应用软件时,需要定义其端口号,而单纯的使用 tcp、udp 协议去设定端口号费时费力,socket 大大节省了时间,只需简单的设置即可
4. 系统软件和应用软件运行流程
计算机启动,首先启动的是 BIOS,BIOS能告诉你操作系统在哪个存储介质上(硬盘、U盘、光盘等),BIOS是物理层面的,即其代码已经写在主板上。
系统软件的运行流程:安装在硬盘,加载到内存,CPU从内存读取再运算;硬盘、内存、CPU有速度差,最快为 CPU
应用软件运行流程:安装在硬盘,鼠标是系统提供的,双击(发出指令给操作系统),高速它将这个软件加载到内存中,然后CPU读取
打开一个编辑软件,它是在内存中运行,只有保存后才会永久保存到硬盘中,否则断电丢失(如word编辑)
5. 字符编码
字符与二进制一一对应的关系即 —— 字符编码
计算机最终识别的是二进制,要想能够使人们更直观地看到结果,而不是一堆二进制数字,就需要制定一个 字符与二进制一一对应关系的字典出来,最早的字符编码由美国人制定 —— ASCII 码表。
但是 ASCII 码表只有英文字母,显然是不符合其他语言的,因此其他编码应运而生,如中国的 gb2312
编码,日本的 shift_JIT
编码等
# (0000 0001)2 ,1 bit 表示八位二进制中的一位, 1Byte表示八位bit 二进制位 1Byte字节 = 8bit1KB = 1024B1MB = 1024KB1GB = 1024MB
# ASCII(8位二进制) 中一个字符占用一个字节,即八个二进制位,总共有(2^8 -1 = 255)种情况,完全能够包括所有英文字符h --> 0000 0001# 而汉字却有几千个,一个汉字字符占用一个字节,显然是不行的,gb2312编码 规定了一个汉字占用两个字符,生僻字用4个字节总共有(2^17 -1 = 131071)种情况 你 --> 00000001 00000001
然而各国都有一个编码,别的国家在解析文字时会出现乱码,所以需要一个国际通用的编码,于是 Unicode 应运而生。
ASCII 用1个字节(8位二进制)代表一个字符
Unicode 常用2个字节(16位2进制)代表一个字符,生僻字用4个字节
所以 Unicode兼容 ASCII ,兼容万国,为世界标准
但是在编写英文时,使用 Unicode编码,就会比使用 ASCII 耗费多一倍的时间,在存储和传输时很低效
于是 可变长编码 UFT-8(Unicode Transformation Format)应运而生,它可以把一个 Unicode 字符根据不同的数字大小编码成 1 -6 个字节,常用的英文字母被编码成 1 个字节,汉字是 3个,生僻字编成 4 -6 个字节,可以有效利用空间。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
内存中的编码固定使用 Unicode:
- 在存入磁盘时,需要将 Unicode 转换为 utf-8,将数据量控制最精简
- 在读入内存时,需要将 utf-8 转换为 Unicode
- 内存使用 Unicode 是为了兼容万国软件
6. 网络分类
网络可以大致分为四类:
- 局域网(LAN):一般限定在较小的区域内,小于 10km 范围,通常采用 有线方式连接
- 城域网(MAN):规模局限在一座城市的范围,10 ~ 100km的取余
- 广域网(WAN):网络跨越国界、洲界,甚至全球范围
局域网和广域网是网络的热点,局域网是组成其他两种类型网络的基础,城域网一般都加入了广域网
广域网的典型代表是 Internet 网
个人网:个人局域网就是在个人工作的地方把属于个人使用的电子设备(如便携电脑等)用无线技术连接起来的网络,因此也常被称为个人局域网 WPAN ,范围大约为 10m左右。
传输介质
- 有线网(双绞线)
- 光纤网:也是有线网的一种,靠光传输,一头亮一头不亮
- 无线网
7. 网络基础和 DOS 命令
7.1 公有 IP地址分类
Inter NIC 机构分配给注册组织机构的 IP 地址
7.2 私有 IP 地址分类
私有地址(Private address)属于非注册地址,专门为组织机构内部使用
- A 类:10.0.0.0 -- 10.255.255.255
- B 类:172.16.0.0 -- 172.31.255.255
- C 类:192.168.0.0 -- 192.168.255.255
7.3 DOS 命令
cmd 运行以下命令
ipconfig # 查看 ip 配置ipconfig /? # 查看帮助ping 192.168.1.224ping /? # 查看帮助
其他doc命令
# cd --> change directory cd C:\ # 切换到根目录cd a # 切换到某个文件夹D: # 切换到其他盘符dir # 查看当前目录下文件和文件夹. # 当前目录(cd .).. # 上一级目录(cd ..)del a.txt # 删除文件rd a # 删除空目录md a # 创建文件夹
参考博客
- 网络基础之网络协议篇
- Python基础之字符编码