计算机组成及程序执行底层原理

一.计算机的基本组成

计算机系统是由硬件系统和软件系统两大部分组成。
计算机硬件是构成计算机系统各功能部件的集合。是由电子、机械和光电元件组成的各种计算机部件和设备的总称,是计算机完成各项工作的物质基础。计算机硬件是看得见、摸得着的,实实在在存在的物理实体。
计算机软件是指与计算机系统操作有关的各种程序以及任何与之相关的文档和数据的集合。其中程序是用程序设计语言描述的适合计算机执行的语句指令序列。
没有安装任何软件的计算机通常称为“裸机”,裸机是无法工作的。如果计算机硬件脱离了计算机软件,那么它就成为了一台无用的机器。如果计算机软件脱离了计算机的硬件就失去了它运行的物质基础;所以说二者相互依存,缺一不可,共同构成一个完整的计算机系统。

这里写图片描述

二.cpu的基本组成

运算器组成:

  • 算术逻辑单元(ALU)
  • 通用寄存器组(R1 ~Rn)
  • 多路选择器(Mn)
  • 标志寄存器(FR)

控制器组成:

  • 时标发生器(TGU)
  • 主脉冲振荡器(MF)
  • 地址形成器(AGU)
  • 程序计数器(PC)
  • 指令寄存器(IR)
  • 指令译码器(ID)
  • MAR(主存地址寄存器)
  • MDR(主存数据寄存器)

如何读取内存中的数据

总结:      链路:   内存总线,数据总线 译码器  所存单元输入端接收来自cpu或内存的数据

方式:按块加载(缓存行)

 程序编译后分为几段,比如代码段,数据段(编译后就开始分页分段,建立虚拟内存),加载运行后,先是创建一个进程,再把相应的段映射到相应的位置,然后根据pc的值,一条一条的执行完指令

一般来说,读写数据都是相对于cpu的。

当程序加载进内存后,指令放在code段,数据放在data段。data段中数据的地址由段寄存器和该数据偏移组成。code段的地址由cs和ip寄存器组成。

cpu向内存写数据的时,相当于将数据写入内存地址中。数据的地址经过地址总线送给译码器,译码器的有效输出送给锁存单元的使能端,而cpu中寄存器数据通过数据总线送给锁存单元的输入端,实现数据存入内存。

cpu读内存数据时,相当于将内存地址中的数据读入cpu。数据的地址经过地址总线送给译码器,译码器的有效输出送给锁存单元的使能端,此时锁存单元将输出端数据送入数据总线,再通过数据总线送入cpu。

cpu与内存通过数据总线交换数据,数据总线是双向的。

JVM与CPU之间的联系


(是JVM中的寄存器跟CPU寄存器之间的关系,确切来说)

我们知道,JVM只是一个用户进程,在OS中只是一段内存空间,不能直接访问内存等硬件设备,需通过系统调用陷入到内核中

jvm是用户进程,jvm使用的内存是内存的一部分,jvm将解释后的机器语言(内存中),等待cpu通过控制总线调度执行.

系统调用

1、保存 CPU 寄存器里原来用户态的指令位

2、为了执行内核态代码,CPU 寄存器需要更新为内核态指令的新位置。

3、跳转到内核态运行内核任务。

4、当系统调用结束后,CPU 寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。

内核才能访问这些特权资源,所以JVM与CPU之间还隔着OS这一层,JVM的PC寄存器并没有物理实现,它只是CPU寄存器的抽象模拟。
 

三.进程内存映射

进程不能直接放在内存的两个原因

1.内存空间是稀缺资源,把整个进程放到内存浪费内存空间,导致并发能力降低

2.相互进程间有可能相互打扰,造成进程不安全

解决办法:虚拟内存解决相互打扰的问题,段页式调度逻辑解决占用空间问题

什么是虚拟内存

它将计算机的RAM硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys

虚拟内存_百度百科段页式调度

虚拟内存_百度百科(里面有)

四.cpu与内存的通信

按块(缓存行读取)

缓存不一致问题

由于CPU的读写速度远远大于内存的读写速度,所以为了解决CPU访问主内存效率低下的问题,CPU引入了缓存。这时因为主内存和缓存都会存有数据,那么势必要保证缓存中的数据和主内存数据的一致。特别是多线程情况下,如果两个线程同时从CPU缓存中读取的值i为1,二者同时对i+1,然后写回主内存,那么i的值回变为2,但实际上i进行了2次+1的操作,实际值应该是3。这就是CPU缓存不一致导致的问题。


解决办法:

1.总线加锁,由于CPU和其他组件都是通过总线(数据总线,控制总线,地址总线)来通信,不过如果采用总线加锁的方式,就只能有一个CPU能够获取到总线锁,从而访问到内存中的变量,而其他的CPU都会被阻塞。这就类似于读写都串行化了,对效率的影响会很大。

2.缓存一致性协议,在缓存一致性协议中,最出名的就是Intel的MESI协议,MESI的大致思想是,当CPU操作的变量是一个共享变量时,说明其他的CPU缓存中也可能会存在副本,那么这时候对该共享变量的读操作不做限制,照常读取数据,只是在写入的时候,会发出信号告诉其他的CPU将这个变量的Cache line设置为无效状态,那么其他的CPU在对该变量做读取时,由于缓存中的该变量已经失效,那么就会重新到主内存中读取。

五.cpu的乱序执行   

指令重排序问题(指令优化)

 CPU层面如何禁止重排序?

 

jvm层面如何禁止重排序?

四屏障8原则

 

中断

硬中断过程

 

软中断过程

 

1000个文件描述符哪里来的?

1000个客户端通过绑定服务端的ip 端口和服务器连接,这1000个连接被服务期记录,形成1000个文件描述符,select轮询这1000个文件描述符,看那个通道有消息,把有消息的链接返给进程(例如redis)redis开始执行

https://segmentfault.com/a/1190000021985202icon-default.png?t=M1L8https://segmentfault.com/a/1190000021985202

 算法作用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔◎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值