2024全新版 操作系统入门与实践-参透技术本质
操作系统(Operating System,简称OS)是计算机系统中的核心软件,它管理计算机硬件资源,提供程序运行的环境,并作为用户与计算机硬件之间的接口。操作系统的主要目标是提高计算效率,简化用户操作,并使计算机系统的使用更加方便和高效。
操作系统的主要功能
- 进程管理:操作系统负责创建、调度和管理进程,以及处理进程间的同步与通信。
- 内存管理:操作系统负责分配和管理内存资源,确保每个程序都有足够的内存空间运行,同时提高内存的使用效率。
- 文件系统管理:操作系统提供文件管理功能,包括文件的创建、删除、读取、写入和权限控制等。
- 设备管理:操作系统负责管理所有的输入输出设备,如键盘、鼠标、显示器、打印机等,通过设备驱动程序与硬件进行交互。
- 用户界面:操作系统提供用户界面,可以是命令行界面(CLI)或图形用户界面(GUI),以便用户与计算机系统交互。
操作系统的类型
- 批处理系统:早期的操作系统,用户提交一批作业,系统依次处理。
- 分时系统:允许多个用户同时使用计算机资源,系统在用户之间快速切换。
- 实时系统:能够及时响应外部事件的系统,分为硬实时和软实时。
- 个人操作系统:为个人计算机设计,如Windows、macOS。
- 网络操作系统:支持网络计算环境,如UNIX、Linux。
- 分布式操作系统:管理分布在不同地理位置的计算机资源,如Google的Android。
操作系统入门与实践-参透技术本质 - 锁是如何实现
锁(Lock)是一种同步机制,用于控制对共享资源的并发访问,以防止多个线程或进程同时修改同一资源,从而避免数据不一致和竞争条件。锁的实现方式有多种,下面介绍几种常见的锁及其实现原理:
1. 互斥锁(Mutex)
互斥锁是最基本的锁类型,确保同一时间只有一个线程可以访问共享资源。互斥锁的实现通常依赖于原子操作和操作系统提供的同步原语。
实现原理:
- 当线程想要访问共享资源时,它首先尝试获取锁。
- 如果锁是可用的(即没有其他线程持有锁),该线程就会成功获取锁,并继续执行。
- 如果锁已被其他线程占用,请求锁的线程将被阻塞,直到锁被释放。
- 当持有锁的线程完成对共享资源的访问后,它会释放锁,允许其他线程获取锁并访问资源。
2. 递归锁(Recursive Lock)
递归锁是一种特殊类型的互斥锁,允许同一个线程多次获取同一个锁。这在递归函数或可重入代码块中非常有用。
实现原理:
- 递归锁内部维护一个计数器,记录锁被当前线程获取的次数。
- 当线程第一次获取锁时,计数器增加。
- 每次线程再次获取同一个锁时,计数器再次增加。
- 当线程释放锁时,计数器减少。只有当计数器归零时,锁才真正被释放,其他线程才有机会获取锁。
3. 读写锁(Read-Write Lock)
读写锁允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁在读多写少的场景下提高了性能。
实现原理:
- 读写锁维护两个独立的锁:一个用于读取(读锁),另一个用于写入(写锁)。
- 当多个线程尝试获取读锁时,它们可以同时持有读锁,但不允许获取写锁。
- 当一个线程尝试获取写锁时,它会阻塞所有等待的读锁和写锁。
- 一旦写锁被释放,等待的读锁可以按照一定的策略(如先到先服务)获取锁。
4. 自旋锁(Spinlock)
自旋锁是一种用于多核处理器上的锁,当线程尝试获取锁时,如果锁不可用,它会在一个循环中不断检查锁的状态,而不是进入睡眠状态。
实现原理:
- 自旋锁通常用于锁持有时间非常短的情况。
- 当线程尝试获取锁时,如果锁被占用,它会在一个忙等待循环(spin loop)中不断检查锁是否已释放。
- 一旦锁被释放,忙等待的线程会立即获取锁并继续执行。
- 自旋锁减少了线程上下文切换的开销,但在等待锁的过程中可能会消耗较多的CPU资源。