先来介绍下CPU:
CPU容量小 需要别人给她指令但是运转速度快 主要是寄存器构成的
1. 通过控制器从内存中读入指令和数据到寄存器中并根据结果来控制整个计算机
2. 而运算器负责运算从内存读入的寄存器的数据
3. 时钟负责发出CPU开始计时的时钟信号
4. 运行速度:CPU>内存>硬盘
5. 只是用来运行指令 但是不能保存指令 指令是在内存中
6. 第一条指令是在内存的最顶端

寄存器有很多类型 可以存指令还有数据

电脑的运行过程

CPU一开始从内存中读入指令 是跳转指令然后去BIOS(系统的自检 检查内存 硬盘显卡之类的有无问题) 从中断向量表获取指令    然后把操作系统从硬盘中唤醒 运输到内存中
**总结:CPU运转很快 但是 得从别人那获取指令才知道做什么**
比如指向一个斐波那契数列 是操作系统设置好进程 设置好程序计数器然后让CPU开始计算 如果之前的程序抢占了CPU 那CPU就会执行那个程序的指令 而被抢占的则是保存记录 等待继续操作

CPU最重要的是寄存器和程序计数器(用来记住要执行的下一条指令地址)

CPU还有个缓存 如果CPU访问内存一个位置 以后还会多次访问 并且附近的位置也会很快被访问到 这是程序的局部性原理把他们加入到缓存里会快很多 但是操作系统如果做程序切换那么缓存会失效。
CPU还可以进行流水线操作

CPU所在的是一个批处理的计算机系统 意思就是说 内存中有多个任务 而CPU的任务就是运行计算完成这些任务 如果一个任务遇到了IO操作(速度很慢 内存和硬盘都在加载数据) 那么操作系统就让CPU执行下一个任务
注意:程序在内存中是由地址的动态重定位意思就是 每次运行的时候会记录下每个程序的其实地址 CPU专门有个寄存器来存储初始位置  这样子切换程序的时候不会有数据覆盖
CPU还会增加一个寄存器来记录程序在内存中的长度 这样每次程序访问的时候都会拿地址和这个长度比较判断有没有越界
上述的寄存器和计算内存地址的方法 统称 MMU(内存管理单元)

磁盘缓存就是将硬盘的东西读入内存中 下次访问的时候速度快一点

但是遇到问题 程序很大怎么办?
这个时候根据 局部性原理 把一个程序分成多个小块 按块装在到内存中 叫页框
因为大部分程序都是集中运行在着几个页框中 于是这些页也叫做工作集 这些工作的真实内存映射到对应的物理内存 这个程序其他未加载的部分其实并没有运行 这就涉及到了 虚拟内存是把磁盘作为部分的内存使用 通过分页式或者分段式将正在运行的内容加载到内存中不用的放在磁盘里 这样看起来内存变大了 其实没有
如果真实的内存满了 那么久将现有的页框置换到硬盘上 加载其他的页框进来
每次运行的内存中页框都是要去找对应 物理内存 于是就 将那些最常访问的页框以及对应的物理内存放在缓存中

对于CPU加载程序的时候会分段加载到内存中 对应的也对程序进行标准话 分为代码段 数据段 堆栈段之类的 然后操作系统记住每一段的开始和结束地址 如果一个程序非法访问那么就 杀死它

CPU涉及到函数的调用 : 这个时候可以先介绍一下线程
1. 线程生活在线程池里面
2. 程序可以理解为多个线程的结合体
3. 线程被加载到内存 然后进入CPU 但是需要排队 如果线程赖着CPU不走 就会被垃圾回收掉
4. 每个线程只能在CPU上运行一端时间(或者被其他线程抢占资源打断或者出现IO流这样的耗时操作) 然后再保存自己的信息再等待 等着被唤醒
在就绪和运行中轮转 知道把工作做完
5. 线程有时候需要加锁 如果出现死锁 那么就得kiss掉一个 所以加锁的时候要记住 按照操作系统的算法比较大小 然后从最大的开始加锁
6. 线程是存在线程池中 如果电脑重启那么一切都会置空
7. 线程是被加载到内存中然后开始操作的 过程是 先将class文件加载到方法区中

class的过程:
1. class文件进入方法区等待调用一个线程 线程进来提取了代码指令就开始在工作台进行操作(栈帧)也可以说是一个函数调用 多个工作台组成一个java栈 一个工作台就是一个栈帧依次执行最上的 然后销毁 加入的话也是压在最上面 在工作台里面还有一个局部变量区和操作数栈 最后把操作后的数弹出 这里的操作数算是在操作数栈里面 而不像CPU是放在一个个寄存器里

总结:1. 程序(线程集)被加载到内存中
注意:程序是分段的 意思就是说 程序不是整个都被加载到内存中 而是加载目前需要的个体 也可以理解为线程
2. 从线程从方法区中的class调用指令 然后逐个执行里面线程中的函数调用(栈帧)
执行的过程是CPU来操作的 CPU从内存中读取指令和数据到寄存器 然后根据结果操作整个计算机
3. 线程在栈帧操作的时候会创建栈区 临时保存变量 结束后删除 如果是new的话就会在堆中创建长期的对象 如果不用了就垃圾回收系统自动回收对象。
4. 线程也可被中断 因为CPU去执行其他线程了
5. 函数的调用 CPU执行线程中的指令的时候 逐行往下执行 遇到函数调用就 根据目标函数的地址进入改函数继续执行 最后到结尾 返回函数调用的结果和执行指令(跳转到调用初始的位置的下一行) 回到函数调用的位置执行下一行

额外涉及补充:

  • 通过DLL实现函数共有 节约内存

  • 哈夫曼编码大幅提升压缩比率

  • 运行环境是操作系统+硬件

  • windows克服了应用在不同cpu的差异

