Nginx源代码分析—进程间通信机制

从nginx的进程模型能够知道。master进程和worker进程须要通信,nginx中通信的方式有套接字、共享内存、信号。对于master进程,从外部接受信号,master进程主要就是监控、接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是堵塞在sigsuspend()函数调用上。Worker进程屏蔽了全部的外部信号,那么Master进程就通过套接字和worker进程通信,worker进程改动全局变量,使得worker进程接受到了master进程的命令(进程间的套接字被epoll监控)。

共享内存是存放父子进程中都须要的全局变量,比方当前系统接受到的连接,正在处理的连接数目等。

既然使用了共享内存,那么就须要考虑同步,nginx中的同步使用了原子操作、文件锁、信号量(这里信号量的值为1,也就是相当于一个相互排斥锁)。虽说实现了这三种。可是对外都是使用了ngx_shmtx_t变量,这个变量成为一个相互排斥锁。使用上述三种同步方式实现了一种对外的相互排斥锁,接下来看看实现方式:

首先声明一点,在nginx中都是非堵塞的,所以在获取锁的时候也希望是非堵塞的

对于共享内存,使用shmgt &mmap(能够实现文件到内存的映射。也能够不使用文件的方式来实现映射)来实现,共享内存中存放的变量有已经建立成功的TCP连接数、已经处理过的TCP连接数等共6类。共享内存的初始化在Main中实现。共享内存中数据的初始化在ngx_event_module_init函数中实现

上述几种锁的属性设计到堵塞&非堵塞 导致睡眠&不导致睡眠,至于堵塞和非堵塞就是看是否能立即得到调用的结果,依据前提条件选择不同的锁,比方这里用原子操作实现的自旋锁就是堵塞锁。就是假设没有获取锁,那么就连续不断的尝试一段时间,假设是想占有一个被短时间占用的资源的话。能够使用这样的堵塞锁,,假设占用的时间过长,不适合使用堵塞锁,会占用过多的CPU资源。睡眠锁就是在获取锁不成功会导致进程睡眠。缺点是一旦睡眠须要还有一个进程来唤醒,逻辑复杂同一时候CPU的切换消耗时间。

用户能够从锁的使用时间长短角度来选择使用哪一种锁,当锁的使用时间非常短,可使用自旋锁。假设锁使用时间长,使用睡眠锁。堵塞锁就是在一段时间上不停的获取锁直到锁获取成功。

信号量和文件锁都是睡眠锁,信号量使用的sem_wait,文件锁使用fcntl(),只是在死啊用的时候要么成功。要么睡眠。

信号量sem_init能够用于线程间也能够用于进程间。实现相互排斥锁的方法:信号量为0。嗲用sem_post加1。不会有堵塞,调用sem_wait将信号量间1,假设信号量不大于0。就堵塞当前进程(进程进入睡眠),直到其它进程将信号量的值为正数后,这时才干继续通过信号量减1而使得当前进程继续进行。Sem_post解锁,sem_wait实现加锁。

对于稳健锁。ngx_trylock_fd实现不会堵塞,不会使得进程睡眠的相互排斥锁,ngx_lock_fd提供的相互排斥锁在锁已经被的进程拿到时将会导致当前进程进入睡眠状态。

基于原子操作,信号量文件锁。Ngxin封装了一个相互排斥锁。

原子变量锁优先级高于文件锁。

假设不支持原子操作。会使用文件锁实现ngx_shmtx_t相互排斥锁,使用文件锁来提供堵塞、非堵塞的相互排斥锁。

支持原子操作却不支持信号量

支持原子操作的同一时候。操作系统也支持信号量

后两种的差别在于,支持信号量仅仅会影响进程ngx_shmtx_lock方法持有锁的方式,不支持信号量时,和自旋锁一样,支持信号量。自旋锁在堵塞一段时间后没有获取锁,那么信号量导致进程进入睡眠状态,仅仅有等到别的进程释放这个锁才会被激活

在不使用信号量时,nginx相互排斥锁和自旋锁相似,而在使用信号量后将会使用可能让进程进入睡眠,不建议使用带信号量的ngx_shmtx_lock取锁方法。

事实上做了这么多的封装也是为了系统可移植

