操作系统
内存管理
简述进程线程切换的流程
如果想要从A进程切换到B进程,必定要先从用户态切换到内核态,因为这个切换工作是由操作系统完成的,操作系统需要先挂起正在占用CPU的A进程,才能切换到B进程。
由于从用户态切换到内核态的时候,CPU是在用户进程手中,所以这个是通过硬中断来实现的。再从用户态切换到内核态之前需要首先保存用户进程的上下文,以便下一次执行是可以继续之前的工作。
这个上下文就是进程的执行环境,包括所有的寄存器变量,进程打开的文件、内存信息等。一个进程的上下文可以分为用户级上下文、寄存器上下文、系统级上下文。用户级上下文存储的是用户进程的内存数据和堆栈数据等;寄存器上下文是一些通用寄存器;系统级上下文是内核栈、PCB(进程控制块)等;
进程在地址空间会划分为哪些区域
我来简单讲一下把文件加载到内存中的一个过程,以Windows为例,PE文件中有一个叫节的概念,节是PE文件中存放代码和数据的基本单元,用以存储不同类型的数据,比如data节、code节等,一个节的所有原始数据必须加载到连续的内存地址空间,这也就造成了在虚拟地址空间中的区块划分。
在虚拟地址空间中会按节划分为代码段、数据段、未初始化的数据段以及堆栈这些区块。
堆和栈有什么区别
我们常说堆栈堆栈,其实堆和栈是两个不同的概念,最直观的理解,堆是由用户控制的,Java中可以用new关键字在堆中申请内存来实现内存分配,c语言是用malloc,而栈是由操作系统控制的,在栈中存储的是这个进程的局部变量等,比如我们用new关键字来申请一块内存,内存本身是在堆中开辟的,而指向内存的指针是存储在栈中的。
操作系统为什么分内核态和用户态,这两者如何切换
因为在CPU的指令中,有一些是非常危险的,比如清理内存、设置时钟等,如果所有的程序都能使用,就有可能造成程序崩溃,所以CPU将指令分为特权指令和非特权指令,