为什么跟内核打交道效率就低呢?
因为我们的应用程序和内核打交道会经过已下步骤:
1.app发出0x80(80H)中断和需要内核调用的函数的id,或调用sysenter原语
2.os进入内核态
3.在中断向量表中查找处理例程(根据函数id查询出对应的函数)
4.保存硬件现场,CS,IP等寄存器的值
5.保存app现场,堆栈与寄存器的值
6.执行中断例程system_call
1.根据参数与编号寻找对应例程(需要调用的函数)
2.执行并返回
7.恢复现场
8.返回用户态
9.程序继续执行
汇编的本质:助记符
给01000010起个别名,这种别名就叫做汇编,汇编语言就是机器语言,Java,c#这些相对于汇编语言来说都是高级语言。
cpu主频:一秒钟能做多少次二进制运算。
cpu和内存是计算机的主要结构,cpu通过总线去内存里拿指令和数据,
cpu的组成:
1.PC:程序计数器(PC,Program counter),用于存放指令的地址,存取下一条指令的地址(内存中的地址)
2.Registers:寄存器,从内存中拿取数据到cpu进行计算,存数据的地方,寄存器的数量很多,多达好几十个,每个寄存器都有不同的作用,
3.ALU:算术逻辑单元,将数据和指令拿到之后,真正执行计算的组件,使用寄存器的数据和指令寄存器的指令,计算完毕之后,写回到内存
从内存中取数据相对于cpu来说特别慢,就放到L3缓存中,还是慢,就放到L2,还是慢,放到L1里;cpu的每个核都有自己的L1级缓存,也都有自己的L2级缓存,在一个cpu里,所有的核,共享L3级缓存
超线程:
线程是cpu执行的基本单位,执行这个程序就是执行程序的某一个线程,如果执行某个线程的时间片执行完毕,需要切换到另一个线程,则需要将上一个线程指令和数据保存到缓存或者内存中
(保存现场),在CPU中,ALU是最快的,可以在一个核里,放两组程序计数器和寄存器,这样一个核里就可以放两个线程,就可以充分利用ALU,ALU的切换可比恢复现场那种方式要快的多,(一个
运算单元,两组线程对应的资源单元,叫做超线程)
cpu乱序执行:
例如有两个线程A,B, A需要去内存中拿取数据,这个过程相对于cpu来说是很慢的,这个期间,cpu发现自己没事干了,为了优化cpu的执行速度,他会继续看下面一条指令,如果发现
下一条指令和上一条指令没有什么关系,在第一条指令执行的过程中,先把第二条执行完,这样第二条指令就会放到第一条指令前面去执行了,