一、内存共享
nginx是一个多进程程序,不同进程之间进行通讯的方式有两种:信号、共享内存。
共享内存也就是创建一块内存之后,多个worker进程可以访问。
为了使用共享内存,我们引入了锁和Slab管理器的概念。
二、锁、Slab管理器
锁的存在是因为,当多个worker进程同时操作一个共享内存时,一定会存在竞争关系,所以我们使用锁来处理worker进程的竞争关系。
在nginx早期,有一种基于信号量的锁,这种锁的思想是,一旦共享内存被一个进程正在操作,其他进程要操作时,会先进入休眠状态,等待共享内存被操作完。
现在大多数操作系统的nginx版本中使用的自旋锁,它的设计思想是,一旦共享内存正在被一个进程访问,当其他进程在想访问该共享内存时,不会进入休眠状态,而是不停的访问查看锁的状态。所以使用自旋锁的条件是,所有使用共享内存的进程,必须快速的访问该共享内存。
一旦有第三方模块不遵循快速访问共享内存的这一标准,就有可能造成死锁或者nginx性能下降的问题。
除此之外,还有一个问题是一块共享内存是多个对象使用的,如果手动的编写分配内存,是非常繁琐的意见事情,Slab管理器就是解决这个问题的。