操作系统面试题
进程、线程、协程
进程
进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程的组成
每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
线程
线程是有时也被称为轻量级进程,是程序执行过程中的最小单元。线程是进程中的一个实体,是背系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可于同属于一个进程的其它线程共享进程所拥有的全部资源。
线程的组成
一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。
线程的特点:
轻型实体
独立调度和分配的基本单位
可并发执行
共享进程资源
协程
协程与子例程一样,协程也是一种程序组件。相对子例程而言,协程更为一般和灵活,但在实际中使用并没有子例程那样广泛。协程不是进程也不是线程,多个线程相对独立,有自己的上下文,切换受系统控制;协程也相对独立,也有自己的上下文,但是协程的切换由协程自己控制,当前协程切换到其它协程由当前协程控制。
协程与线程的区别
协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多 CPU 的能力。
线程与进程的区别
- 线程是进程内一个执行单元,一个进程至少由一个线程;线程共享进程的地址空间,而进程有自己的独立的地址空间,因此线程可以读写同样的数据结构和变量,便于线程之间的通信,而进程间的通信很困难而且消耗更多资源。
- 进程是资源分配和拥有的一个独立单元,而线程是 CPU 调度的基本单元。
线程的共有资源和私有资源
线程私有
- 线程上下文(重要):优先级、寄存器组
- 私有的栈结构(重要):保存其运行状态和局部自变量
- 其它:线程ID、错误返回码、线程的信号屏蔽码
线程共享
- 文件描述符:进程打开的若干文件,每个线程都可以看到
- 同一地址空间
- 堆:分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。
- 代码:如果定义了一个函数,各线程中都可以调用
- 全局变量
- 进程资源和环境
- 当前工作目录
- 用户 ID 和组 ID
- 每种信号的处理方式:SIG_IGN,SIG_DFL 或者自定义的信号处理函数
虚拟内存、物理内存、共享内存
物理内存
系统的物理内存被划分为许多相同大小的部分,也成为内存页。内存页的大小取决于 CPU 的架构和操作系统的配置,一般为 4KB。物理内存的使用主要有内核使用、slab分配器、进程使用、页缓存page cache。
虚拟内存
虚拟内存实际上并不存在,它只是操作系统为满足应用程序而在其它存储介质中虚拟出来的一块内存区域。软件在启动的时候往往需要占用大量的内存空间,尤其是游戏这类软件,但是操作系统本身的物理内存是很小的,为了满足程序启动,操作系统会在其它的存储介质中虚拟一块内存空间,以满足程序启动需要,虚拟内存的访问速度不及真实的物理内存,所以在程序启动完毕之后,重要的程序应用数据还是会向物理内存空间迁移。虚拟内存的存在减轻了物理内存的压力。
共享内存
操作系统进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,他们在内存中实际只会加载一份,这部分的存储空间就叫做共享内存。虽然每个进程访问的方式可能不一样,但是实际访问都是映射到同一块物理内存空间。