一、进程与线程
操作系统要运行一个可执行的程序,首先要将程序文件加载到内存,然后CPU去读取和执行这些指令,而一个进程就是“一次程序执行的过程”,内核会给每一个进程创建一个名为task_struct 的数据结构,而内核也是一段程序,系统启动时就被加载到了内存中。
进程在运行过程中要访问内存,而物理内存是有限的,比如内存只有 8GB,那怎么把有限的内存分给不同的进程使用呢?
跟 CPU 的分时共享一样,内存也是共享的,Linux 给每个进程虚拟出一块很大的地址空间,比如 32 位机器上进程的虚拟内存地址空间是 4GB,从 0x00000000 到 0xFFFFFFFF。但这 4GB 并不是真实的物理内存,而是进程访问到了某个虚拟地址,如果这个地址还有对应的物理内存页,就会产生缺页中断,分配物理内存,MMU(内存管理单元)会将虚拟地址与物理内存页的映射关系保存在页表中,再次访问这个虚拟地址,就能找到相应的物理内存页。每个进程的4G虚拟地址空间如图:
当物理内存不足时,Linux 会使用交换空间(Swap Space)作为临时的延伸存储。不活跃的进程的部分或全部内存页面会被换出到磁盘上的交换空间,以便为活动进程腾出物理内存。
Linux 内核采用页面替换算法(如最近最少使用 LRU 等)来决定哪些内存页面应当被换出至交换空间。当需要恢复已被换出的页面时