目录
冯诺依曼体系结构
在了解操作系统前,我们要明白计算机的体系结构---冯诺依曼体系结构。
任何计算机都是由这四部分组成的: 输入设备(Input)、存储器(Storage)、处理器(Processor)、输出设备(Output)组成。并且体系结构规定:处理器只能和内存打交道。也就是说嗷,输入设备输入的数据要通过内存才能到达CPU进行处理,CPU处理完的数据只能通过内存到达输出设备进行输出。那么输入设备和输出设备使我们最常见的:
输入设备和输出设备
— 输入设备:从外界世界获取信息(物理形态)转换为计算机电子信息(二进制数据)
鼠标、键盘、麦克风、摄像头...
— 输出设备: 把电子信息(二进制数据)转换为外部世界的信息(物理形态)
屏幕、音响、振动器...
还有两个特殊的设备,他们既是输入设备又是输出设备:硬盘和网卡。
处理器
处理器主要是CPU,CPU又分为运算器和控制器。
上面的图可以描述CPU的工作机制为:硬盘或其他输入设备中的数据经过 内存 进行读取,读入内存中的数据 经过CPU进行处理。CPU分为运算器和控制器,运算器是负责“干活的”,而程序计数器存放着下一条要执行的指令,相当于控制器控制运算器该干什么活。当然这里没有深究缓存的作用,缓存用来临时性减少访问内存的次数,达到提升访问速度的作用。
存储器
存储器主要说的就是内存。要注意:寄存器实际是cpu真正意义上打交道的存储。所有数据必须先到寄存器,cpu才能读到;cpu处理的所有结果,必须先写入寄存器,进而才能写入内存。
进程和程序
我们一直在用idea写代码,关于代码如何通过编译器运行起来的,又如何从硬件的角度开始工作的。在了解这些之前,我们必须要明白程序和进程的区别。
程序是提前写好的一段操作指令,进程代表的是一次过程,体现的是其动态特性。
怎样理解呢?我们在写成一段程序,它的输入是一个问题,输出是一份源码,依赖的是idea这个工具;在编译阶段,输入的是我们所写的源码,输出的是字节码文件;当程序利用cpu运行起来的时候,输入的是字节码文件,输入的状态不定,也就是说由程序本身决定的,依赖idea或者程序也可以独立运行。在这其中,我们要明白:平时的 .java/.class 称为程序都可以,但一旦开始运行了,就不能称之为程序了而应该使用进程这个术语。
理解完程序和进程的区别,用一副图大概描述我们所写的程序如何在硬件的层面上跑起来的。
操作系统
1. 操作系统是什么?
操作系统(OS)是一个搞管理的软件。
那么 它既然是一个高管理的软件,为什么要用它搞管理呢? 像我学过的51单片机等等就没有操作系统可以正常运行,那么为什么需要操作系统进行管理呢?我觉得分为两个大方面的原因:
1. 现在的计算机运行场景非常多,硬件多,事情复杂。
2. 让每个用户直接去操作硬件显然是不可行的。
因此必须引入一套专门的软件进行管理,来管理提供给用户操纵计算机的一套系统,称之为操作系统(OS)。
2. 操作系统的管理机制
操作系统可以管理进程、内存、文件、网络、驱动。以进程管理为例:操作系统会把进程看做一个对象进行管理。管理的核心是先描述再组织。会有一个类,每个对象都是一个进程对象,再用数据结构(List、Map...)进行组织。
用一个伪代码进行描述:
class PCB {
pid; //唯一标识一个进程
名字、程序路径、代码、数据; //每个进程必然对应一个程序,描述程序信息
运行时间、cpu占有率、内存占用; // 统计信息
调度信息
}
3. 进程管理
1. 定义
操作系统系统通过不断切换进程,实现分配CPU资源到进程的管理。
2. 进程切换发生时机
发生的时机主要有5个:
1. 被高优先级进程抢占
2. 执行结束
3. 等待外部IO
4. 主动放弃
5. 时间片耗尽
时间片耗尽,其实是进程同时运行的假象。分配给每个进程适合的时间片,实现进程的切换,由于速度非常快,造成我们看起来是同时进行的。
3. 进程切换
进程切换做到的方式:保护老进程切上下文信息,恢复新进程切换上下文信息。CPU有个控制器,控制器有一个程序计数器(pc)存放运算器下一个要执行指令的内存地址。通过改变pc的值记录进程相关信息就可以实现进程的切换。
并发 vs 并行
并发(假同时):单CPU 单核 多进程
并行(真同时):多CPU 多核 多进程
用户态 vs 内核态
当CPU正在运行用户代码的时候就是用户态
当CPU正在运行操作系统代码的时候就是内核态
显然,内核态的代码权限更高。
操纵系统很比较复杂的,我只进行浅显的了解介绍,后续继续学习。