当前位置: 首页 > news >正文

《性能之巅》第三章 操作系统

3.2.3 中断和中断线程
  • 中断概念:内核除响应系统调用外,还需响应设备服务请求,即中断,它会中断当前执行。
  • 中断服务程序:通过注册处理设备中断,设计要点是运行尽可能快,减少对活动线程中断的影响。若工作多且可能阻塞,最好用中断线程处理。不同内核版本实施方式不同,如Linux设备驱动分上下半部,上半部快速处理中断,下半部在禁止模式后处理,可作为tasklet或工作队列,由内核线程调度;Solaris系统把中断工作放中断线程。
  • 中断延时:从中断开始到中断服务完成的时间叫中断延时,有专门学科研究实时或低延时系统。

3.2.4 中断优先级
  • 定义:用中断优先级(IPL)表示当前活跃中断服务程序的优先级,在中断信号发出时从处理器读取。若读到级别高于当前执行中断,该中断成功;否则排队等待,避免高优先级工作被低优先级工作打断。
  • 范围示例:以内核服务作为中断线程的IPL,范围为1 - 10 ,如串行I/O中断优先级高,因硬件缓冲小,需快速服务避免溢出。

3.2.5 进程
  • 进程概念:是执行用户级程序的环境,包含内存地址空间、文件描述符、线程栈和寄存器等,类似早期电脑虚拟化,可让内核进行多任务处理,系统中可执行上千个进程,用进程ID(PID)识别,每个PID唯一 。一个进程含一个或多个线程,线程在进程地址空间操作,共享文件描述符,多线程进程可在多个CPU上并发执行。
  • 进程创建:正常通过系统调用fork()创建,fork()用自身进程号创建副本,再调用exec()执行不同程序。fork()采用写时拷贝(COW)策略提升性能,添加原有地址空间引用,有进程修改被引用内存时,针对修改建立独立副本,减少内存和CPU使用。

  • 进程生命周期:包括创建、idle(空闲 )、ready - to - run(就绪 ,在CPU运行队列等待 )、on - proc(运行在CPU上 )、sleep(因I/O阻塞 ,I/O完成或被唤醒 )、zombie(进程终止,等待父进程读取状态或被内核清除 )等状态。

  • 进程环境:包括进程地址空间内数据和内核元数据(上下文 )。内核上下文含进程ID、所有者用户ID等属性和统计信息,还有文件描述符;用户地址空间包含可执行段、库、堆等内存段。

3.2.6 系统调用
  • 概念及设计理念:系统调用用于请求内核执行特权系统例程。UNIX理念倡导尽量减少系统调用数量,以保持内核简洁,更复杂接口应构建在用户空间,便于开发和维护。
  • 关键系统调用列举
    • 文件操作类:read()读取字节、write()写入字节、open()打开文件 、close()关闭文件、stat()获取文件统计信息。
    • 进程管理类:fork()创建新进程、exec()执行新程序。
    • 网络通信类:connect()连接到网络主机、accept()接受网络连接。
    • 其他功能类:ioctl()设置I/O属性等、mmap()把文件映射到内存地址空间、brk()扩展堆指针 。
  • 系统调用特性:都有良好文档,一般随操作系统附带Man手册。接口简单一致,设置有特殊变量errno,用于出错时指示错误及其类型。
  • 部分系统调用用法说明
    • ioctl():用途广泛但用法多样,例如Linux的perf工具执行特权指令协调性能监测点时,通过调用ioctl() (如perf_event_open()会用ioctl()返回文件描述符 ),以不同参数执行不同行为,开发人员可对参数进行操作修改。
    • mmap():常将可执行文件、库及内存映射文件映射到进程地址空间,提升性能,内存映射管理会做权衡。
    • brk():由系统内存分配库执行,定义进程工作内存大小,有时会替代基于brk()的malloc()为进程分配内存,减少系统调用频率。
3.2.7 虚拟内存
  • 概念与功能:虚拟内存是主存的抽象,为进程和内核提供近乎无穷且私有的主存视角。支持多任务处理,让进程和内核在私有地址空间操作,无需担心竞争。还支持主存超额使用,必要时可在主存(一级存储,即RAM )和二级存储(磁盘 )间映射虚拟内存。
  • 实现原理:依赖处理器和操作系统支持,并非真实内存。多数操作系统仅在内存首次填充(写入 )时,将虚拟内存映射到真实内存。

3.2.8 内存管理
  • 管理目标:当虚拟内存借助二级存储扩展主存时,内核致力于将最活跃数据保留在主存中。
  • 内核例程方式
    • 交换(swapping):使整个进程在主存和二级存储间移动,是原始UNIX方法,会造成严重性能损耗。
    • 换页(paging):移动小内存单元(如4KB的页 ),是更高效的方法,被引入到BSD。两种方法都将最近最少使用或最近未使用的内存移至二级存储,按需再移回主存 。在Linux中,术语swapping用于指代paging,且Linux内核不支持老UNIX风格的整体线程和进程交换。
3.2.9 调度器

基本概念:UNIX及其衍生系统是分时系统,通过划分执行时间实现多进程同时运行。调度器是操作系统内核关键组件,负责进程在处理器和CPU间的调度,在Linux中操作对象是任务(task,即线程 ),并将其映射到CPU上。

调度原理

  • 调度器把CPU时间划分给活跃进程和线程,维护优先级机制,以便重要工作优先执行。它跟踪所有处于ready - to - run状态的线程,传统上每个优先级队列叫运行队列,现代内核为每个CPU实现队列,也可用其他数据结构跟踪线程。当待运行线程数多于可用CPU数时,低优先级线程等待。多数内核线程优先级高于用户级线程。
  • 调度器可动态修改进程优先级以优化特定工作负载性能。工作负载分为:
      • CPU密集型:如科学和数学分析程序,执行大量计算,运行时间长,受CPU资源限制。
      • I/O密集型:如Web服务器、文件服务器、交互shell,执行I/O操作多,计算少,需低延时响应,负载增加时受存储I/O或网络资源限制。
  • 调度器识别CPU密集型进程并降低其优先级,让I/O密集型负载优先运行,通过计算进程最近在CPU上执行时间与真实时间比例,选择比例低的进程降低优先级,可优化性能。
  • 现代内核调度特点:现代内核支持多类别调度,采用不同算法管理优先级和可运行线程,包括实时调度类别(优先级高于非关键工作 ),还支持抢占(后续会详述 ),实时调度类别为系统提供低延时调度。 关于内核调度详细内容可参考第6章。

3.2.10 文件系统
  • 文件系统定义与作用:文件系统是文件和目录的数据组织形式,通常基于POSIX标准的接口访问。内核可支持多种文件系统类型和实例,提供文件系统支持是操作系统重要功能之一 。
  • 文件系统结构:操作系统提供以根目录(“/” )为起点的全局文件命名空间,呈自上而下拓扑结构。通过挂载(mounting)可添加文件系统分支到挂载点,用户遍历文件命名空间时无需考虑底层文件系统类型。顶层目录有不同用途,如etc放系统配置文件,usr是系统提供的用户级程序和库,dev是设备文件,var包括系统日志等文件,tmp是零时文件,home是用户主目录 。

  • 文件系统存储:多数文件系统用磁盘等存储设备存放内容,部分如/proc和/dev由内核动态生成。
  • 虚拟文件系统(VFS)
    • 起源与目的:VFS是对文件系统类型做抽象的内核界面,由Sun Microsystems公司提出,初衷是让UNIX文件系统(UFS)和NFS更易共存。
    • 作用:使内核添加新文件系统更简便,支持全局文件命名空间,让用户程序和应用程序能透明访问各类文件系统。
  • I/O栈:基于存储设备的文件系统,从用户级软件到存储设备的路径称为I/O栈,是软件栈的子集 。第8章将详细介绍文件系统及其性能,第9章介绍相关存储设备内容。

3.2.11 缓存
  • 缓存目的:因磁盘I/O延时较长,软件栈的很多层级通过缓存读取和缓存写入来避免这种情况。
  • 缓存类型及实例
    • 应用程序缓存:无具体实例列举。
    • 服务器缓存:如Apache缓存。
    • 缓存服务器:例如memcached。
    • 数据库缓存:像MySQL缓冲区高速缓存。
    • 目录缓存:如DNSLC。
    • 文件元数据缓存:inode缓存。
    • 操作系统缓冲区高速缓存:如segvn 。
    • 文件系统主缓存:ZFS ARC 。
    • 文件系统次缓存:ZFS L2ARC 。
    • 设备缓存:ZFS vdev 。
    • 块缓存:缓冲区高速缓存,是主存的一块区域,用于存放最近使用的磁盘块,若请求的磁盘块在其中,可避免高延时的磁盘I/O 。
    • 磁盘控制器缓存:如RAID卡缓存。
    • 存储阵列缓存:无具体实例。
    • 磁盘内置缓存:无具体实例。
  • 缓存特点:基于不同的系统和环境,缓存的类型会有较大差异。
3.2.12 网络
  • 网络协议:现代内核提供内置网络协议,使系统能通过网络通信,融入分布式系统环境,典型的是TCP/IP栈,涵盖TCP和IP协议,用户级应用程序通过套接字进行网络端点通信。
  • 网络接口:连接网络的物理设备是网络接口卡(NIC),系统管理员需将IP地址关联到网络接口才能实现网络通信。
  • 协议变化:网络协议基本结构相对稳定,但协议增强和选项会改变,如TCP新选项、新的TCP阻塞控制算法等,这些变化及对不同网络接口卡的支持都依赖内核。关于网络和网络性能更多内容参考第10章。
3.2.13 设备驱动
  • 功能作用:内核需与各种物理设备通信,通过设备驱动实现,设备驱动是用于设备管理和设备I/O的内核软件,常由硬件设备厂商提供,部分内核支持“可插拔”设备驱动,无需系统重启就能装卸设备驱动。
  • 设备类型
    • 字符设备:提供无缓冲的设备顺序访问,访问尺寸依设备而定,如键盘、串行口、纸带和打印机等,是最早UNIX就有的设备类型。
    • 块设备:以块为单位访问,块的偏移值可随机访问,偏移值在设备头部从0开始计数,最早UNIX的块设备接口还为设备缓冲区提供缓存(缓冲区高速缓存 )以提升性能。
3.2.14 多处理器
  • 对称多处理结构(SMP):支持多处理器让操作系统能用多个CPU并行工作,常实现为SMP,所有CPU平等对待,但实现时因并行线程间共享内存和CPU会遇到调度、线程同步及内存访问架构等问题,相关细节参考第6、7章 。
  • CPU交叉调用:多处理器系统中会出现CPU需协调情况,如内存翻译条目缓存一致性失效时,CPU可通过交叉调用请求其他CPU执行工作,交叉调用设计为快速执行的处理器中断,以减少对其他线程的影响,抢占也可使用交叉调用。
3.2.15 抢占
  • 概念及作用:支持内核抢占使高优先级用户级线程可中断内核执行,让实时系统成为可能,这类系统对响应时间要求严格。完全可抢占内核支持抢占,但仍有少量关键代码路径不能中断 。
  • Linux的做法:Linux通过自愿内核抢占实现,在内核代码逻辑停止点进行检查并执行抢占,避免完全抢占式内核复杂性,为常见工作负载提供低延时抢占。
3.2.16 资源管理
  • 管理方式:操作系统提供可配置控制,用于精细管理CPU、内存、磁盘、网络等系统资源,可针对不同应用程序或用户环境设定资源使用限制,或采用灵活方法共享剩余资源 。
  • 不同系统情况
    • UNIX和BSD:早期版本基于每个进程进行资源控制,如用nice(1)调整CPU优先级,ulimit(1)做资源限定。
    • Solaris:从Solaris 9(2002 )起提供先进资源管理,文档见resources_controls(5)的Man手册。
    • Linux:开发了控制组(control groups, cgroups )并整合进2.6.24(2008 )版本,相关记录在Documentation/cgroups中,后续章节会讲述具体资源控制,第11章有管理OS虚拟化租户性能用例。
3.2.17 观测性
  • 观测工具构成:操作系统由内核、库和程序组成,其中包含观测系统活动和性能分析的工具,通常安装在/usr/bin和/usr/sbin目录下 。
  • 工具来源:用户可安装第三方工具增加观测手段,关于观测工具及基于操作系统组件构建的观测工具将在下一章介绍。

3.3 内核

  • 概述:本节介绍基于Solaris系统的内核和Linux的内核,涉及其历史、特点,以性能为重点探讨差异,UNIX作为背景知识也会介绍。现代内核在文件系统、观测框架、系统调用界面、网络栈架构、实时支持、I/O调度等方面存在区别。通过对比近期内核版本及系统调用数目(Linux系统调用数目呈增加趋势,Solaris呈减少趋势 )可看出差异。
3.3.1 UNIX
  • 起源:由Ken Thompson、Dennis Ritchie等人于1969年及之后在AT&T贝尔实验室开发。开发人员基于Multics操作系统,打造轻量多任务操作系统和内核,命名自UNICS 。
  • 内核特点:内核代码不能因用户喜好替换,做事方法是所有方法的最小公约数。早期内核小,但提供高性能功能,如进程有调度优先级,磁盘I/O用大磁盘块,支持多任务处理。后为支持网络等功能,内核不断增长,衍生出BSD、SunOS(Solaris )、Linux等 。
3.3.2 基于Solaris
  • 内核渊源:Solaris内核衍生自UNIX,部分代码直接来自最初UNIX内核,始于Sun Microsystems公司1982年的SunOS,基于BSD,后发展出SunOS 5.0(即Solaris 2.0 )等 。
  • 与性能相关开发
    • 文件与存储相关
      • NFS:允许文件通过网络共享并挂载,版本3和4有性能提升。
      • VFS:抽象界面让多种文件系统共存,便于NFS和UFS共存。
      • 页缓存(ZFS ARC ):缓存虚拟内存页,多数操作系统文件系统缓存首选。
      • 内存映射文件:减少文件I/O开销,重写虚拟内存时引入。
    • 通信相关
      • RPC:远程过程调用接口。
      • NIS:网络信息服务,用于网络共享信息,现渐被LDAP取代。
      • CacheFS:缓存文件系统,提升NFS服务器性能,后因NFS性能提升不再广泛使用。
    • 内核特性相关
      • 完全抢占内核:保证高优先级工作低延时。
      • 调度器:多个调度器级别可调整不同类型工作负载性能,如分时、交互、实时等。
      • 多处理器支持:20世纪90年代投入多处理器操作研究,开发出ASMP和SMP 。
      • slab分配器:替代buddy分配器,让每个CPU缓存预分配缓冲区,提高性能。
      • crash分析:成熟内核crash dump分析框架,含modular debugger 。
      • M:N线程调度:实现线程和进程间对象,用于高效调度线程,后相关实现有变化但术语和数据结构部分保留。
    • 网络相关
      • STREAMS网络栈:搭建在AT&T STREAMS接口上的TCP/IP网络栈,后多数管道在Solaris 10前被移除。
      • 64位支持:Solaris 7内核提供对64位处理器支持。
      • 锁统计:Solaris 7引入锁性能统计。
      • MPSS:支持多种页面尺寸,提升内存操作效率。
      • MPO:内存位置优化,提高内存访问性能。
      • FireEngine:增强Solaris 10高性能TCP/IP栈,提升本地性能、分散CPU负载。
      • DTrace:动态跟踪框架,可观测软件栈,已移植到其他操作系统。
      • Zones:虚拟化技术,创建共享主内核操作系统实例,类似FreeBSD的jails 。
      • Crossbow:提供高性能虚拟网络接口和网络带宽资源控制。
      • ZFS:高性能企业级文件系统,开源,成为许多文件服务器基础文件系统 。
  • 开源情况:Sun于2005年以OpenSolaris项目开源Solaris,2010年Oracle收购Sun后代码更新发布停止,OpenSolaris最后版本是Solaris 11开发版镜像,基于illumos内核的操作系统如Joyent公司的SmartOS在书中相关例子有应用。
3.3.3 基于Linux
  • 起源:1991年由Linus Torvalds开发,是针对英特尔个人电脑的免费、自由操作系统。项目灵感部分源于MINIX(针对小型计算机的小型UNIX版本 ),当时BSD试图提供免费UNIX版本存在法律问题 。
  • 开发借鉴思路
    • Unix(和Multics):借鉴操作系统层级、系统调用、多任务处理、进程相关属性、虚拟内存、全局文件系统、文件系统权限、设备文件、缓冲区高速缓存等。
    • BSD:参考换页虚拟内存、按需换页、快文件系统(FFS)、TCP/IP网络栈、套接字。
    • Solaris:引入VFS、NFS、页缓存、统一页缓存、slab分配器,以及在进程中使用ZFS和DTrace 。
    • Plan 9:采用资源forks(rfork),为进程间和线程(任务 )间共享设置不同级别。
  • 与性能相关功能
    • CPU调度:开发多种先进调度算法,如调度域(2.6.7 ),利于非一致存储访问架构(NUMA)决策。
    • I/O调度:有不同块I/O调度算法,如deadline(2.5.39 )、anticipatory(2.5.75 )、完全公平队列(CFQ )(2.6.6 ) 。
    • TCP增强:支持新TCP拥塞算法,可按需选择。
    • 内存管理:Overcommit机制含out-of-memory(OOM)killer;Futex(2.5.7 )提供高性能用户级同步原语;巨型页(2.5.36 )由内核和内存管理单元支持大型内存预分配 。
    • 性能分析工具:Oprofile(2.5.43 )用于研究CPU使用等;RCU(2.5.43 )提供只读更新同步机制;epoll(2.5.46 )高效处理文件描述符I/O等待 。
    • I/O调度扩展:模块I/O调度(2.6.10 )提供可插拔调度算法 。
    • 调试工具:DebugFS(2.6.11 )提供内核性能数据接口 。
    • 进程管理:Cpusets(2.6.12 )将进程独占CPU分组;自愿内核抢占(2.6.13 )实现低延时调度 。
    • 文件系统与I/O监控:inotify(2.6.13 )监控文件系统事件;blktrace(2.6.17 )跟踪块I/O事件 。
    • 数据传输:splice(2.6.17 )在文件描述符和管道间快速移动数据,不经过用户空间 。
    • 统计监测:延时审计(2.6.18 )跟踪任务延时状态;IO统计(2.6.20 )测量进程存储I/O统计 。
    • 节能机制:DynTicks(2.6.21 )实现动态tick,节省CPU资源和电力 。
    • 内存分配:SLUB(2.6.22 )是新的slab内存分配器简化版本 。
    • 调度算法:CFS(2.6.23 )为完全公平调度算法 。
    • 资源控制:cgroups(2.6.24 )测量并限制进程组资源使用 。
    • 延时观测:latencytop(2.6.25 )观察操作系统延时来源 。
    • 内核跟踪:Tracepoints(2.6.28 )作为静态内核跟踪点,用于跟踪工具 。
    • 性能工具:perf(2.6.31 )是性能观测工具,涵盖CPU性能计数器剖析等 。
    • 内存优化:透明巨型页(2.6.38 )简化巨型内存页面使用 。
    • 动态跟踪:Uprobes(3.5 )是用户级软件动态跟踪基础设施 。
    • 虚拟化:KVM(基于内核的虚拟机 )由Qumranet公司为Linux开发(后被Red Hat收购 ),可创建虚拟操作系统实例并运行虚拟机内核 。部分功能如epoll和KVM已移植或重新实现在基于Solaris的系统上 。Linux因广泛设备驱动支持,推动其他操作系统开源 。
3.3.4 差异
  • 内核差异概述:Linux和基于Solaris的内核虽都是UNIX后代且有相同操作系统理念,但存在诸多差异,难以简洁概括。
  • 差异具体表现
    • 系统优势来源:Linux优势多来自内核和操作系统本身,如对应用程序包、设备驱动的支持,且多数基于Linux的系统是开源的;基于Solaris的系统优势源于应用程序包(如ZFS作为企业级文件系统、DTrace作为强大观测工具 ),多数基于Solaris的系统也是开源的(Oracle Solaris除外 ),但驱动支持不如Linux广泛 。
    • 观测工具差异:基于Solaris的系统在性能观测工具方面有优势,如ZFS和DTrace,且较为成熟可用,DTrace自2003年移植到Linux后,相关框架未默认安装或广泛启用 。
    • 性能优化差异:两个内核在性能优化上有许多细微不同,如POSIX的fadvise()调用在Linux中实现,应用程序可用其告知内核不缓存与文件描述符相关数据,提高Linux内核缓存效率和性能,而基于Solaris的系统中没有(但可能后续修正 )。
  • 差异对性能影响:两个系统性能因工作负载会有小差异,最大差异在于性能观测工具(特别是动态跟踪支持 ),若一个内核的观测工具能带来大幅性能提升,之前较小的性能差异就相对不那么重要了,后续章节将介绍观测工具。

相关文章:

  • AI时代,学习力进化指南:如何成为知识的主人?
  • Java(网络编程)
  • unittest 和 pytest 框架
  • 浅谈软件开发工作流
  • Vue3 Router 使用指南:从基础到高级用法
  • openEuler虚拟机中容器化部署
  • springboot+mybatis面试题
  • CQF预备知识:Python相关库 -- 插值过渡指南 scipy.interpolate
  • 接口测试常用工具及测试方法(基础篇)
  • [SKE]CPU 与 GPU 之间数据加密传输的认证与异常处理
  • 触觉智能RK3576核心板工业应用之软硬件全国产化,成功适配开源鸿蒙OpenHarmony5.0
  • aws s3 sdk c++使用指南、适配阿里云oss和aws
  • OCCT 中 BRepBuilderAPI_MakePolygon与BRepBuilderAPI_MakeWire
  • 5种常见的网络保密通信协议
  • 如何从 Ansys SpaceClaim 模型中提取 CAD 数据,该模型是在我计算机上安装的未来版本中创建的?
  • 亚马逊云服务器配置推荐
  • SMB协议在Windows内网中的核心地位
  • 华为:eSight网管平台使用snmp纳管交换机
  • React---Hooks深入
  • Shell 脚本:系统管理与任务自动化的利器
  • 永城做网站/广告文案
  • ppt的免费网站/搜索引擎调词平台
  • 公司网站现状/北京百度关键词排名
  • 通过云主机建设网站/友链互换平台推荐
  • 重庆网站建设安全/百度新版本更新下载
  • 资深网站/seo基础教程视频