


nginx 源码学习笔记(二十一)—— event 模块二 ——事件驱动核心ngx_process_events_and_timers
首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数。
本篇文章来自于:http://blog.csdn.net/lengzijian/article/details/7601730
先来看一下第十九节的部分截图:
今天主要讲解的就是事件驱动函数,图中的红色部分:
[cpp] view plaincopyprint?
- src/event/ngx_event.c
- 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;
- }
- /*
- ngx_use_accept_mutex变量代表是否使用accept互斥体
- 默认是使用,可以通过accept_mutex off;指令关闭;
- accept mutex 的作用就是避免惊群,同时实现负载均衡
- */
- if (ngx_use_accept_mutex) {
- /*
- ngx_accept_disabled变量在ngx_event_accept函数中计算。
- 如果ngx_accept_disabled大于0,就表示该进程接受的链接过多,
- 因此放弃一次争抢accept mutex的机会,同时将自己减一。
- 然后,继续处理已有连接上的事件。
- nginx就利用这一点实现了继承关于连接的基本负载均衡。
- */
- if (ngx_accept_disabled > 0) {
- ngx_accept_disabled--;
- } else {
- /*
- 尝试锁accept mutex,只有成功获取锁的进程,才会将listen套接字放到epoll中。
- 因此,这就保证了只有一个进程拥有监听套接口,故所有进程阻塞在epoll_wait时,
- 才不会惊群现象。
- */
- if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
- return;
- }
- if (ngx_accept_mutex_held) {
- /*
- 如果进程获得了锁,将添加一个 NGX_POST_EVENTS 标志。
- 这个标志的作用是将所有产生的事件放入一个队列中,等释放后,在慢慢来处理事件。
- 因为,处理时间可能会很耗时,如果不先施放锁再处理的话,该进程就长时间霸占了锁,
- 导致其他进程无法获取锁,这样accept的效率就低了。
- */
- flags |= NGX_POST_EVENTS;
- } else {
- /*
- 没有获得所得进程,当然不需要NGX_POST_EVENTS标志。
- 但需要设置延时多长时间,再去争抢锁。
- */
- if (timer == NGX_TIMER_INFINITE
- || timer > ngx_accept_mutex_delay)
- {
- timer = ngx_accept_mutex_delay;
- }
- }
- }
- }
- delta = ngx_current_msec;
- /*接下来,epoll要开始wait事件,
- ngx_process_events的具体实现是对应到epoll模块中的ngx_epoll_process_events函数
- 这里之后会详细讲解的哦
- */
- (void) ngx_process_events(cycle, timer, flags);
- //统计本次wait事件的耗时
- delta = ngx_current_msec - delta;
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
- "timer delta: %M", delta);
- /*
- ngx_posted_accept_events是一个事件队列,暂存epoll从监听套接口wait到的accept事件。
- 前文提到的NGX_POST_EVENTS标志被使用后,会将所有的accept事件暂存到这个队列
- */
- if (ngx_posted_accept_events) {
- ngx_event_process_posted(cycle, &ngx_posted_accept_events);
- }
- //所有accept事件处理完之后,如果持有锁的话,就释放掉。
- if (ngx_accept_mutex_held) {
- ngx_shmtx_unlock(&ngx_accept_mutex);
- }
- /*
- delta是之前统计的耗时,存在毫秒级的耗时,就对所有时间的timer进行检查,
- 如果timeout 就从time rbtree中删除到期的timer,同时调用相应事件的handler函数处理
- */
- if (delta) {
- ngx_event_expire_timers();
- }
- ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
- "posted events %p", ngx_posted_events);
- /*
- 处理普通事件(连接上获得的读写事件),
- 因为每个事件都有自己的handler方法,
- */
- if (ngx_posted_events) {
- if (ngx_threaded) {
- ngx_wakeup_worker_thread(cycle);
- } else {
- ngx_event_process_posted(cycle, &ngx_posted_events);
- }
- }
- }
之前有说过accept事件,其实他就是监听套接口上是否有新来的事件,下面介绍下accept时间的handler方法:
ngx_event_accept:
[cpp] view plaincopyprint?
- src/event/ngx_event_accept.c
- void
- ngx_event_accept(ngx_event_t *ev)
- {
- socklen_t socklen;
- ngx_err_t err;
- ngx_log_t *log;
- ngx_socket_t s;
- ngx_event_t *rev, *wev;
- ngx_listening_t *ls;
- ngx_connection_t *c, *lc;
- ngx_event_conf_t *ecf;
- u_char sa[NGX_SOCKADDRLEN];
- //省略部分代码
- lc = ev->data;
- ls = lc->listening;
- ev->ready = 0;
- ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
- "accept on %V, ready: %d", &ls->addr_text, ev->available);
- do {
- socklen = NGX_SOCKADDRLEN;
- //accept一个新的连接
- s = accept(lc->fd, (struct sockaddr *) sa, &socklen);
- //省略部分代码
- /*
- accept到一个新的连接后,就重新计算ngx_accept_disabled的值,
- 它主要是用来做负载均衡,之前有提过。
- 这里,我们可以看到他的就只方式
- “总连接数的八分之一 - 剩余的连接数“
- 总连接指每个进程设定的最大连接数,这个数字可以再配置文件中指定。
- 所以每个进程到总连接数的7/8后,ngx_accept_disabled就大于零,连接超载了
- */
- ngx_accept_disabled = ngx_cycle->connection_n / 8
- - ngx_cycle->free_connection_n;
- //获取一个connection
- c = ngx_get_connection(s, ev->log);
- //为新的链接创建起一个memory pool
- //连接关闭的时候,才释放pool
- c->pool = ngx_create_pool(ls->pool_size, ev->log);
- if (c->pool == NULL) {
- ngx_close_accepted_connection(c);
- return;
- }
- c->sockaddr = ngx_palloc(c->pool, socklen);
- if (c->sockaddr == NULL) {
- ngx_close_accepted_connection(c);
- return;
- }
- ngx_memcpy(c->sockaddr, sa, socklen);
- log = ngx_palloc(c->pool, sizeof(ngx_log_t));
- if (log == NULL) {
- ngx_close_accepted_connection(c);
- return;
- }
- /* set a blocking mode for aio and non-blocking mode for others */
- if (ngx_inherited_nonblocking) {
- if (ngx_event_flags & NGX_USE_AIO_EVENT) {
- if (ngx_blocking(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_blocking_n " failed");
- ngx_close_accepted_connection(c);
- return;
- }
- }
- } else {
- //我们使用epoll模型,这里我们设置连接为nonblocking
- if (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {
- if (ngx_nonblocking(s) == -1) {
- ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
- ngx_nonblocking_n " failed");
- ngx_close_accepted_connection(c);
- return;
- }
- }
- }
- *log = ls->log;
- //初始化新的连接
- c->recv = ngx_recv;
- c->send = ngx_send;
- c->recv_chain = ngx_recv_chain;
- c->send_chain = ngx_send_chain;
- c->log = log;
- c->pool->log = log;
- c->socklen = socklen;
- c->listening = ls;
- c->local_sockaddr = ls->sockaddr;
- c->unexpected_eof = 1;
- #if (NGX_HAVE_UNIX_DOMAIN)
- if (c->sockaddr->sa_family == AF_UNIX) {
- c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;
- c->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
- #if (NGX_SOLARIS)
- /* Solaris's sendfilev() supports AF_NCA, AF_INET, and AF_INET6 */
- c->sendfile = 0;
- #endif
- }
- #endif
- rev = c->read;
- wev = c->write;
- wev->ready = 1;
- if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT)) {
- /* rtsig, aio, iocp */
- rev->ready = 1;
- }
- if (ev->deferred_accept) {
- rev->ready = 1;
- #if (NGX_HAVE_KQUEUE)
- rev->available = 1;
- #endif
- }
- rev->log = log;
- wev->log = log;
- /*
- * TODO: MT: - ngx_atomic_fetch_add()
- * or protection by critical section or light mutex
- *
- * TODO: MP: - allocated in a shared memory
- * - ngx_atomic_fetch_add()
- * or protection by critical section or light mutex
- */
- c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
- if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {
- if (ngx_add_conn(c) == NGX_ERROR) {
- ngx_close_accepted_connection(c);
- return;
- }
- }
- log->data = NULL;
- log->handler = NULL;
- /*
- 这里listen handler很重要,它将完成新连接的最后初始化工作,
- 同时将accept到的新的连接放入epoll中;挂在这个handler上的函数,
- 就是ngx_http_init_connection 在之后http模块中在详细介绍
- */
- ls->handler(c);
- if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {
- ev->available--;
- }
- } while (ev->available);
- }
accpt事件的handler方法也就是如此了。之后就是每个连接的读写事件handler方法,这一部分会直接将我们引入http模块,我们还不急,还要学习下nginx经典模块epoll。
以上就介绍了nginx 源码学习笔记(二十一)—— event 模块二 ——事件驱动核心ngx_process_events_and_timers,包括了队列方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le message « Votre organisation vous a demandé de modifier votre code PIN » apparaîtra sur l'écran de connexion. Cela se produit lorsque la limite d'expiration du code PIN est atteinte sur un ordinateur utilisant les paramètres de compte basés sur l'organisation, sur lesquels ils contrôlent les appareils personnels. Cependant, si vous configurez Windows à l'aide d'un compte personnel, le message d'erreur ne devrait idéalement pas apparaître. Même si ce n'est pas toujours le cas. La plupart des utilisateurs qui rencontrent des erreurs déclarent utiliser leur compte personnel. Pourquoi mon organisation me demande-t-elle de modifier mon code PIN sous Windows 11 ? Il est possible que votre compte soit associé à une organisation et votre approche principale devrait être de le vérifier. Contacter votre administrateur de domaine peut vous aider ! De plus, des paramètres de stratégie locale mal configurés ou des clés de registre incorrectes peuvent provoquer des erreurs. Tout de suite

