1、cpp
malloc
小于128k, 使用brk函数,堆顶会有一个enddata指针记录堆区位置,从而在虚拟内存地址空间中创建内存
真正使用时,还要将其通过映射变成物理地址。
程序第一次读写这块内存后,发生缺页中断(访问的页不在主存,需要操作系统将其调度),这时,才会分配给他物理页。
大于128k
使用mmap,在堆和栈之间分配内存。
free
mmap创建的直接munmap
brk的不释放,当enddata指针后面有128k空余时,指针回移。
const
int a = 0, b = 0;
const int* c = &a;
c = &b;
int* const d = &b;
*d = a;
没有直接和const连接的是可以改变的。
动态库、静态库
动态库:
exe中只包含它需要的函数的引用表,执行时,需要的函数代码才会拷贝到内存中。
可执行文件小,节省磁盘节省内存,但在运行的时候需要时间去连接库函数,执行速度较慢
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在
静态库:
将所有需要使用的函数作为机器码拷贝到最终的执行文件中,导致最终生成的则执行文件占用磁盘和内存空间大
但速度较快。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
2、计算机网络
三次握手四次挥手时连接双方各自的状态
三次握手:
1、client----->SYN(1)seq(x) SYN_SEND
2、server---->SYN(1)ACK(1)seq(y)ack(x+1) SYN_RECV
3、client------>ACK(1)seq(x+1)ack(y+1) client/server-->ESTABLISHED
四次挥手:
1、client---->FIN(M) FIN_WAIT1
2、server--->ACK(M+1) CLOSE_WAIT ----->client FIN_WAIT2
3、server--->FIN(N) LAST_ACK
4、client----->ACK(N+1) TIME_WAIT ----->server CLOSED
time_wait过多的原因
过多的主动关闭连接
close_wait过多的原因
应用层关系
对方发起了关闭,但己方依旧在读写,没有关闭连接。
tcp复用
3、数据结构
一致性hash
4、操作系统
虚拟内存、物理内存 页 页帧 页表
页:虚拟内存
页帧:物理内存
页表:页和页帧一对一的映射表
页面失效:找到页帧,将其写入磁盘,并让其失效,并将需要访问的页放入页帧中(从虚拟内存转入物理内存)
并修改页表的映射,从而保证所有的也都有被调度的可能。
虚拟页的个数势必比物理页帧的个数大
页号+偏移量 == 虚拟内存地址
页号---》寻找页帧号---》查看是否存在内存中---》调度---》传到MMU组成物理地址