操作系统面经总结,持续更新中
1.malloc底层实现
1)小于128k调用brk函数
维护一根break指针,表示堆的大小,brk函数的目的就是移动指针
2)大于128k调用mmap函数(在虚拟内存中找一块来分配给用户)
mmap函数的主要用途是进行文件的映射的,但是也可以用来进行内存分配。
其实完全可以用mmap来实现malloc但是因为mmap每次分配都是以页为单位所以当分配小的内存的时候会造成浪费。
每次进行内存分配都会调用系统调用而从用户态切换到内核态,会花费很多时间,所以由一种内存池的方式,预先分配一大段内存由用户库
进行管理,主要有几种算法:首次适配,下次适配,最差适配,最佳适配。
2.线程切换和进程切换的区别
线程切换和进程切换最主要的区别是虚拟地址的切换
进程拥有独立的地址空间,而线程共享进程的地址空间,虚拟地址的切换体现在页表的切换
有个硬件叫作TLB来缓存页表 而进程切换后TLB里面的缓存就失效了,所以就体现在程序运行变慢。
3.进程切换的步骤
进程上下文包括 寄存器信息 代码 数据 PCB
1.保存进程上下文 寄存器信息(保存在私有栈中)
2.运行调度算法选择一个进程进行执行
3.切换页表 恢复进程上下文。
4.操作系统的启动过程(转载)
https://blog.csdn.net/wchstrife/article/details/78879554