Windows 11 met au premier plan un design frais et élégant ; l'interface moderne vous permet de personnaliser et de modifier les moindres détails, tels que les bordures des fenêtres. Dans ce guide, nous discuterons des instructions étape par étape pour vous aider à créer un environnement qui reflète votre style dans le système d'exploitation Windows. Comment modifier les paramètres de bordure de fenêtre ? Appuyez sur + pour ouvrir l'application Paramètres. WindowsJe vais dans Personnalisation et clique sur Paramètres de couleur. Changement de couleur Paramètres des bordures de fenêtre Fenêtre 11" Largeur = "643" Hauteur = "500" > Recherchez l'option Afficher la couleur d'accent sur la barre de titre et les bordures de fenêtre et activez le commutateur à côté. Pour afficher les couleurs d'accent dans le menu Démarrer et la barre des tâches Pour afficher la couleur du thème dans le menu Démarrer et la barre des tâches, activez Afficher le thème dans le menu Démarrer et la barre des tâches.

Par défaut, la couleur de la barre de titre sous Windows 11 dépend du thème sombre/clair que vous choisissez. Cependant, vous pouvez le changer pour la couleur de votre choix. Dans ce guide, nous discuterons des instructions étape par étape sur trois façons de le modifier et de personnaliser votre expérience de bureau pour la rendre visuellement attrayante. Est-il possible de changer la couleur de la barre de titre des fenêtres actives et inactives ? Oui, vous pouvez modifier la couleur de la barre de titre des fenêtres actives à l'aide de l'application Paramètres, ou vous pouvez modifier la couleur de la barre de titre des fenêtres inactives à l'aide de l'Éditeur du Registre. Pour connaître ces étapes, passez à la section suivante. Comment changer la couleur de la barre de titre sous Windows 11 ? 1. Appuyez sur + pour ouvrir la fenêtre des paramètres à l'aide de l'application Paramètres. WindowsJe vais dans "Personnalisation" puis

