何为操作系统:
冯诺依曼体系结构 : 描述了一台计算机是如何构成的. (99%的计算机都是冯诺依曼结构) => 硬件的特点会对软件开发造成直接影响
冯诺西曼体系结构是由冯诺依曼提出的,他也被称为计算机领域的祖师爷(计算机之父),他本来是个数学家,也是个物理学家,也是个化学家,还参与过曼哈顿计划.
冯诺依曼在火车上遇到了一个普林斯顿大学的研究员,当时这个研究员正在研究用来计算弹道导弹轨迹的机器,可是遇到了难题,于是冯诺依曼说可以让他去看看,他就去了,就为冯诺依曼体系奠定了基础
图灵 奠定了计算机工作原理的理论基础
1. 冯诺依曼体系结构描述了一台计算机应该是包括这几部分:
- CPU中央处理器(计算机的大脑),进行算术运算和逻辑判断
过去几十年,CPU的发展速度是非常迅猛的,这也验证了"摩尔定律":18个月,芯片集成程度提高一倍,成本降低一半(指数提升)
这个摩尔是Intel的副总裁,联合创始人之一)
但是最近几年摩尔定律失效,因为CPU集成程度更高,就需要让单个元件尽量小,现在最强的是7nm级别,这样的空间尺度上,经典物理学已经接近失效,主要靠量子力学,在解决这个问题的办法是人海战术,一个CPU不能更快了就多搞几个CPU,多核CPU
GPU是一种特殊的CPU,专门针对一些特定的场景进行优化运算(矩阵运算)
- 存储器 一般分成两类
- 内存
写的代码主要都是在内存中,new出来的对象就是在内存上申请空间 - 外存(磁盘)
内存和外存的对比:- 内存的存储空间较小,外存的存储空间较小
- 内存的访问速度较快(ns级别 纳秒 ),外存的访问速度较慢(us 微秒),大概查了三四个数量级
- 内存的成本较高,外存的成本较低
- 内存如果断点了,数据就丢失了,而外存如果断电了,数据不丢失 (外存支持持久化)
- 内存
- 输入设备
键盘/鼠标/摄像头/麦克风… 和内存打交道 - 输出设备
显示器/打印机/音响…
有些设备算输入设备也是输出设备 (触摸屏)
2. 操作系统
操作系统内核是一个软件. 搞管理的软件.一方面是管理计算机的硬件设备. 另一方面管理计算机的软件资源
一个完整的操作系统 = 内核 + 配套的应用程序
- 在屏幕中输出"HelloWorld"
代码真正执行起来的时候,println会进入到依赖库的代码中
本质上需要操作显示器这个硬件设备来完成
println就会通过响应的系统调用进入到内核中来执行代码
这个内核中的代码再执行"让显示器输出"这样的动作
内核调用显卡驱动程序,由驱动程序由驱动程序来具体操作显示器
每一个硬件都有对应的驱动程序
那么操作系统具体如何管理的呢?
管理的核心工作是两件事:
- 描述 相当于知道有什么
- 组织 然后要做什么
3. 进程(Process)
进程是一种操作系统中非常重要的软件资源.
把一个可执行程序跑起来.系统中就会创建一个对应的进程.
如果这个程序执行结束了,系统就会随之销毁对应的进程.
进程就可以看成是一个程序的执行"活动"
系统进行资源分配和调度的基本单位
区分程序(可执行文件)和进程
.exe就是可执行文件 就是一个磁盘上的文件,静态的,如果不使用,就不会发生变化
任务管理器中的QQ,就是一个进程,当双击exe文件时,操作系统就会加载这个可执行文件,把exe文件中的很多内容都加载到内存中了,分配一些资源,并开始执行这个可执行程序包含的指令. (分配资源并执行的过程就是进程)
进程也可以认为是操作系统进行资源分配的最小单位.
PID 就是进程id 也就是进程的身份标识符
先双击QQ,得到一个进程id p1
关闭QQ,再次打开,又得到一个进程id p2
进程管理(重点,难点)
以Linux为例
描述:内核中使用一个task_struct / PCB (进程控制块) 结构体来描述进程 (C语言)
每创建一个进程,就同时创建一个PCB这样的类的实例.
组织:使用双向链表把所有的PCB对象串到一起
管理的核心工作是两件事:
- 描述 相当于知道有什么
- 组织 然后要做什么
双击一个exe,创建一个进程的时候,本质上就是在内核中,先创建了一个PCB对象然后把这个对象加入到链表中
关闭一个程序,结束一个进程的时候,本质上就是在内核中找到这个对应的PCB对象,然后从链表上删掉,并且释放掉该对象
通过任务管理器查看到的所有的进程信息,本质上就是在遍历内核中的这个链表,一次读取对应PCB中的节点信息
PCB里面包含哪些信息呢?
-
pid(进程id) 进程的身份标识.
-
一组内存指针,指向该进程持有的一些重要数据在内存中(系统给该进程分配的资源的一部分)的位置.
重要数据:
- 执行的指令都有啥
- 这些指令依赖的数据是啥
-
状态
相当于一张日程表,为了区分当前的进程是正在执行还是等待执行一个进程的状态有这些状态:
R:就绪状态.正在CPU上执行,或者即将执行
S:睡眠状态,这些进程没法再CPU上执行,而是在等待.
D:深度睡眠状态.进程在长时间的忙于IO操作,没精力理会CPU
X:退出状态.进程已经被销毁了 -
优先级
根据系统的情况,分优先级执行进程 -
进程的记账信息
记录做了什么,不要让某个进程一直霸占CPU,差不多就行了 -
进程的上下文
进程上下文实际上是进程执行活动全过程的静态描述,提前规划好做什么
3-6 是为了实现"进程调度",如果资源非常充裕,那么不需要调度,事实是资源不那么充足
进程多,但是资源少,最紧张的资源是CPU(同一时刻,一个CPU上只能执行一个程序的指令)
例如:
我的电脑8核,但是当前进程数已经上百了
如何让这么多进程在8个CPU上很好地工作?
这就靠"进程调度"来完成
目的就是为了让这么多进程能够很好地在有限的CPU上很好地运行
操作系统中实现进程调度的模块叫做"调度器",实现具体调度的时候有很多策略
这些策略都要依赖PCB中对应的属性
"并发式"执行
由于CPU执行指令极快,我们可让CPU先执行进程1的指令,工作一小会儿之后执行进程2的指令,然后…然后再执行进程1的指令
从宏观上来看,我们可以边看视频,边聊QQ,还能边放歌,看起来是同时发生的
但其实从微观上来看,这些进程的指令是串行执行的,只不过是CPU切换速度极快,在宏观上感知不到
这样的过程就叫做并发↑
“并行”
宏观上是同时执行,微观上也是同时执行(两个CPU就可以同时执行两个进程的指令)
补充
时间片:只进行某进程的时间
抢占式调度:操作系统的调度器会非常频繁的进行行程切换,哪怕那个进程只进行了一半,也是随时可能被打断的.
内核态:代码在内核态上执行,例如一些操作硬件的代码 (为了安全性)
用户态:
内核态的权限比用户态的权限高很多.