操作系统系统底层工作总体认识

1、计算机整体介绍

1.1、现代计算机的大致运行过程

计算机在运行时,先从内存中取到一条指令,通过控制器的译码,按照指令的要求进行逻辑处理及加工,然后再按地址将结果送到内存中,接着再取出第二条,再控制器的指挥下完成操作,依次往复,直到遇到停止指令。
按照程序的顺序逐步的取出指令去操作,自动完成指令中的具体逻辑处理,是计算机最基本的工作模型。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼计算机模型

1.2、计算机的五大核心组成部分

控制器:是整个计算机的神经枢纽,可以指挥各个操作指令之间的相互调配,协调计算机各组成部分之间配合运行,根据操作指令的信息进行解释等。
运算器:主要进行数据的逻辑处理,即算术运算和逻辑运算,对数据进行一个加工处理。
存储器:存储程序、数据以及各种信号,并在计算机其他部分需要使用时提供这些数据信息。
输入设备: 也叫外设,是将数据信息采集输入到计算机,比如鼠标、键盘、磁带机等等。
输出设备:将外设输入的数据在计算机进行处理之后显示出来,比如显示器,打印机,磁带等等。
主要工作流程:由输入设备将数据采集并输入到计算机,以一种电信号(也叫数字信号)的方式进行传输,发送的这种电信号具有一个高低压的形式,如果说低压是0的话,高压对应的就是1,传输的电信号只有这两种形态,所以,这也就是我们计算机为什么只能识别二进制的原因,将电信号输入到存储器中,经过控制器和运算器的处理,再返回到输出设备,通过输出设备显示出来供我们浏览,具体如下图所示:

在这里插入图片描述

上面这个图是一个抽象的模型概念,下面有一个现代计算机的具体应用图:
我们主要需要了解的是各个组件之间的通讯,不需要去了解的太深,将其中的各个总线我们统称为总线即可。

在这里插入图片描述

1.3、CPU指令结构

CPU的内部结构分为三大单元,详情如下:
控制单元:控制单元是CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和 操作控制器OC(Operation Controller)组成,一起协调计算机工作。它根据预先编写好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括:节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑
运算单元:CPU的运算核心,可执行各种逻辑判断、运算等等,根据控制器的指挥完成相应的操作,所以运算单元是执行部件。
存储单元:存储单元包括 CPU 片内缓存Cache和寄存器组,是CPU暂存数据的地方,里面放着等待处理或者已经处理的数据,CPU访问寄存器的时间要比访问内存的时间短,寄存器作为一个中间的介质,减少了CPU直接访问内存的次数,提高了CPU访问数据的效率,从而提高了 CPU的工作速度。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据;而通用寄存器用途广泛并可由程序员规定其用途。

1.4、CPU与核

一个主板可以装多个CPU,一个CPU可以有多个核,多核可以处理多线程。
核:核又分为物理核和逻辑核,逻辑核一般是物理核的两倍,也是为了处理多个线程而产生,下图是一个核数查看方法。

在这里插入图片描述

1.5、CPU缓存结构

1.5.1、什么是CPU缓存结构

由于CPU的读取速度远大于内存的读取速度,所以设计了依次缓存机制用于CPU与内存之间的数据交互,来提高CPU的执行效率,一般的CPU有三级缓存架构。

1.5.2、什么是三级缓存架构

从下图中我们就可以看出我的电脑CPU的三级缓存L1、L2、L3,三级缓存的空间大小是逐个递减的,但是读取速度确实逐个递增的,成一个类似于反比的状态

在这里插入图片描述

核又分为物理核和逻辑核,逻辑核一般是 L1和L2是每个CPU的某一个内核独享的,L3在一个CPU中多核共享,同时L1又分为两块,一块存指令,一块存数据。
缓存的组成:
缓存的最小存储单元----缓存行,一个缓存行大小通常为64byte。

1.5.3、为什么是三级缓存架构而不是两级缓存或者一级缓存

其实这个问题没有什么固定的答案,应该是现代的工艺还没有那么完美,就比如说L1是最接近于CPU寄存器的速度的,所以它在CPU芯片上绑定着,而CPU芯片就那么大,加上没那么精湛的技术,所以,L1缓存没办法做的太大。

1.5.4、CPU寄存器读数据的过程