Voyez-vous « Un problème est survenu » avec l'instruction « OOBELANGUAGE » sur la page Windows Installer ? L'installation de Windows s'arrête parfois à cause de telles erreurs. OOBE signifie expérience hors des sentiers battus. Comme l'indique le message d'erreur, il s'agit d'un problème lié à la sélection de la langue OOBE. Il n'y a rien à craindre, vous pouvez résoudre ce problème avec une astucieuse modification du registre à partir de l'écran OOBE lui-même. Solution rapide – 1. Cliquez sur le bouton « Réessayer » en bas de l'application OOBE. Cela permettra de poursuivre le processus sans autre problème. 2. Utilisez le bouton d'alimentation pour forcer l'arrêt du système. Après le redémarrage du système, OOBE devrait continuer. 3. Déconnectez le système d'Internet. Terminez tous les aspects d'OOBE en mode hors ligne

Les miniatures de la barre des tâches peuvent être amusantes, mais elles peuvent aussi être distrayantes ou ennuyeuses. Compte tenu de la fréquence à laquelle vous survolez cette zone, vous avez peut-être fermé plusieurs fois des fenêtres importantes par inadvertance. Un autre inconvénient est qu'il utilise plus de ressources système, donc si vous cherchez un moyen d'être plus efficace en termes de ressources, nous allons vous montrer comment le désactiver. Cependant, si vos spécifications matérielles peuvent le gérer et que vous aimez l'aperçu, vous pouvez l'activer. Comment activer l’aperçu miniature de la barre des tâches dans Windows 11 ? 1. Utilisez l'application Paramètres pour appuyer sur la touche et cliquez sur Paramètres. Windows, cliquez sur Système et sélectionnez À propos. Cliquez sur Paramètres système avancés. Accédez à l'onglet Avancé et sélectionnez Paramètres sous Performances. Sélectionnez "Effets visuels"

