惊群现象 -- 3




nginx 的互斥锁nginx 自己实现了互斥锁,这样做的目的主要是为了兼容性,在不支持锁甚至不支持原子操作的环境下实现锁操作 nginx 锁结构ngx_accept_mutex 是一个 ngx_shmtx_t 结构体,ngx_shmtx_t 描述了 nginx 的锁结构// struct ngx_shmtx_t // nginx 锁结构 {{{ typedef struct { #if (NGX_HAVE_ATOMIC_OPS) // 是否支持原子操作 ngx_atomic_t *lock; #if (NGX_HAVE_POSIX_SEM) // 是否支持信号量 ngx_atomic_t *wait; ngx_uint_t semaphore; sem_t sem; #endif #else // 不支持原子操作则使用文件操作 ngx_fd_t fd; u_char *name; #endif ngx_uint_t spin; // 自旋锁标识 } ngx_shmtx_t; // }}}  nginx 使用这个结构实现了&n
#技术帖    #龙潭书斋    #fcntl    #进程   
事件驱动函数 ngx_process_events_and_timers初始化流程结束后,设置进程名为 nginx: worker process 后就进入主循环在进入主循环之前,如果 nginx 是以线程模式启动的,则首先会进行线程初始化,这里我们不做讲解,后续讲解线程模式 nginx 的时候我们再重新会看这里的代码 // void ngx_process_events_and_timers(ngx_cycle_t *cycle) // 事件驱动函数 {{{ void ngx_process_events_and_timers(ngx_cycle_t *cycle) { ngx_uint_t flags; ngx_msec_t timer, delta; if (ngx_timer_resolution) { timer = NGX_TIMER_INFINITE; flags = 0; } else { timer = ngx_event_find_timer(); flags = NGX_UPDATE_TIME; #if (NGX_THREADS) if (
#读书笔记    #技术帖    #linux    #unix   
概念所谓的惊群现象指的是当多个进程或线程在等待同一资源时,当该资源突然由不可用变为可用,虽然资源只能供一个进程或线程使用,但所有线程或进程都被唤醒去竞争这一资源惊群现象会造成系统性能的大幅下降:系统对用户进程/线程频繁的无效调度,大幅度的降低系统效率为了确保只有一个进程或线程得到资源,用户必须对资源加锁,这就进一步增加了系统开销 最常见的例子就是对 socket 描述符的 accept 操作,当多个用户进程或线程都通过 accept 监听在同一端口上时,由于实际只可能 accept 一次,因此所有进程都被唤醒而实际却只有一个进程 accept 成功,造成惊群现象 这是一个历史问题,linux 2.6 内核以上 accept 系统调用已经不会引起惊群现象了但是,如果调用 epoll,多个进程调用 epoll_wait 等待事件,依然会引起惊群现象,每个进程都被唤醒,但是只有一个 accept 正确返回 linux 内核的解决方法对于一些 linux 内核中已知的惊群问题,内核开发者增加了“互斥等待”选项:当一个等待队列入口如果 
#技术帖    #linux    #unix    #技术分享   



京ICP备15018585号