购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第3章
锁与系统调用

在Linux内核的内部,当需要进行资源互斥访问的时候,在大部分情况下都需要加锁,以保证对目标资源没有并发的操作。但是,现代SMP(Symmetrical Multi-Processing,对称多处理)非常常见,尤其是在服务器上,并发操作已然成为制约整个系统性能的最主要原因。Linux内核内部的锁技术也经历了从一个内核大锁到不断完善的各种类型锁的实现过程。

整个内核对外是通过系统调用提供服务的,所有的系统调用都允许并发陷入(brk系统调用是特例)。但是,在系统调用的内部,并不保证所有的路径都没有锁,而大部分的系统调用路径都需要或多或少地进行资源锁的操作,这就给整个Linux系统的性能带来了不确定的影响。

一个很特殊的系统调用是futex,这个系统调用是用户端大部分锁实现的内核基础。因为锁一般在无法获得资源时进行阻塞等待,当能获得资源的时候继续执行。而阻塞等待和继续执行是在调度层面才有的权限,是需要陷入内核才能完成的需求。futex系统调用的主要价值就是向用户空间的进程提供在满足特定的条件下阻塞或继续执行的能力。

锁的实现大部分位于kernel/locking目录下,内核中的资源锁有基于硬件总线锁的原子操作[自旋锁(spinlock)、互斥锁(mutex)、读写锁(rwlock)、顺序锁(seqlock)、RCU锁、信号量]和对文件内容进行保护的文件锁。 0zGnkPj3QUgmxQhCXmAWyUbO7KqT7V1KiTXkD+moZbz+0QM3lz6vuDeSQleMcSA9

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开