De nombreux utilisateurs choisiront la marque Huawei lors du choix des montres intelligentes. Parmi eux, les Huawei GT3pro et GT4 sont des choix très populaires. De nombreux utilisateurs sont curieux de connaître la différence entre Huawei GT3pro et GT4. Quelles sont les différences entre Huawei GT3pro et GT4 ? 1. Apparence GT4 : 46 mm et 41 mm, le matériau est un miroir en verre + un corps en acier inoxydable + une coque arrière en fibre haute résolution. GT3pro : 46,6 mm et 42,9 mm, le matériau est du verre saphir + corps en titane/corps en céramique + coque arrière en céramique 2. GT4 sain : en utilisant le dernier algorithme Huawei Truseen5.5+, les résultats seront plus précis. GT3pro : ajout d'un électrocardiogramme ECG, d'un vaisseau sanguin et de la sécurité

Nous avons tous des préférences différentes en matière de mise à l'échelle de l'affichage sur Windows 11. Certaines personnes aiment les grandes icônes, d’autres les petites. Cependant, nous sommes tous d’accord sur le fait qu’il est important d’avoir la bonne échelle. Une mauvaise mise à l'échelle des polices ou une mise à l'échelle excessive des images peuvent nuire à la productivité lorsque vous travaillez. Vous devez donc savoir comment la personnaliser pour tirer le meilleur parti des capacités de votre système. Avantages du zoom personnalisé : Il s'agit d'une fonctionnalité utile pour les personnes qui ont des difficultés à lire du texte à l'écran. Cela vous aide à voir plus sur l’écran à la fois. Vous pouvez créer des profils d'extension personnalisés qui s'appliquent uniquement à certains moniteurs et applications. Peut aider à améliorer les performances du matériel bas de gamme. Cela vous donne plus de contrôle sur ce qui est sur votre écran. Comment utiliser Windows 11

La luminosité de l’écran fait partie intégrante de l’utilisation des appareils informatiques modernes, en particulier lorsque vous regardez l’écran pendant de longues périodes. Il vous aide à réduire la fatigue oculaire, à améliorer la lisibilité et à visualiser le contenu facilement et efficacement. Cependant, en fonction de vos paramètres, il peut parfois être difficile de gérer la luminosité, notamment sous Windows 11 avec les nouvelles modifications de l'interface utilisateur. Si vous rencontrez des difficultés pour régler la luminosité, voici toutes les manières de gérer la luminosité sous Windows 11. Comment modifier la luminosité sous Windows 11 [10 méthodes expliquées] Les utilisateurs d'un seul moniteur peuvent utiliser les méthodes suivantes pour régler la luminosité sous Windows 11. Cela inclut les systèmes de bureau utilisant un seul moniteur ainsi que les ordinateurs portables. Commençons. Méthode 1 : Utiliser le Centre d'action Le Centre d'action est accessible
