操作系统之Linux相关 内存管理、虚拟内存、设计特点、网络编程模型

Linux

Linux 内存管理

image.png|300

  • 32位系统虚拟内存空间: 4GB(通常是被分隔成多个物理内存碎片),其中内核空间占用1GB(高地址),用户空间占用3GB(低地址)。
  • 用户空间布局:
    • 栈(Stack): 从高地址向低地址增长,存储函数参数、局部变量等。默认大小通常为8MB,但可自定义。
    • 文件映射: 包括动态库、共享内存,位于栈和堆之间。
    • 堆(Heap): 动态分配的内存区,从低地址向高地址增长。
    • 未初始化数据段(.bss): 存放未初始化的全局变量和静态变量。
    • 已初始化数据段(.data): 存放已初始化的全局变量和静态变量。
    • 程序代码段(.text): 存放可执行代码。
  • 分页机制: 每页大小通常为4KB。
  • 页表: 实现虚拟地址到物理地址的映射。
  • 段页式内存管理: 地址结构包括段号、段内页号和页内位移。

Linux 虚拟内存

概述

  • 虚拟内存空间:32位处理器的虚拟内存空间为4GB。
  • 进程视角:每个进程认为自己拥有4GB的连续虚拟地址空间,实际上只有部分映射到物理内存。
  • 物理内存与外部存储:物理内存中可能会存在碎片,部分内容会存储在外部磁盘上,需要进行数据的交换(页置换)。

虚拟地址与物理地址的映射

  • 两次映射
    1. 映射到虚拟内存空间。
    2. 映射到物理内存空间。
  • 责任分配
    • 硬件部分:存储管理单元 (MMU) 负责将虚拟地址转换为物理地址。
    • 软件部分:操作系统的内存管理模块负责维护和更新页表。

内存分页

  • 定义:将虚拟内存和物理内存分成固定大小的块(页),在Linux中每页大小一般为4KB。
  • 页表映射:通过页表将虚拟地址转换为物理地址。
  • 缺页异常处理
    • 当访问的虚拟地址没有对应的物理内存时,产生缺页异常。操作系统通过分配物理内存、更新页表来恢复进程运行。

分页的优势

  • 减少内存碎片:以页为单位进行内存管理,从而避免小内存块无法使用的问题。
  • 提高交换效率:在物理内存不足时,只交换最近未使用的页(页面置换算法,如LRU)。
  • 延迟加载:按需加载,程序在需要时才将虚拟内存中的指令和数据加载到物理内存,提高内存利用效率。

虚拟地址到物理地址的映射机制

  • 虚拟地址组成:虚拟地址包含页号和页内偏移。
  • 页表引用:页号用于索引页表,页表存储物理页的基地址,基地址与页内偏移组合,形成实际的物理地址。

分级页表的缺陷

  • 存储需求:32位地址空间(4GB),每页4KB,共有2^20个页。单级页表需要4MB的存储空间,多个进程下存储需求会极大增加。
  • 分级设计:分级页表(如二级页表)减少了单进程的页表存储需求。一级页表覆盖全部虚拟空间,二级页表按需创建。

段页式内存管理

  • 地址结构:虚拟地址由段号、页号和页内偏移组成。
  • 访问流程
    1. 根据段号访问段表,获取段基地址和段界限。
    2. 根据页号访问页表,获取物理页的基地址。
    3. 将物理页号与页内偏移组合,得到物理地址。
  • 成本与效率:虽然段页式内存管理增加了硬件和软件开销,但结合了分段和分页的优点,提高了内存利用率和系统的灵活性。

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)收养。
  • 僵尸进程:
    • 定义: 子进程退出但父进程未回收其状态信息。
    • 影响: 仍占用系统资源(进程表项)。
  • 30
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值