Linux
文章目录
Linux 内存管理
- 32位系统虚拟内存空间: 4GB(通常是被分隔成多个物理内存碎片),其中内核空间占用1GB(高地址),用户空间占用3GB(低地址)。
- 用户空间布局 :
- 栈(Stack): 从高地址向低地址增长,存储函数参数、局部变量等。默认大小通常为8MB,但可自定义。
- 文件映射: 包括动态库、共享内存,位于栈和堆之间。
- 堆(Heap): 动态分配的内存区,从低地址向高地址增长。
- 未初始化数据段(.bss): 存放未初始化的全局变量和静态变量。
- 已初始化数据段(.data): 存放已初始化的全局变量和静态变量。
- 程序代码段(.text): 存放可执行代码。
- 分页机制: 每页大小通常为4KB。
- 页表: 实现虚拟地址到物理地址的映射。
- 段页式内存管理: 地址结构包括段号、段内页号和页内位移。
Linux 虚拟内存
概述
- 虚拟内存空间:32位处理器的虚拟内存空间为4GB。
- 进程视角:每个进程认为自己拥有4GB的连续虚拟地址空间,实际上只有部分映射到物理内存。
- 物理内存与外部存储:物理内存中可能会存在碎片,部分内容会存储在外部磁盘上,需要进行数据的交换(页置换)。
虚拟地址与物理地址的映射
- 两次映射 :
- 映射到虚拟内存空间。
- 映射到物理内存空间。
- 责任分配 :
- 硬件部分:存储管理单元 (MMU) 负责将虚拟地址转换为物理地址。
- 软件部分:操作系统的内存管理模块负责维护和更新页表。
内存分页
- 定义:将虚拟内存和物理内存分成固定大小的块(页),在Linux中每页大小一般为4KB。
- 页表映射:通过页表将虚拟地址转换为物理地址。
- 缺页异常处理 :
- 当访问的虚拟地址没有对应的物理内存时,产生缺页异常。操作系统通过分配物理内存、更新页表来恢复进程运行。
分页的优势
- 减少内存碎片:以页为单位进行内存管理,从而避免小内存块无法使用的问题。
- 提高交换效率:在物理内存不足时,只交换最近未使用的页(页面置换算法,如LRU)。
- 延迟加载:按需加载,程序在需要时才将虚拟内存中的指令和数据加载到物理内存,提高内存利用效率。
虚拟地址到物理地址的映射机制
- 虚拟地址组成:虚拟地址包含页号和页内偏移。
- 页表引用:页号用于索引页表,页表存储物理页的基地址,基地址与页内偏移组合,形成实际的物理地址。
分级页表的缺陷
- 存储需求:32位地址空间(4GB),每页4KB,共有2^20个页。单级页表需要4MB的存储空间,多个进程下存储需求会极大增加。
- 分级设计:分级页表(如二级页表)减少了单进程的页表存储需求。一级页表覆盖全部虚拟空间,二级页表按需创建。
段页式内存管理
- 地址结构:虚拟地址由段号、页号和页内偏移组成。
- 访问流程 :
- 根据段号访问段表,获取段基地址和段界限。
- 根据页号访问页表,获取物理页的基地址。
- 将物理页号与页内偏移组合,得到物理地址。
- 成本与效率:虽然段页式内存管理增加了硬件和软件开销,但结合了分段和分页的优点,提高了内存利用率和系统的灵活性。
Linux 信号
- 用途: 用于进程间通信或进程与系统内核通信,通知某个状态改变或系统异常。
- 常用信号 :
- SIGHUP (1): 控制终端挂起或终止。
- SIGPIPE (13): 写入到读端关闭的管道或socket时产生。
- SIGURG (23): socket连接上收到紧急数据。
Linux 设计特点
- 多任务(MultiTask): 支持并发和并行的多个任务执行。
- 对称多处理(SMP): CPU共享内存和硬件资源,多个CPU地位相等。
- 可执行文件链接格式(ELF): Linux中可执行文件的存储格式。
- 宏内核(Monolithic Kernel): 所有系统服务运行在内核态,如文件系统、设备驱动、网络协议等。
I/O 多路复用
- 概念: 在单个线程中处理多个I/O操作。
- 实现方式 :
- select: 最古老的多路复用机制;使用位图表示文件描述符集合。在某些系统中,默认最多监视1024个文件描述符,但这个限制可以通过系统配置进行调整。
- poll: 使用数组存储文件描述符,理论上没有数量限制。但在处理非常大量的文件描述符时,性能可能会因为数组遍历的成本而受影响。
- epoll: 仅在Linux系统上可用的I/O多路复用机制。它使用一个事件表和红黑树来管理文件描述符,从而提高了处理大量文件描述符的效率。epoll通过事件通知的方式工作,只在文件描述符状态改变时通知应用程序,减少了不必要的轮询。
- epoll 的优势 :
- 效率高: 直接返回就绪的文件描述符,减少了内核与用户空间的数据复制,提高了数据处理效率。
- 可扩展性好: 支持的并发连接数量远大于select和poll,适用于高负载环境。
- 实时性强: 事件驱动机制允许快速响应文件描述符状态的改变。
五种 I/O 模型详解
- 阻塞式 I/O: 进程阻塞等待I/O完成。
- 非阻塞式 I/O: 定期轮询检查I/O是否就绪。
- I/O 多路复用: 使用select/poll/epoll监视多个文件描述符。
- 信号驱动 I/O: 使用信号通知I/O就绪。
- 异步 I/O: 内核负责整个I/O操作,完成后通知进程。
Linux 网络编程模型
- 多进程服务器 :
- 父进程处理连接请求,子进程处理业务逻辑。
- 需要处理进程间通信和僵尸进程问题。
- I/O 复用服务器 :
- 使用select/poll/epoll同时处理多个连接。
- 避免了进程创建和切换的开销。
- 多线程服务器 :
- 资源共享更方便,切换开销更小。
- 需要考虑线程安全和通信问题。
软链接和硬链接对比
- 软链接 :
- 独立文件,包含目标文件路径。
- 功能: 可链接文件或目录,甚至不存在的文件。
- 行为: 原文件删除后,链接失效。
- 使用方式 : 可跨文件系统,使用
ln -s
命令创建。
- 硬链接 :
- 共享inode,与原文件共享同一个inode。
- 功能: 只能链接同一文件系统内的文件,不能链接目录。
- 行为: 原文件删除不会影响硬链接文件的使用。
- 使用方式 : 使用
ln
命令创建,增加文件的链接计数。
中断和异常
- 中断: 外部事件触发,如硬件设备中断、时钟中断。
- 异常: 内部事件触发,如程序错误、地址越界、运算溢出。
- 处理: 都会导致处理器暂停当前任务,执行相应的处理程序。
用户态和核心态
- 用户态 :
- 特征: 进程只能访问受限资源,不能直接访问硬件。
- 核心态 :
- 特征: 可以执行特权指令,访问所有资源。
- 切换场景: 系统调用、异常和中断。
并行和并发
- 并行: 同时执行多个任务,需要多个处理单元。
- 并发: 在同一时间段内交替执行多个任务,可在单个处理单元上实现。
孤儿进程和僵尸进程
- 孤儿进程 :
- 定义: 父进程先于子进程退出。
- 处理: 被init进程(PID 1)收养。
- 僵尸进程 :
- 定义: 子进程退出但父进程未回收其状态信息。
- 影响: 仍占用系统资源(进程表项)。