操作系统有关程序内存

golang内存

程序运行在操作系统为其创建的进程当中,所需要的所有资源也都是由os对进程进行分配(内存,磁盘,句柄等),具体的资源在真正意义上被程序使用会做一定的转换管理,比如物理内存经过内存管理器虚拟化后被我们的程序使用,程序直接对接的是虚拟内存(是有原有的)。golang程序在运行时会一次性向os要一大块内存,后面程序代码在需要内存的时候直接自己提供无需跟os交互,结构上也是将内存分为好几个部分(栈,堆,text,data等), 规格上,是将内存划为了67个规格对应我们不同数据类型的申请。

存在磁盘的源代码到被cpu执行

我们编写的代码一开始在磁盘,os运行到RAM,再到被转换成指令集到寄存器,最后被cpu执行运算,cpu运算过程需要临时存储,以及需要反复用到某个变量时,L1,L2,L3级别缓存又出来了,缓存出来一致性保障得通过相同总线去保证一致性等等这些都是因为cpu执行太快,为了提高执行效率设计出来的方案。

进程,线程,协程切换区别

进程切换代价:进行切换也就意味着cpu接下来执行的指令是另一个进程,进程资源的隔离性我们知道接下来的指令操作的资源将不一样,上一个进程的虚里内存那一套得全部由内核代为管理切换,然后内核将新的进程的虚里内存又给搬出来,这一进一出意味着接下来的cpu指令集使用到的资源在l1,l2,l3里面一开始肯定是没有了,又得发生一次主存到缓存的过程,其于的倒是跟线程切换一样了
线程切换:由于是一个进程的不同线程切换,所以线程不需要进程虚拟内存的切换,因为资源提供者没有变。但不同的线程有自己的私有栈以及寄存器,所以之前存在于寄存器里面的指令集内存必须将老线程的保存,空出寄存器空间再将新线程的指令集加载进去
协程切换:存户态空间完成,操作系统无感知,要知道线程的切换必须得切换到内核线程去完成呀,其次协程上下文更简单,栈空间,cpu指令集持久化保存与goroutinue的结构体中,加载另一个goroutinue。

参考文献

goroutinue切换
GMP调度

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 以下文章来源于公众号Java建设者 ,作者cxuan 文章主要结构图如下 操作系统 现代计算机系统由一个或多个处理...
    码农小光阅读 705评论 0 3
  • 在《计算机组成与体系结构》——7操作系统支持就已经知道,操作系统并不是和计算机一起出现的产物,然后呢,OS的主要任...
    shijiatongxue阅读 403评论 0 0
  • 结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运...
    零点145阅读 170评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,918评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 7,209评论 0 2

友情链接更多精彩内容