12、进程、线程及中断、core、hyperthread、C++ struct内存布局

1、进程

一般,CPU在执行指令前,要知道一些信息
包括(
1、开始执行的指令是那个
2、内存布局(因为Virtual memory,需要知道物理disk地址)
3、寄存器状态

这样,就可以map到物理地址,去做实际的事情。
每次运行一个.exe文件,都会开启一个进程,用来告诉CPU 这个程序的内存是怎么布局的,因此,运行中的程序的内存布局方面是完全由进程控制的,进程就是个内存布局的状态。
进程包含 内存、翻译buffer、地址表。

2、线程及中断

进程中包含很多个线程,线程是存储了asm 指令集、寄存器信息,线程知道正在执行的是什么指令,含有处理器寄存器的状态。
asm指令集,寄存器,是在process更底层的环境下运行的,也就是因为进程可能有多个同时的代码执行状态,这种状态就是线程。

一般中断都会有 中断handler 去处理,它是写在OS里面的一串程序,会根据实际情况分析是否 要改变某个 thread 的运行状态(三态),先存储asm 指令,寄存器状态到 内存的某处,然后引入别的thread进行执行,再又back to original。

3、Core

内核就是一系列能处理线程(do work)的单元,能做的事情包括 乘法、看地址等,且在每个时钟周期内执行一个指令
由三部分组成(
1、指令译码器
2、算术逻辑单元
3、存储单元(存储器)
)

4、Hyperthread

一般的处理器厂家不会无故增加物理core的数量,相反,他们发明一种core,能交替处理2个线程,并且在宏观上是并行的,这种一个core处理两个线程的线程就是超线程。
core在一个latency cycle里面循环执行两个线程,这样2 core就在逻辑上面变成4core。

5、C++ struct内存布局

默认情况下的C++ struct内存布局就是稀烂,一般都采取一个结构体中最大的一个作为每个元素的存储大小。

struct {
int a;
char x;
}
浪费了3个字节的内存。

一般可以用以下方法节约3字节浪费。
#pragama pack(push , 1)
everything in this scope is packed in 1 byte align
#pragama pack(pop)
//back to C++ nomal 内存布局

猜你喜欢

转载自blog.csdn.net/weixin_42557786/article/details/108027983