源代码如何运行

编译器可以通过freeBSD的ports机制生成合适的本地代码但是本地文件( obj文件)无法直接运行 需要链接成可执行的exe文件 需要导入库和   直接和exe文件结合的静态链接库 可执行文件的运行条件是需要  再配置信息

堆栈方法区

程序加载的时候还会创建堆和栈: 简单讲一下堆栈方法区

数据都保存在栈中 操作的时候把数据一个一个加入那个桶 得出计算结果然后返回
2. 堆的话是 如果new一个对象出来 对象就在堆里面 内部有个计数器 如果没有标志使用就是废弃的对象会被垃圾回收 干掉

CPU和内存 程序(线程)关系相关推荐

  1. cpu、内存、磁盘关系

    CPU是处理器,是大脑和核心,内存和硬盘都是存储器,受CPU的指挥. CPU工作的时候: 1.需要从存储器里取数据出来. 2.进行运算,要不停地用存储器读写. 3.计算出结果再返回到存储器里. 如果硬 ...

  2. 理解CPU/寄存器/内存之间的关系

    CPU/寄存器/内存 因为要了解多线程,自然少不了一些硬件知识的科普,我没有系统学习过硬件知识,仅仅是从书上以及网络上看来的,如果有错误请指出来. CPU,全名Central Processing U ...

  3. CPU,寄存器,内存三者的关系

    一.皇帝身边的小太监----寄存器 不知道什么是寄存器?那见过太监没有?没有?其实我也没有.没见过不要紧,见过就麻烦大了.^_^,大家都看过古装戏,那些皇帝们要阅读奏章的时候,大臣总是先将奏章交给皇帝 ...

  4. CPU和内存之间关系的演变

    关注.星标公众号,不错过精彩内容 转自:编程技术宇宙 我们今天看到的CPU和内存之间的关系,其实是经过了多年的演变才形成的. 8086 原来咱们的祖先叫8086,我们看下他的照片 那是一个纯真质朴的年 ...

  5. 计算机中cpu是不是内存,电脑卡是cpu还是内存

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 电脑卡和CPU.内存都有关系,可能是CPU性能过低,需要更换性能更好的CPU.也可能是内存太小,需要升级内存. 中央处理器(CPU ...

  6. 性能之巅:定位和优化程序CPU、内存、IO瓶颈

    摘要:性能优化指在不影响系统运行正确性的前提下,使之运行得更快,完成特定功能所需的时间更短,或拥有更强大的服务能力. #一.思维导图 #二.什么是性能优化? 性能优化指在不影响系统运行正确性的前提下, ...

  7. Java多线程学习九:怎样确定线程数量及CPU 核心数和线程数的关系||如何定制自己的线程池

    调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能.在实际工作中,我们需要根据任务类型的不同选择对应的策略. CPU 密集型任务 首先,我们 ...

  8. 面试题:合适的线程数量是多少?CPU 核心数和线程数的关系?

    合适的线程数量是多少?CPU 核心数和线程数的关系? CPU 密集型任务 首先,我们来看 CPU 密集型任务,比如加密.解密.压缩.计算等一系列需要大量耗费 CPU 资源的任务.对于这样的任务最佳的线 ...

  9. CPU、内存、磁盘IO之间的关系

    CPU和内存的关系: CPU是负责运算和处理的 内存是交换数据的 当程序或者操作者对CPU发出指令,这些指令和数据暂存在内存里,在CPU空闲时传送给CPU,CPU处理后把结果输出到输出设备上,输出设备 ...

最新文章

  1. ironpython 教程_「ironpython」VS2017 IronPython做界面
  2. 常用Linux路由命令(route、ip、ifconfig等等)
  3. PHP 神盾解密工具
  4. Oracle数据库执行exp命令--报参数'log' 不允许有多个值
  5. linux下netty接收不到服务,Netty 发送消息失败或者接收消息失败的可能原因
  6. Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function
  7. if you have something important on the clean my mac
  8. 通俗易懂地搞懂决策树(Decision Tree)那些事儿
  9. JEPaas【按钮隐藏】根据单据状态值决定【添加明细】【删除】按钮的隐藏和显示
  10. [转载] mac开发者,你不得不知道的环境变更设置方法(如Java的环境变更 source命令 )
  11. C#LeetCode刷题之#27-移除元素(Remove Element)
  12. python workflow_用 Python 写 Alfred3 workflow 插件,一个最小示例
  13. Flutter状态管理学习手册(三)——Bloc
  14. 上周热点回顾(8.26-9.1)
  15. 阿里云DataV结合LayUI的一次实战
  16. 《神奇的数学》读后感_奇妙的数学王国读后感10篇完美版
  17. python中转义字符与格式化字符的混合使用
  18. 2017年总结及2018年规划
  19. 惊艳爆了,这是我见过的最美Redis客户端
  20. 4键电子手表说明书_电子表通用说明书

热门文章

  1. java夏令时_java-时间处理夏令时冬令时跨时区问题处理
  2. 点云数据处理 | 轨道交通线路自动提取来了!
  3. 《机电传动控制》第一周作业
  4. 观察者模式 : 一支穿云箭,千军万马来相见
  5. 解决手机连接上wifi可以上网,电脑不上不了网的问题
  6. 一种3D视频格式转换(H264 MVC至SBS / OU)方案
  7. 马云幸福,与情人节无关
  8. Kafka启动异常:kafka.common.InconsistentClusterIdException
  9. 赵小楼《天道》《遥远的救世主》深度解析(46)芮小丹对韩楚风接待规格的态度
  10. java继承 -宠物类叫Pet(父类) ;属性有name 和 age; 行为有吃 eat(); 喝 drink(); 叫声shout();子类 Cat 和 Dog Cat继承 Pet类所