文章目录

  • 冯诺依曼计算机模型
  • CPU内部结构
    • 控制单元
    • 运算单元
    • 存储单元
  • CPU缓存结构
    • CPU读取存储器数据过程
    • CPU为何要有高速缓存
    • 带有高速缓存的CPU执行计算的流程
    • CPU运行安全等级
  • 操作系统内存管理
    • 内核线程模型 (KLT)
    • 用户线程模型 (ULT)


冯诺依曼计算机模型

计算机五大核心组成部分

控制器、运算器、存储器、输入、输出

  1. 控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。
  2. 运算器(Datapath):运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。
  3. 存储器(Memory):存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息。
  4. 输入(Input system):输入设备是计算机的重要组成部分,输入设备与输出设备合你为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。常见的输入设备有键盘、鼠标器、光电输入机、磁带机、磁盘机、光盘机等。
  5. 输出(Output system):输出设备与输入设备同样是计算机的重要组成部分,它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来。微机常用的输出设备有显示终端CRT、打印机、激光印字机、绘图仪及磁带、光盘机等。

上图中最核心部分: CPU和内存


CPU内部结构

  • 控制单元
  • 运算单元
  • 数据单元

控制单元

控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和 操作控制器OC(Operation Controller) 等组成,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器IR中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC,按确定的时序,向相应的部件发出微操作控制信号。操作控制器OC中主要包括:节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。


运算单元

运算单元是运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。


存储单元

存储单元包括 CPU 片内缓存Cache和寄存器组,是 CPU 中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU 访问寄存器所用的时间要比访问内存的时间短。 寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。采用寄存器,可以减少 CPU 访问内存的次数,从而提高了 CPU 的工作速度。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据;而通用寄存器用途广泛并可由程序员规定其用途。


CPU缓存结构

现代CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构,常见的为三级缓存结构

  • L1 Cache,分为数据缓存和指令缓存,逻辑核独占
  • L2 Cache,物理核独占,逻辑核共享
  • L3 Cache,所有物理核共享

  • 存储器存储空间大小:内存>L3>L2>L1>寄存器
  • 存储器速度快慢排序:寄存器>L1>L2>L3>内存

缓存是由最小的存储区块-缓存行(cacheline)组成,缓存行大小通常为64byte。

举个例子 : 假设你的L1缓存大小是512kb,而cacheline = 64byte,那么就是L1里有512 * 1024/64个cacheline


CPU读取存储器数据过程

1、CPU要取寄存器X的值,只需要一步:直接读取。
2、CPU要取L1 cache的某个值,需要1-3步(或者更多):把cache行锁住,把某个数据拿来,解锁,如果没锁住就慢了。
3、CPU要取L2 cache的某个值,先要到L1 cache里取,L1当中不存在,在L2里,L2开始加锁,加锁以后,把L2里的数据复制到L1,再执行读L1的过程,上面的3步,再解锁。
4、CPU取L3 cache的也是一样,只不过先由L3复制到L2,从L2复制到L1,从L1到CPU。
5、CPU取内存则最复杂:通知内存控制器占用总线带宽,通知内存加锁,发起内存读请求,等待回应,回应数据保存到L3(如果没有就到L2),再从L3/2到L1,再从L1到CPU,之后解除总线锁定


CPU为何要有高速缓存

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。

