Spooling
Spooling
:假脱机技术,虚拟设备技术。
- 一种关于慢速字符设备如何与计算机主机交换信息的技术。
- 利用高速共享设备将低速的独享设备模拟成高速的共享设备。
- 逻辑上,系统为每个用户都分配了一台独立的高速独享设备。
- 在输入、输出之间增加了排队转储环节
--
输入井、输出井 -
Spooling
负责输入井和输出井与低速设备之间的调度 - 逻辑上,进程直接与高速设备交互,减少了进程的等待时间
线程同步
两个线程的指令是交叉执行的,在访问同一份临界资源时,就可能造成线程同步问题。
互斥量:互斥锁,保证两个线程访问临界资源的关键指令先后执行,也即是原子性
- 最简单的线程同步方法,会阻塞线程
- 处于两个状态之一的变量:解锁、加锁
- 两个状态可以保证资源访问的串行
自旋锁
自旋锁也是一种多线程同步的变量,工作原理与互斥量相同,对临界资源加锁、解锁。
- 使用自旋锁的线程会反复检查锁变量是否可用
- 自旋锁不会让出CPU,是一种忙等待状态
- 自旋锁本质上是死循环等待锁被释放
与互斥量相比的优点:
- 自旋锁避免了进程或线程上下文切换的开销
- 操作系统内部很多地方使用了自旋锁
- 自旋锁不适合在单核CPU上使用
读写锁:基于临界资源的考量,对锁做出的改进。
临界资源多读少写,读取时并不会改变临界资源的值。由此,是否存在效率更高的同步方法呢?-- 读写锁
- 读写锁是一种特殊的自旋锁,允许多个读者同时访问资源以提高读性能,但对写操作仍然是互斥的。
- 对读操作的指令加/解读锁,对写操作的指令加/解写锁
条件变量
- 条件变量是一种相对复杂的线程同步方法,使用场景更加灵活
- 条件变量允许线程睡眠
-- wait
,直到满足某种条件 - 当满足条件时,可以向该线程发送唤醒信号
-- signal/notify
进程同步
进程与线程.jpg由于操作系统的进程管理,进程 间的内存空间是相互独立的。
进程默认不能访问进程空间之外的内存空间。
共享内存
共享内存是操作系统提供的一种实现进程同步的重要方法,也是高性能后台开发中最常用的进程同步方式。
- 共享存储允许不相关的进程访问同一片物理内存。
- 共享内存是两个进程之间共享和传递数据最快的方式。
- 共享内存并未提供同步机制,需要借助其他机制管理访问。
使用步骤:申请共享内存 -> 连接到进程空间 -> 使用共享内存 -> 脱离进程空间并删除
Unix域套接字
- 域套接字是一种高级的进程间通信的方法,可用于同一机器进程间的通信。
套接字(socket)
原是网络通信中使用的术语,Unix系统提供的域套接字提供了网络套接字类似的功能。
- Unix域套接字不需要额外的机制管理进程同步问题。
- 在部署
Nginx、uWSGI ...
等服务时,都会使用到Unix域套接字。
将两个进程分别命名为客户端、服务端,通过域套接字进行通信
客户端进程 <-- [域套接字] --> 服务端进程
- 提供了单机简单可靠的进程通信同步服务
- 只能在单机使用,不能跨机器使用。跨机器时需要使用网络套接字。
线程池
线程池是存放多个线程的容器;
CPU调度线程执行后不会销毁线程,而是放回线程池重复利用。
使用线程池的目的:
- 线程是稀缺资源,不应该被频繁的创建和销毁;
- 架构解耦,线程创建和业务处理解耦,更加优雅;
- 线程池是使用线程的最佳实践。
阿里的Java手册中强制要求使用线程池。
网友评论