计算机如何工作
1 .计算机发展历史
2.冯诺依曼体系
- CPU 中央处理器: 进行算数运算和逻辑判断
- 存储器:分为外存和内存,用于存储数据(使用二进制方式存储)
- 输入设备:用户给计算机发号施令的设备
- 输出设备:计算机给用户汇报结果的设备
输入设备: 鼠标 键盘
存储器: 内存
输出设备: 屏幕
对于硬盘来说,可以输入设备,也可以是输出设备
针对存储空间
硬盘 >> 内存 >> CPU
针对数据访问速度
CPU >> 内存 >> 硬盘
3.计算机的祖师爷
引用自 百度百科
约翰·冯·诺依曼(John von Neumann,1903年12月28日-1957年2月8日),美籍匈牙利数学家、计算机科学家、物理学家,是20世纪最重要的数学家之一。
冯·诺依曼是罗兰大学数学博士,是现代计算机、博弈论、核武器和生化武器等领域内的科学全才之一,被后人称为“现代计算机之父”、“博弈论之父”。
冯·诺依曼先后执教于柏林大学和汉堡大学,1930年前往美国,后入美国籍。 历任普林斯顿大学教授、普林斯顿高等研究院教授,入选美国原子能委员会会员、美国国家科学院院士。
早期以算子理论、共振论、量子理论、集合论等方面的研究闻名,开创了冯·诺依曼代数。 冯·诺依曼第二次世界大战期间曾参与曼哈顿计划,为第一颗原子弹的研制作出了贡献。
冯·诺依曼1944年与奥斯卡·摩根斯特恩合著《博弈论与经济行为》,是博弈论学科的奠基性著作。
晚年,冯·诺依曼转向研究自动机理论,著有对人脑和计算机系统进行精确分析的著作《计算机与人脑》(1958年),为研制电子数字计算机提供了基础性的方案。 其余主要著作有《量子力学的数学基础》(1926)、《经典力学的算子方法》、《连续几何》(1960)等。
3.CPU基本工作流程
3.1 逻辑门
电子开关 – 机械继电器
输入 输出
TRUE TRUE
FALSE FALSE
3.2 门电路
3.2.1 非门
输入 输出
TRUE FALSE
FALSE TRUE
3.2.2 与门
输入1 输入2 输出
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
3.2.3 异或门
输入1 输入2 输出
TRUE TRUE FALSE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
3.2.3 算术逻辑单 ALU
ALU:计算机中进行算数,逻辑运算的核心部件,是计算机的数学大脑
计算机里边的加法运算基于逻辑操作实现
4.外存 VS 内存
数据库中: 外存更便宜,容量更大 ,可持久化(断电还保存)
CPU 里边: 也有一个寄存器来保存数据 ,他的执行速度比内存又要快好几个数量级(要执行的指令: 包括CPU认识的代码指令和数据)
5.控制单元CU
解 CU 可以驱动 ALU 进行具体的计算工作
总体的看,就是执行进程(运行的程序),是执行程序中的机器码
像Java这种语言,是把Java文件编译为class字节码,在使用 java.exe 类名 来运行【Java进程就是这里的java.exe,也就是我们的Java虚拟机】jvm 会把字节码翻译成cpu能认识的机器码
程序:静态的可执行文件
CPU:
1.逻辑操作指令
2.运算指令
3.控制指令--------if根据逻辑运算的结果,执行某个代码,循环语句也 是类似
-
CPU 中的 PC 寄存器,是决定 CPU 要执行哪条指令的关键;
-
指令是由 动作 + 操作对象组成
-
CPU 眼中只有指令,没有其他的概念
6.编程语言
6.1程序
程序 = 指令 + 指令要处理的数据。
java文件运行
编译-------> jvm 翻译为机器码------> cpu执行指令(机器码)
把 Java 这个程序(jvm)加载到内存中,cpu执行jvm的指令
jvm找到类名 .class 文件,加载到内存中(类加载),运行 main 方法
运行 main 方法:运行到这行字节码,由jvm翻译为机器码
注意:高级语言的一条语句(Statement)往往对应很多条指令(Instruction)才能完成。
7. 操作系统
专门搞管理的软件
7.1 管理:
1.管理下层的硬件设备
2.管理下层任务进程(可以在任务管理器中)
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等
进程是系统分配资源的基本单位(最小的单位)
进程启动,需要先创建一个 pcb (进程控制块 Process Control Block)
Process:进程又叫task(任务)
操作系统管理进程:就是在一个数据结构中,存储每个进程的pcb,通过pcb来管理进程 CRUD
创建:数据结构中,新建一个pcb
任务管理器: 遍历 查看
7.2 PCB
1.pid:操作系统为每个进程分配的一个身份标识,一个系统中的pid是唯一的
2.内存指针:用于标识进程占用的内存中的位置
3.资源清单
(1)设备资源:如打印机键盘等…
(2) 文件资源:通过一个文件描述表,里边记录了可以使用的文件列表(类似数组的结构)
文件描述表:里边存储了文件描述的信息,所在的索引也叫文件描述符
每个程序运行,都会默认打开三个文件描述符,对应 Java中 System.out (标准输出) System.in (标准输入) System.err(错误输出)
7.3 调度信息:
-
1.一个电脑中,CPU目前都是多核的(把多个cpu通过技术手段打包为一个cpu,就是多核cpu)
-
2.我们的系统中,运行的进程数量,远远超过了cpu的核心数,原因就是有 操作系统调度进程,在cpu上执行指令
-
3.优先级
-
4.其他一些调度信息:如进程已经执行/等待了多久,执行那些代码
-
5.进程上下文 :进程再时间片轮转调度的时候,切换出去时的环境(运行的指令行需要的变量等等)为上文,回复执行时的环境为下文。这些信息都需要再切换出去时候保存上文,恢复时,读取之前保存到信息到下文
类似玩游戏,写档(保存)和 读档(恢复)
7.4 调度算法
1.先来先服务:根据时间先后顺序进行执行
2.高优先级优先:优先级高的进程优先执行(优先级:pcb中,包含进程优先级的信息 这里所指的优先级是 总的优先级 ,可以是进程优先级信息+进程的等待时间)
3.短作业优先: 某个作业(一组任务)执行的剩余时间越短,就优先执行。存在缺陷:某些耗时长的任务,就可能没机会执行(也叫做饥饿)
4.抢占式:某个高优先级的进程加入,就可能暂停优先级低的任务,先执行优先级高的
5.非抢占式:某个进程,必须执行完毕,由进程告诉操作系统,我执行完了,可以调度后续的进程。更多的用于一些实时性高的系统
也可能出现进程饥饿的现象,这种一半用于批处理系统中(不关注某个任务是否先执行 只关注总的执行效率)
6.时间片轮转调度算法:采取这个算法,我们看起来,整个电脑中,远远超出了cpu核心数的进程,还是同时在执行
操作系统中,使用了一个就绪队列的数据结构:其中就是要存放要运行的进程
每次要使用头节点的进程,来运行一段时间,再放回队尾
一段时间:该进程这次运行的时间片,这个时间片的大小,是由操作系统计算出来
7.5 进程执行表现的特性
并发:一个cpu以时间片轮转调度的方式依次执行多个进程(人肉眼感知是”同时“执行)
并行:多个cpu在一个时间点上,是同时执行多个进程
多个程序的代码执行,即存在并发,也存在并行
表现特征:单个程序代码的执行顺序,还是顺序的;多个程序的代码之间,就可能是无序的
8. 虚拟地址空间(虚拟内存)
为什么需要虚拟内存?/ 虚拟内存有什么作用?
1..进程内存独立性:隔离进程间使用的内存,虚拟内存之间。进程不使用公用的物理内存,否则进程1修改某个变量, 就会引发进程2整个程序挂掉
扩展内存容量:某个进程如进入阻塞/时间片轮转切换出去,由一些从硬盘中读取到内存的数据,所有进程占用的总的内存大小就可能超过物理内存;采取的方案,就是使用虚拟内存映射到硬盘(使用硬盘容量来作为虚拟内存的一个扩展)
某个进程,在虚拟内存中,占用的空间,是类似一个书籍一样,一页一页的
当某一页映射到物理内存,但是发现没有对应的数据,就会产生一个错误,”缺页式中断“,就会从外设中查找
9. 进程间通信
由于虚拟内存,隔离了进程使用的内存,需要共享数据,就需要采取通信的方式
通信方式:
-
管道
-
共享内存
-
文件
-
网络(socket)
-
信号量
-
信号