操作系统有关程序内存

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调度

你可能感兴趣的:(操作系统有关程序内存)