在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。

  • 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。 比如循环、递归、方法的反复调用等。
  • 空间局部性(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。 比如顺序执行的代码、连续创建的两个对象、数组等。

带有高速缓存的CPU执行计算的流程

  1. 程序以及数据被加载到主内存
  2. 指令和数据被加载到CPU的高速缓存
  3. CPU执行指令,把结果写到高速缓存
  4. 高速缓存中的数据写回主内存

CPU运行安全等级

CPU有4个运行级别,分别为:

  • ring0
  • ring1
  • ring2
  • ring3

Linux与Windows只用到了2个级别:ring0、ring3,操作系统内部内部程序指令通常运行在ring0级别,操作系统以外的第三方程序运行在ring3级别,第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0,然后执行系统函数,所以说JVM创建线程,线程阻塞唤醒是重型操作了,因为CPU要切换运行状态。

JVM创建线程CPU的大致工作过程

  1. CPU从ring3切换ring0创建线程
  2. 创建完毕,CPU从ring0切换回ring3
  3. 线程执行JVM程序
  4. 线程执行完毕,销毁还得切会ring0

操作系统内存管理

操作系统有用户空间与内核空间两个概念,目的也是为了做到程序运行安全隔离与稳定,以32位操作系统4G大小的内存空间为例

Linux为内核代码和数据结构预留了几个页框,这些页永远不会被转出到磁盘上。从 0x00000000 到 0xC0000000(PAGE_OFFSET) 的线性地址可由用户代码 和 内核代码进行引用(即用户空间)。

从0xC0000000(PAGE_OFFSET)到 0xFFFFFFFFF的线性地址只能由内核代码进行访问(即内核空间)。

内核代码及其数据结构都必须位于这 1 GB的地址空间中,但是对于此地址空间而言,更大的消费者是物理地址的虚拟映射。

这意味着在 4 GB 的内存空间中,只有 3 GB 可以用于用户应用程序。进程与线程只能运行在用户方式(usermode)或内核方式(kernelmode)下。

用户程序运行在用户方式下,而系统调用运行在内核方式下。在这两种方式下所用的堆栈不一样:用户方式下用的是一般的堆栈(用户空间的堆栈),而内核方式下用的是固定大小的堆栈(内核空间的对战,一般为一个内存页的大小),即每个进程与线程其实有两个堆栈,分别运行与用户态与内核态。

由空间划分我们再引深一下,CPU调度的基本单位线程,也划分为:

  1. 内核线程模型(KLT)
  2. 用户线程模型(ULT)

内核线程模型 (KLT)


内核线程(KLT):系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT要慢,比进程操作快。

JVM 属于KLT, 比如一个线程的start方法 ,底层就会在OS上开辟一个线程。


用户线程模型 (ULT)


用户线程(ULT):用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。

协程一般属于ULT的范畴

[并发编程] - 操作系统底层工作原理相关推荐

  1. 操作系统底层工作原理

    1.CPU指令结构 CPU内部结构 控制单元 运算单元 数据单元 1)控制单元,给我们提供些指令进行控制, 那为什么要用到控制单元呢?像我们的程序代码中,经常要使用到if判断都操作时,就需要使用到控制 ...

  2. Java并发编程-线程池底层工作原理

    线程池底层工作原理 1.线程池的底层工作流程 1.1.线程池的底层工作原理图 1.2.银行办理业务案例 1.3.线程池的底层工作流程总结 2.线程池用哪个?生产中如何设置合理参数 2.1.在工作中单一 ...

  3. Java并发编程-synchronized底层原理

    synchronized底层原理与Monitor密切相关 1.Java对象头 以 32 位虚拟机为例 普通对象 对象的类型,如Student类型,Teacher类型等是由KlassWord来表示的,它 ...

  4. 《Java并发编程的艺术》一一第2章Java并发机制的底层实现原理

    第2章Java并发机制的底层实现原理 2.1 volatile的应用 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行, ...

  5. 《Java并发编程的艺术》:第2章 Java并发机制的底层实现原理

    前言 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节 码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和 CPU的指令. ...

  6. 前端必经之路:浏览器底层工作原理

    今天要写的是一篇关于浏览器底层工作原理的技术科普文,作为一个前端爱好者,在平时的日常工作中,最常打交道的莫过于浏览器了.不过,大多数人并不知道,在我们打开浏览器并浏览一个网页时,浏览器底层具体进行了什 ...

  7. Java并发机制的底层实现原理

    Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令.本章我们将 ...

  8. 操作系统底层工作的整体认识

    2020-10-15 操作系统底层工作的整体认识 学习内容: 控制单元 控制单元是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register).指 令译码器ID(Instru ...

  9. 菜鸟学Kubernetes(K8s)系列——(七)关于Kubernetes底层工作原理

    菜鸟学Kubernetes(K8s)系列--(七)关于Kubernetes底层工作原理 Kubernetes系列文章 主要内容 菜鸟学Kubernetes(K8s)系列--(一)关于Pod和Names ...

最新文章

  1. Git 常用操作(5)- git clone/git checkout -b/git diff/git push/git pull
  2. 更改innodb_page_size状态值
  3. easyui datalist 动态绑定数据_一文看懂动态链接
  4. Java--缓存热点数据,最近最少使用算法
  5. Selenium实例2-截图爬取漫画
  6. java web 进程通信_RMI网络编程开发之一 JAVA“进程间”通信方式
  7. 手机端网站底部悬浮 广告代码 代关闭_网站被劫持,网站被劫持了应该怎么办?怎么解决网站被劫持?...
  8. c语言源程序结构是怎样的?
  9. getParameter和getAttribute的区别
  10. 长亭php反序列化防护_CTF-攻防世界-Web_php_unserialize(PHP反序列化)
  11. sstableloader工具使用及原理解析
  12. python的datetime.strptime_Python strptime()和时区?
  13. spring boot actuator 如何显示详细信息
  14. java一般用来开发什么_Java能做什么
  15. Android 热更新Robust 浅析
  16. 生物信息学|通过整合药物表型、治疗、化学结构和基因组特征,使用机器学习预测药物-药物相互作用
  17. 微信开发之微信环境h5页面登录实现流程
  18. C++ 九阴真经之线程安全单例类
  19. 独孤思维:免费软件搬运项目,零成本玩公众号赚零花钱
  20. 表格td的宽度不随内容自适应

热门文章

  1. java 虚拟机的工作原理
  2. Fragment碎片的基本使用(手机平板需要更好地兼容)
  3. android 获取指定月份的开始时间 结束时间
  4. oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...
  5. ubuntu spyder 不能输入中文
  6. linux ttyusb读写_linux下非root用户获得devttyUSB0的读写权限
  7. 重温强化学习之OpenAI经典场景
  8. F5 BIG-IP 远程代码执行漏洞 CVE-2021-22986 虚拟机上复现
  9. 推荐系统笔记:基于SVD的协同过滤
  10. Python爬虫应用实战-爬取股票数据做分析