CPU寄存器读数据是从内存到L3到L2到L1再到寄存器,这样的话不会耽搁CPU寄存器的太多时间,因为L1的读取速度已经和CPU寄存器差不多了。

1.5.5、时间局部性和空间局部性

时间局部性:CPU在运行一个变量时,接下来的时间中,有很大可能这个变量再次被访问到。
空间局部性:CPU在去内存里面读数据的时候,会将读取到的数据旁边一块区域的数据一起读到缓存中,举一个例子,就比如说有一个二维数组,设它的每个节点是8个byte,数组是8*8,需要我们遍历求和,如果按照行来加的话,根据空间局部性,CPU与内存交互一次可以加载8个节点,所以整个交互下来,CPU与内存IO进行8次,如果按照列来加,由于第一行第一个与第二行第一个不相邻,所以依次只能IO一个,要加完需要CPU与内存IO进行64次,很明显,哪个耗时短,效率高。

1.6、CPU运行安全等级

CPU有四个运行级别,分别为ring0、ring1、ring2、ring3,安全性从高到低,操作系统一般就运行在ring0级别,可以有很多的权限,比如刷盘什么的都可以做。
目前的Linux和Windows只用到了ring0和ring3级别,操作系统在ring0,操作系统以外的第三方程序运行在ring3,第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0,然后执行系统函数,说到这里相信同学们明白为什么JVM创建线程,线程阻塞唤醒是重型操作了,因为CPU要切换运行状态。

2、操作系统内存管理

2.1、内核空间与用户空间

目的:为了保护操作系统不受病毒的侵犯。
具体划分:以32位系统为例,32位操作系统的最大内存为4GB,在这4GB中,1GB分给内核空间专门来运行操作系统,3GB分给用户空间来运行我们一般的程序。

2.2、线程或进程的状态切换

一般一个线程或者进程是有两个堆栈的,一个堆栈放在内核空间,一个堆栈放在用户空间,为什么要有两个状态,因为他需要进行状态的切换,假设程序在运行时,突然需要创建一个线程,创建线程的这个工作就需要OS(操作系统)去完成,所以进程的状态就切换了,切换到内核空间中,并且将用户空间的堆栈信息放到内核空间对应的那个堆栈,然后创建完线程,这个线程有操作系统去管理,而进程又切换到用户空间,这个过程我们叫做状态的切换。

2.3、KLT和ULT

KLT:内核线程模型。
ULT:用户线程模型。
区别:线程的创建,运行,销毁在KLT上是由操作系统管理的,而ULT是由我们用户自己管理的,java在1.4之前(这块的版本不太能确定)用的是ULT,后来用的是KLT,ULT不能发挥CPU的多核性能。

3、线程和进程

3.1、什么是进程

启动一个程序就是一个进程,进程是OS(操作系统)资源分配的最小单位。

3.2、什么是线程

线程是OS(操作系统)调度CPU的最小单元,也叫轻量级进程(Light Weight Process),线程有自己独有的栈空间,在CPU上高速切换运行,所以这里就涉及到了线程的上下文切换。

3.3、什么是线程的上下文切换

简单来理解就是一个线程正在运行时,突然CPU要执行另一个线程,会把这个线程的状态保存下来,切换到另一个线程继续工作,这就是线程的上下文切换,数据保存在内存的TSS,(Task State Segment)任务状态段。

在这里插入图片描述

4、虚拟机指令集架构

虚拟机的指令集架构之主要分为两种:
栈指令集架构
寄存器指令集架构

4.1、栈指令集架构

java用的就是栈指令集架构

1、内部操作很麻烦,需要入栈出栈计算。
2、设计和实现更简单,适用于资源受限的系统;
3、避开了寄存器的分配难题:使用零地址指令方式分配;
4、指令流中的指令大部分是零地址指令,其执行过程依赖与操作栈,指令集更小,编译器容易实现;
5、不需要硬件支持,可移植性更好,更好实现跨平台。

4.2、寄存器指令集架构

1、做事粗暴直接,效率高,可直接赋值给CPU进行计算处理。
2、典型的应用是x86的二进制指令集:比如传统的PC以及Android的Davlik虚拟机。
3、指令集架构则完全依赖硬件,可移植性差。
4、性能优秀和执行更高效。
5、花费更少的指令去完成一项操作。
6、在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值