操作系统内存管理
# 1 执行空间保护
操作系统有用户空间与内核空间两个概念,目的也是为了做到程序运行安全隔离与稳定,以32位操作系统4G大小的内存空间为例
Linux为内核代码和数据结构预留了几个页框,这些页永远不会被转出到磁盘上。内核代码及其数据结构都必须位于这 1 GB的地址空间中,但是对于此地址空间而言,主要应该是物理地址的虚拟映射。
从 0x00000000 到 0xC0000000 的线性地址可由
用户代码
和内核代码
进行引用(即用户空间)。
从 0xC0000000(PAGE_OFFSET)到 0xFFFFFFFFF的线性地址只能由
内核代码
进行访问(即内核空间)。
这意味着在 4 GB 的内存空间中,只有 3 GB 可以用于用户应用程序。
进程与线程只能运行在 用户方式(usermode)
或 内核方式(kernelmode)
下。用户程序运行在用户方式下,而系统调用运行在内核方式下。
在这两种方式下所用的堆栈不一样:用户方式下用的是一般的堆栈(用户空间的堆栈),而内核方式下用的是固定大小的堆栈(内核空间的堆栈,一般为一个内存页的大小),即每个进程与线程其实有两个堆栈,分别运行与用户态与内核态。
# 2 线程模型
CPU调度的基本单位线程,可划分为2种模型:
- 内核线程模型(KLT)
- 用户线程模型(ULT)
内核线程(KLT):系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT要慢,比进程操作快。
用户线程(ULT):用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。
提示
JVM采用的线程模型是:内核线程(KLT)
# 3 进程与线程
什么是进程?
现代操作系统在运行一个程序时,会为其创建一个进程;例如,启动一个Java程序,操作系统就会创建一个Java进程。进程是OS(操作系统)资源分配的最小单位。
什么线程?
线程是OS(操作系统)调度CPU的最小单元,也叫轻量级进程(Light Weight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。CPU在这些线程上高速切换,让使用者感觉到这些线程在同时执行,即并发的概念。
线程上下文切换过程: