操作系统的组成
成员 | 描述 |
---|---|
内核 |
内核是操作系统的核心部分 |
外壳 |
外壳是用户与操作系统之间的交互层 |
实用工具 |
这些是操作系统自带的一些辅助程序 |
设备驱动程序 |
设备驱动程序是连接硬件设备与操作系统之间的桥梁 |
文件系统 |
文件系统用于组织 |
服务与应用程序接口 |
操作系统提供了一系列的应用程序接口 |
网络功能 |
许多现代操作系统都内置了网络功能 |
安全机制 |
安全机制包括认证 |
用户界面 |
用户界面可以是命令行界面 |
操作系统类型
桌面操作系统
桌面操作系统
💿 Microsoft Windows
微软公司开发的主流桌面操作系统
💿 macOS
苹果公司为其Mac系列计算机开发的操作系统
💿 Linux发行版: Linux是一个开源的操作系统内核, 基于它开发出了各种各样的桌面操作系统, 适合不同的用户群体和技术偏好。 一些流行的Linux桌面发行版包括:
- Ubuntu
用户友好: 适合初学者, 。 - Fedora
适合技术爱好者和开发者: 。 - Debian
稳定可靠: 适合服务器和个人使用, 。 - Mint
基于Ubuntu: 界面友好, 。 - openSUSE
适合企业级应用: 。 - Arch Linux
适合高级用户: 注重最新技术和定制化, 。
💿 Chrome OS
由Google开发的操作系统
💿 FreeBSD
一个类Unix的操作系统
💿 ReactOS
开源项目
💿 Haiku
Haiku是一个试图重现BeOS精神的开源操作系统
💿 Elementary OS
基于Ubuntu的Linux发行版
移动设备操作系统
移动设备操作系统
💿 iOS
由苹果公司
💿 Android
由Google主导开发
💿 华为鸿蒙操作系统( HarmonyOS)
由中国华为公司开发
💿 其他操作系统:
- Windows 10 Mobile
尽管微软已经停止了Windows Phone和Windows 10 Mobile的新版本开发: 但仍有一些老设备在使用此系统, 。 - KaiOS
一种基于Linux的轻量级操作系统: 用于功能手机和低端智能设备, 。 - Sailfish OS
由芬兰公司Jolla开发: 基于MeeGo, 主要用于智能手机和平板电脑, 。 - LineageOS
一个基于Android的开源操作系统: 支持多种设备, 提供了一个替代官方Android系统的选项, 。 - Ubuntu Touch
由Canonical公司开发: 基于Linux, 专为触控设备设计, 。 - webOS
最初由Palm开发: 后被惠普, HP( 收购) 最后被LG用于其智能电视产品线上, 。 - BlackBerry OS
虽然黑莓: BlackBerry( 公司已经停止了新设备的生产) 并转向了Android平台, 但旧的黑莓设备仍然使用BlackBerry OS, 。
服务器操作系统
服务器操作系统
💿 Windows Server
由微软公司开发
💿 Linux
Linux是一个开源的操作系统内核
- Red Hat Enterprise Linux (RHEL)
商业版本: 广泛用于企业级应用, 。 - CentOS Stream
一个开源的RHEL克隆版本: 。 - Ubuntu Server
基于Debian的发行版: 用户友好, 适合各种规模的企业, 。 - Debian
一个稳定的发行版: 适用于服务器环境, 。 - Fedora
适合开发者和测试环境: 。 - openSUSE Leap
适用于企业级应用: 。 - Arch Linux
适合高级用户: 注重最新技术和定制化, 。
💿 Unix
传统的Unix操作系统
- Sun Solaris
Sun Microsystems开发的Unix版本: 现归Oracle所有, 。 - IBM AIX
IBM公司的Unix版本: 适用于Power架构, 。 - HP-UX
Hewlett-Packard公司的Unix版本: 。
💿 NetWare
由Novell公司开发
💿 FreeBSD
一个类Unix操作系统
💿 OpenBSD
一个强调安全性的类Unix操作系统
💿 NetBSD
另一个类Unix操作系统
💿 ARM服务器操作系统
支持ARM架构的服务器操作系统
💿 其他
- OpenVMS
由HP开发: 用于关键业务应用, 。 - IBM z/OS
用于大型机系统: 。 - IBM z/VM
IBM的虚拟机操作系统: 用于大型主机环境, 。
嵌入式操作系统
嵌入式操作系统
💿 嵌入式Linux
- Yocto Project
一个开源项目: 用于创建定制的Linux系统, 适用于嵌入式设备, 。 - Buildroot
另一个用于创建嵌入式Linux系统的工具: 。 - Angstrom Distribution
一个轻量级的Linux发行版: 专为嵌入式设备设计, 。
💿 专用嵌入式操作系统
- Windows Embedded
微软为嵌入式设备开发的操作系统: 。 - Intewell
一种国内的嵌入式操作系统: 。 - 华为鸿蒙操作系统
HarmonyOS( ) 华为推出的一个操作系统: 支持多种设备, 包括手机, 手表、 汽车等、 具有分布式特性, 可以跨设备协同工作, 。
💿 其他嵌入式操作系统
- eCos
一个开源的嵌入式操作系统: 适用于多种微控制器, 。 - Zephyr RTOS
一个由Linux基金会支持的RTOS: 适用于资源受限的设备, 。 - RIOT (Rigorous Initiation Oriented Testing)
一个针对物联网应用的开源RTOS: 。 - Contiki
一个用于无线传感器网络的开源RTOS: 。 - FreeDOS
一个自由的DOS兼容操作系统: 可用于一些简单的嵌入式应用, 。 - NuttX
一个用于嵌入式系统的RTOS: 支持多种架构, 。 - BlackBerry QNX
用于汽车及其他嵌入式设备: 。 - Symbian
虽然不再更新: 但在某些旧设备中仍然存在, 。 - Palm OS
同样不再更新: 但在某些老款设备中可见, 。 - WebOS
最初由Palm开发: 后被惠普, HP( 收购) 现在由LG用于其智能电视产品线上, 。
分布式操作系统
分布式操作系统
💿 Unix/Linux系统
Unix系统及其衍生产品
💿 华为鸿蒙系统( HarmonyOS)
鸿蒙操作系统是华为推出的一个多终端分布式操作系统
💿 Kubernetes
虽然通常被视为容器编排工具
💿 Plan 9
Plan 9是从Unix发展出来的一个研究性质的操作系统
💿 CloudKit
Apple的CloudKit为开发人员提供了构建分布式应用的能力
💿 CTWing OS
天翼物联网分布式操作系统
💿 其他分布式系统
- 分布式数据库系统
例如Apache Cassandra: MongoDB等、 用于存储和检索分布在网络中的大量数据, 。 - 分布式文件系统
例如Google File System (GFS): Hadoop Distributed File System (HDFS)等、 用于在多台机器之间共享文件, 。 - 分布式计算框架
例如Apache Hadoop: Apache Spark等、 用于执行大规模的数据处理任务, 。 - 分布式消息队列
例如Apache Kafka: RabbitMQ等、 用于构建可靠的异步消息传递系统, 。
💿 分布式中间件
- Apache ActiveMQ
一个消息中间件: 支持多种消息协议, 。 - ZeroMQ
一个轻量级的网络消息库: 可以用来构建分布式或者并发模式的应用程序, 。
💿 分布式服务框架
- Apache Thrift
一个用于构建可扩展的服务框架的软件库: 。 - gRPC
一个高性能: 开源的通用RPC、 远程过程调用( 框架) 。
网络操作系统
网络操作系统
💿 Windows Server
微软公司推出的服务器操作系统
💿 Unix/Linux
包括各种Unix系统
💿 NetWare
Novell公司的NetWare操作系统
💿 macOS Server
苹果公司的服务器操作系统
💿 FreeBSD/Cisco IOS/Juniper Junos
FreeBSD是一个类Unix操作系统
💿 其他系统
有些操作系统虽然不是专门为网络设计
实时操作系统
实时操作系统
💿 FreeRTOS
一款免费的RTOS
💿 μC/OS-II 和 μC/OS-III
分别是第二代和第三代的实时操作系统
💿 QNX
一款商用的RTOS
💿 VxWorks
Wind River Systems开发的一款RTOS
💿 ThreadX
由Microsoft拥有的RTOS
💿 eCos
一个开源的嵌入式操作系统
💿 Zephyr RTOS
一个开源RTOS
💿 NuttX
另一个开源RTOS
💿 RIOT (Rigorous Initiation Oriented Testing)
一款开源RTOS
💿 Contiki
一个开源的RTOS
💿 国内RTOS
- 道系统
Delta OS( ) - 翼辉
Sylix OS( ) - 天脉系统
ACore OS( ) - 科东软件
Intewell OS( ) - 赛睿德
RT-Thread( )
多处理机操作系统
多处理机操作系统
💿 对称多处理系统( SMP, Symmetric Multi-Processing) :
- 在SMP系统中
所有处理器的地位平等, 共享同一块内存, 操作系统可以将任务分配给任何一个处理器执行。 。 - 示例
大多数现代桌面和服务器操作系统: 如Windows Server, Linux、 macOS、 支持SMP架构, 。
💿 非对称多处理系统( ASMP, Asymmetric Multi-Processing) :
- 在ASMP系统中
处理器之间存在主从关系, 主处理器负责调度任务给从处理器, 。 - 示例
一些嵌入式系统或特定领域的专用系统可能会采用这种架构: 。
💿 分布式共享内存系统( DSM, Distributed Shared Memory) :
- DSM系统允许多个节点通过网络共享内存空间
即使这些节点可能没有物理上共享的内存, 。 - 示例
某些高性能计算集群可能采用DSM技术: 。
💿 消息传递多处理机系统( Message-Passing Multiprocessors) :
- 在这类系统中
处理器之间不共享内存, 而是通过消息传递来进行通信, 。 - 示例
高性能计算集群: 超级计算机中常用的消息传递接口MPI、 。
💿 集群操作系统( Cluster Operating Systems) :
- 集群操作系统管理多个节点
这些节点通过网络连接, 可以作为一个整体来管理任务, 。 - 示例
Linux集群管理系统: 如Heartbeat, DRBD、 。
💿 主从式操作系统( Master-Slave OS) :
- 主从式操作系统中
有一个主处理器负责协调所有从处理器的工作, 。 - 示例
一些早期的多处理机系统: 如Cyber-170, 采用的就是这种架构, 。
💿 独立监督式操作系统( Independent Supervisor OS) :
- 每个处理机都有自己的管理程序
各自管理自己的资源, 。 - 示例
IBM的370系统就是一个例子: 。
💿 浮动监督式操作系统( Floating Supervisor OS) :
- 所有处理机都可以访问整个系统的资源
通常用于紧密耦合的对称多处理机系统, 。 - 示例
IBM 3081上的MVS/VM操作系统: 。
💿 多核操作系统:
- 现代多核处理器上的操作系统
如Linux和Windows, 支持多核架构, 并且能够优化多核环境下的任务调度, 。 - 示例
Linux内核支持多核调度: Windows Server也支持多核架构, 。
进程
进程的概念
进程可以视为一个程序执行的实体
进程的组成
- 程序代码
这是进程执行的指令集合: 。 - 数据段
存放程序的数据和全局变量: 。 - 堆
动态分配的内存区域: 通常用于存放运行时动态分配的对象, 。 - 栈
存放函数调用时的局部变量: 函数参数等临时数据、 。 - 进程控制块
PCB, Process Control Block( ) 操作系统用来存储有关进程的信息的数据结构: 包括进程ID, 状态、 优先级、 内存映射、 打开的文件等、 。
进程的状态
- 就绪状态
Ready( ) 进程已经准备好运行: 但是还没有获得CPU时间片, 。 - 执行状态
Running( ) 进程正在使用CPU执行: 。 - 阻塞状态
Blocked( ) 进程因等待某个事件: 如I/O操作完成( 而无法继续执行) 。 - 终止状态
Terminated/Zombie( ) 进程已退出: 但父进程尚未对其进行清理, 。
进程的调度
操作系统通过一定的算法来决定何时以及如何将CPU分配给各个进程
- 先来先服务
FCFS, First Come First Serve( ) - 短作业优先
SJF, Shortest Job First( ) - 优先级调度
Priority Scheduling( ) - 轮转法
RR, Round Robin( ) - 多级反馈队列
Multilevel Feedback Queue( )
进程间的通信
- 管道
Pipe( ) 一种简单的进程间通信方法: 允许数据从一个进程流向另一个进程, 。 - 消息队列
Message Queues( ) 允许进程之间发送和接收消息: 。 - 共享内存
Shared Memory( ) 多个进程可以访问同一块内存区域: 用于数据共享, 。 - 套接字
Sockets( ) 用于网络通信: 也可以用于同一机器上的进程通信, 。 - 信号
Signals( ) 一种异步通信机制: 用于通知接收进程发生了特定的情况, 。
进程管理
- 创建新进程
- 终止进程
- 获取进程状态
- 设置进程优先级
- 控制进程间通信
线程
线程的概念
线程是操作系统能够进行运算调度的最小单位
线程的优点
- 开销小
创建和销毁线程比创建和销毁进程的开销要小得多: 。 - 通信方便
由于线程共享同一进程的地址空间: 因此它们可以直接访问同一内存中的数据, 简化了进程间通信, 。 - 并发性
多线程可以实现真正的并行计算: 特别是在多核处理器环境下, 。
线程的状态
- 新建状态
New( ) 线程对象已经被创建: 但尚未启动, 。 - 就绪状态
Runnable( ) 线程已经准备好了: 等待CPU时间片来执行, 。 - 运行状态
Running( ) 线程正在使用CPU执行: 。 - 阻塞状态
Blocked( ) 线程因等待某种条件: 如等待输入输出完成( 而暂时停止执行) 。 - 死亡状态
Dead/Terminated( ) 线程已经执行完毕或因异常而终止: 。
线程的生命周期
- 创建
通过创建线程对象: 初始化线程, 。 - 启动
调用线程的启动方法: 使线程进入就绪状态, 。 - 执行
线程开始执行其任务: 。 - 阻塞
线程因某种原因暂停执行: 等待条件满足后恢复执行, 。 - 结束
线程执行完毕或因异常而终止: 。
线程的调度
操作系统使用调度算法来决定何时以及如何将CPU分配给各个线程
- 先来先服务
FCFS, First Come First Serve( ) - 轮转法
RR, Round Robin( ) - 优先级调度
Priority Scheduling( )
线程间的通信
由于线程共享同一进程的地址空间
线程间的同步
线程间同步是为了确保共享资源的正确访问
- 互斥锁
Mutex( ) 用于保护临界区: Critical Section( ) 确保一次只有一个线程可以访问共享资源, 。 - 信号量
Semaphore( ) 用于控制多个线程对资源的访问次数: 。 - 条件变量
Condition Variable( ) 用于线程间的等待和通知机制: 。 - 原子操作
Atomic Operations( ) 提供不可分割的操作: 用于更新共享数据, 。
线程的管理
- Java
通过Thread类和Runnable接口创建和管理线程: 。 - C/C++
使用POSIX线程库: pthread( 或其他第三方库) 如Boost.Thread( ) 。 - Python
使用threading模块创建和管理线程: 。
死锁
死锁是多线程或多进程编程中常见的一个问题
死锁的必要条件
⭐⭐ 死锁的发生必须同时满足以下四个条件:
- 互斥条件
Mutual Exclusion( ) 至少有一个资源必须被独占: 即一次只能被一个进程使用, 。 - 保持和等待条件
Hold and Wait( ) 一个进程已经持有一个资源: 但又尝试获取额外的资源, 而这些资源已被其他进程持有, 。 - 无抢占条件
No Preemption( ) 资源请求者不能强行从资源占有者手中抢夺资源: 资源只能由占有者主动释放, 。 - 循环等待条件
Circular Wait( ) 若干进程之间形成了一种循环等待链: 每个进程都在等待下一个进程所持有的资源, 。
死锁的示例
假设一个简单的死锁情况
有两个进程P1和P2 , 它们都需要两种资源R1和R2才能完成任务 , :
P1获得了资源R1然后尝试获得资源R2 , 。
P2获得了资源R2然后尝试获得资源R1 , 。
此时P1等待R2 , P2等待R1 , 两者都无法继续执行 , 形成了死锁 , 。
死锁的检测
⭐⭐ 为了避免死锁的发生, 可以通过以下几种方式来检测或预防死锁:
- 银行家算法
Banker’s Algorithm( ) 这是一种经典的算法: 用于检测和避免死锁, 银行家算法通过模拟资源分配。 判断系统是否处于安全状态, 。 - 资源分配图
Resource Allocation Graph( ) 使用图形表示资源和进程之间的关系: 通过检查图中是否存在环路来确定是否有死锁, 。 - 超时和重试
当请求资源时设置超时时间: 超过一定时间未获取资源则放弃请求, 从而避免无限等待, 。 - 顺序加锁
对于需要同时锁定多个资源的情况: 按照固定的顺序加锁, 这样可以避免循环等待, 。
死锁的预防
⭐⭐ 除了检测之外, 还可以采取一些措施来预防死锁的发生:
- 破坏互斥条件
尽可能让资源能够被共享使用: 而不是独占, 。 - 破坏保持和等待条件
进程在请求新的资源之前: 必须释放已占有的资源, 。 - 破坏无抢占条件
允许系统强制抢占某些资源: 从而打破死锁, 。 - 破坏循环等待条件
对资源请求进行排序: 确保不会形成循环等待, 。
死锁的避免
⭐⭐ 除了预防之外, 还可以通过算法来避免死锁:
- 银行家算法
在每次分配资源之前: 先检查系统是否处于安全状态, 只有当系统处于安全状态时才分配资源。 。 - 资源预留
在请求资源之前预留所需的资源: 确保一次性获得所需的所有资源, 。
死锁的解除
⭐⭐ 一旦检测到死锁, 可以通过以下几种方式来解除:
- 撤销进程
终止一个或多个死锁进程: 释放资源, 。 - 回滚进程
将进程状态回滚到一个之前的安全点: 再次尝试获取资源, 。 - 优先级继承
如果一个低优先级进程持有另一个高优先级进程所需要的资源: 那么低优先级进程将继承高优先级进程的优先级, 。
注意事项
- 尽量减少锁的使用
尽可能使用无锁编程技术: 如原子操作, CAS操作等、 。 - 锁粒度的选择
合理选择锁的粒度: 过大可能导致争用, 过小可能导致过多的开销, 。 - 锁的顺序
如果有多个锁需要获取: 应按照固定的顺序获取, 以避免循环等待, 。 - 使用高级同步工具
利用高级的同步工具如Semaphore: Condition、 Future等、 它们提供了更丰富的功能来帮助避免死锁, 。
内存管理
内存管理是操作系统中的一个重要组成部分
内存管理的基本概念
⭐⭐ 物理内存( Physical Memory) :
计算机硬件中的RAM
⭐⭐ 虚拟内存( Virtual Memory) :
通过地址映射技术
内存管理的主要目标
- 内存分配
Memory Allocation( ) 为进程分配足够的内存空间: 。 - 内存保护
Memory Protection( ) 防止一个进程访问不属于它的内存区域: 。 - 内存共享
Memory Sharing( ) 允许多个进程共享相同的内存区域: 例如共享库, 。 - 内存回收
Garbage Collection( ) 自动回收不再使用的内存: 。
内存管理的技术
地址映射技术
- 连续分配
Contiguous Allocation( ) 每个进程在内存中占据一块连续的空间: 这种方法简单但容易导致内存碎片。 。 - 分页
Paging( ) 将内存划分为固定大小的页面: 每个页面可以独立地映射到虚拟地址空间中的页框, 这种方法可以有效减少内存碎片。 提高内存利用率, 。 - 分段
Segmentation( ) 将内存划分为逻辑段: 每段对应进程中的一个逻辑部分, 如代码段( 数据段、 ) 这种方法便于实现内存保护和共享。 。 - 段页式
Segmentation with Paging( ) 结合了分页和分段的优点: 每个段内部再分成页, 既实现了逻辑上的分段又减少了内存碎片, 。
内存分配算法
- 首次适应算法
First Fit( ) 从头开始搜索空闲列表: 找到第一个足够大的空闲块, 。 - 最佳适应算法
Best Fit( ) 遍历空闲列表: 找到最接近所需大小的空闲块, 。 - 最差适应算法
Worst Fit( ) 遍历空闲列表: 找到最大的空闲块, 。
内存置换算法
- 最近最少使用
LRU, Least Recently Used( ) 置换最近最少使用的页面: 。 - 先进先出
FIFO, First In First Out( ) 置换最早进入内存的页面: 。 - 最优置换算法
Optimal Replacement( ) 理论上最好的置换算法: 但它需要未来访问信息, 因此在实际中难以实现, 。
内存管理的实现
操作系统层面
- 内存映射
Memory Mapping( ) 操作系统维护一张虚拟地址到物理地址的映射表: 使得进程可以在虚拟地址空间中操作内存, 。 - 页面调度
Page Scheduling( ) 管理页面在物理内存和交换分区之间的迁移: 。 - 内存保护机制
通过对内存区域设置权限: 读( 写、 执行、 ) 防止非法访问, 。
编程语言层面
- 手动管理
开发者需要显式地分配和释放内存: 如C/C++中的malloc()和free(), 。 - 自动管理
一些高级语言: 如Java( Python、 提供了垃圾回收机制) 自动回收不再使用的内存, 。
内存管理的挑战
- 内存碎片
长期使用后: 内存中可能会出现大量的小块空闲空间, 使得无法分配大块的连续内存, 。 - 性能瓶颈
频繁的内存分配和回收会影响程序的性能: 。 - 内存泄漏
忘记释放不再使用的内存: 导致可用内存逐渐减少, 。
内存管理的最佳实践
- 避免内存碎片
使用分页或分段技术来减少碎片: 。 - 及时释放内存
在不再需要内存时立即释放: 避免内存泄漏, 。 - 合理分配内存
根据实际情况选择合适的内存分配算法: 。 - 使用内存池
对于频繁分配和释放的小对象: 可以使用内存池技术来提高性能, 。 - 内存泄漏检测
定期检查程序中的内存泄漏问题: 并及时修复, 。
局部性原理
局部性原理
局部性原理的分类
- 时间局部性
Temporal Locality( ) : - 如果一个项目被引用
则在不久的将来很可能再次被引用, 。 - 例如
程序中的循环结构常常会反复访问相同的数据, 这就是时间局部性的体现, 。
- 如果一个项目被引用
- 空间局部性
Spatial Locality( ) : - 如果一个项目被引用
则在不久的将来很可能访问其附近的其他项目, 。 - 例如
在数组遍历过程中, 程序往往会连续访问数组中的元素, 这体现了空间局部性, 。
- 如果一个项目被引用
局部性原理的应用
缓存设计
- CPU缓存
Cache( ) CPU缓存是位于CPU内部或非常靠近CPU的高速存储器: 用于存储最近经常访问的数据或指令, 通过利用时间局部性。 CPU缓存可以显著减少访问主内存的次数, 从而提高性能, 。 - 磁盘缓存
在磁盘读写过程中: 操作系统通常会缓存最近读取或写入的数据块, 利用空间局部性来减少磁盘访问的次数, 。 - Web缓存
在互联网中: Web缓存服务器会存储最近请求的网页内容, 利用时间局部性来减少对外部服务器的请求, 。
虚拟内存管理
- 分页机制
Paging( ) 在分页机制下: 操作系统将内存划分为固定大小的页面, 通过预测程序的访问模式。 操作系统可以提前将可能需要访问的页面加载到物理内存中, 从而提高性能, 。 - 页面置换算法
Page Replacement Algorithms( ) 在物理内存不足时: 操作系统需要决定哪些页面可以从物理内存中替换出去, 基于局部性原理。 操作系统会选择那些最近未被访问过的页面进行置换, 。
数据结构和算法
- 数组遍历
在遍历数组时: 数据通常是连续存储的, 因此可以充分利用空间局部性来提高访问速度, 。 - 哈希表
哈希表通过哈希函数将键映射到特定的位置: 这有助于利用空间局部性来快速查找数据, 。
局部性原理的优化技术
- 预取
Prefetching( ) 系统预测将来可能需要的数据: 并提前将其加载到缓存中, 预取技术广泛应用于CPU缓存。 磁盘缓存等领域、 。 - 缓存一致性
Cache Coherence( ) 在多处理器系统中: 保证各缓存之间数据的一致性, 避免数据冲突, 。 - 缓存替换策略
Cache Replacement Policies( ) 如LRU: 最近最少使用( ) LFU、 最不经常使用( 等算法) 用于决定何时替换缓存中的数据, 。
局部性原理的局限性
- 冷启动问题
Cold Start Problem( ) 初次启动时: 缓存可能为空, 此时局部性原理的优势无法发挥, 。 - 伪局部性
False Locality( ) 如果程序的访问模式不符合局部性原理: 例如随机访问模式, 那么基于局部性的优化可能会失效, 。 - 数据稀疏性
Data Sparsity( ) 在某些应用中: 数据分布非常稀疏, 导致空间局部性较弱, 缓存效果不佳, 。
学习资源
- 视频
清华操作系统原理《 》 https://www.bilibili.com/video/BV1uW411f72n:
- 书籍
编码《 》 30天自制操作系统《 》 现代操作系统《 》 难度较大( 不推荐新手看, ) 深入理解计算机系统《 》 难度较大( 不推荐新手看, ) 自己动手写操作系统《 》 国产好书( 网上可以下载, )
- 大学课件