nginx源代码分析--进程间通信机制 & 同步机制的更多相关文章

  1. MySQL系列:innodb源代码分析之线程并发同步机制

    innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ...

  2. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  3. 新秀nginx源代码分析数据结构篇(两) 双链表ngx_queue_t

    nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn. ...

  4. Nginx源代码分析—业务流程

    Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就 ...

  5. 从源代码分析Android-Universal-Image-Loader的缓存处理机制

    讲到缓存,平时流水线上的码农一定觉得这是一个高大上的东西.看过网上各种讲缓存原理的文章,总感觉那些文章讲的就是玩具,能用吗?这次我将带你一起看过UIL这个国内外大牛都追捧的图片缓存类库的缓存处理机制. ...

  6. 分析.Net里线程同步机制

    我 们知道并行编程模型两种:一种是基于消息式的,第二种是基于共享内存式的. 前段时间项目中遇到了第二种 使用多线程开发并行程序共享资源的问题 ,今天以实际案例出发对.net里的共享内存式的线程同步机制 ...

  7. nginx源代码分析--高性能server开发 常见的流程模型

    1.高性能server 对于高性能server对于.处理速度和占用空间小是典型特性.特别是当server经验C10K问题的时候(网络server在处理数以万计的client连接时.往往出现效率低下甚至 ...

  8. 内核同步机制-RCU同步机制

    转自:https://blog.csdn.net/nevil/article/details/7718375 转自http://www.360doc.com/content/09/0805/00/36 ...

  9. nginx源代码分析之内存池实现原理

    建议看本文档时结合nginx源代码. 1.1   什么是内存池?为什么要引入内存池? 内存池实质上是接替OS进行内存管理.应用程序申请内存时不再与OS打交道.而是从内存池中申请内存或者释放内存到内存池 ...

随机推荐

  1. 跳出双重for循环的案例__________跳出当前循环(continue out)

    package com.etc.operator; public class demo { public static void main(String[] args) { // break out; ...

  2. Ionic3 环境搭建以及基础配置实现(更新中)

    GitHub:https://github.com/Teloi 环境配置输入以下命令安装 Ionic (如果刚才设置了淘宝镜像源,可以使用 cnpm 代替 npm):npm install -g io ...

  3. 【转载】linux环境下大数据网站搬家

    这里说的大数据是指你的网站数据库大小至少超过了500M,当然只有50M的网站也同样可以用这样的方法来轻松安全的实现网站搬家,前提是你使用的是linux环境下的VPS或者独立服务器. 我们假设你的网站域 ...

  4. 【PostgreSQL-9.6.3】创建、修改、删除数据库

    1.创建数据库 create database database_name; 2.修改数据库的名称 alter database database_name rename to new_databas ...

  5. 复习java基础第六天(IO)

    一:File 类 • 输入:读取外部数据(磁盘.光盘等存储设备的数据)到程序(内存)中.  • 输出:将程序(内存)数据输出到磁盘.光盘等存储设备中 • Java 的 IO 流主要包括输入.输出两种 ...

  6. AI:IPPR的模式生成-学习/训练方式(基本结构)

    前言:        一个完备的模式识别系统,必然包含一个模式识别模型,此外还要附加一个评价模型,以及为了构建识别模型而构建的学习模型,并选择在学习模型中使用的学习方法. 否则  w=w 这样,)那样 ...

  7. Luogu P1365 WJMZBMR打osu! / Easy

    概率期望专题首杀-- 毒瘤dp 首先根据数据范围推断出复杂度在O(n)左右 但不管怎么想都是n^2-- 晚上躺在床上吃东西的时候(误)想到之前有几道dp题是通过前缀和优化的 而期望的可加性又似乎为此创 ...

  8. python 字符串模糊匹配 Fuzzywuzzy

    Python提供fuzzywuzzy模块,不仅可用于计算两个字符串之间的相似度,而且还提供排序接口能从大量候选集中找到最相似的句子. (1)安装 pip install fuzzywuzzy (2)接 ...

  9. android apk的签名和权限问题

    一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      ...

  10. 国庆day2

    a[问题描述]你是能看到第一题的 friends呢.—— hja世界上没有什么比卖的这 贵弹丸三还令人绝望事了,所以便么一道题.定义