Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
NginxÔ´ÂëÆÊÎöÖ®ÄÚ´æ³Ø£¬ÓëÄÚ´æ¹ÜÀí
 
×÷Õߣºv_JULY_v À´Ô´£ºCSDN ·¢²¼ÓÚ£º 2015-04-03
  2852  次浏览      58
 

ÒýÑÔ

Nginx£¨·¢Òôͬ engine x£©ÊÇÒ»¿îÇáÁ¿¼¶µÄWeb ·þÎñÆ÷/·´Ïò´úÀí·þÎñÆ÷¼°µç×ÓÓʼþ£¨IMAP/POP3£©´úÀí·þÎñÆ÷£¬²¢ÔÚÒ»¸öBSD-like ЭÒéÏ·¢ÐС£ÓɶíÂÞ˹µÄ³ÌÐòÉè¼ÆÊ¦Igor SysoevËù¿ª·¢£¬×î³õ¹©¶í¹ú´óÐ͵ÄÈë¿ÚÍøÕ¾¼°ËÑѰÒýÇæRambler£¨¶íÎÄ£º§²§Ñ§Þ§Ò§Ý§Ö§â£©Ê¹Óá£

ÆäÌØµãÊÇÕ¼ÓÐÄÚ´æÉÙ£¬²¢·¢ÄÜÁ¦Ç¿£¬ÊÂʵÉÏnginxµÄ²¢·¢ÄÜÁ¦È·ÊµÔÚͬÀàÐ͵ÄÍøÒ³·þÎñÆ÷ÖбíÏֽϺã¬Ä¿Ç°Öйú´ó½ʹÓÃnginxÍøÕ¾Óû§ÓУºÐÂÀË¡¢ÍøÒס¢ ÌÚѶ£¬ÁíÍâÖªÃûµÄÎ¢ÍøÖ¾PlurkҲʹÓÃnginx£¬ÒÔ¼°Öî¶àÔݲ»ÔøµÃÖªµÄÍæÒâ¶ù¡£

¶ÁÕß¿ÉÒÔµ½´Ë´¦ÏÂÔØNginx×îа汾µÄÔ´Â룺http://nginx.org/en/download.html¡£Í¬Ê±£¬±¾Îı¾²»Ïë¸øÔ´ÂëÌ«¶à×¢ÊÍ£¬ÒòΪÕâ²»Ïñ½²½âËã·¨£¬Ëã·¨½²½âµÄԽͨË×Ò×¶®Ô½ºÃ£¬¶øÔ´ÂëÆÊÎöÔò²»Í¬£¬ÔµÓÉÔÚÓÚ²»Í¬µÄ¶ÁÕß¶Ôͬһ·ÝÔ´ÂëÓÐ×Ų»Í¬µÄÀí½â£¬»òÉî»òdz£¬ËùÒÔ£¬¸ü¶àµÄÊÇ¿¿¶ÁÕß×Ô¼ºÈ¥Ë¼¿¼ÓëÁìÎò¡£

ok£¬±¾ÎÄÖ®ÖÐÓÐÈκÎÊè©»ò²»ÕýÖ®´¦£¬¿ÒÇëÅúÆÀÖ¸Õý¡£Ð»Ð»¡£

NginxÔ´ÂëÆÊÎöÖ®ÄÚ´æ³Ø

1¡¢ÄÚ´æ³Ø½á¹¹

ÄÚ´æÏà¹ØµÄ²Ù×÷Ö÷ÒªÔÚÎļþ os/unix/ngx_alloc.{h,c} ºÍ core/ngx_palloc.{h,c} ÖÐʵÏÖ£¬ok£¬ÔÛÃÇÏÈÀ´¿´ÄÚ´æ¹ÜÀíÖм¸¸öÖ÷ÒªµÄÊý¾Ý½á¹¹£º

typedef struct {    //ÄÚ´æ³ØµÄÊý¾Ý½á¹¹Ä£¿é  
02. u_char *last; //µ±Ç°ÄÚ´æ·ÖÅä½áÊøÎ»Ö㬼´ÏÂÒ»¶Î¿É·ÖÅäÄÚ´æµÄÆðʼλÖÃ
03. u_char *end; //ÄÚ´æ³ØµÄ½áÊøÎ»ÖÃ
04. ngx_pool_t *next; //Á´½Óµ½ÏÂÒ»¸öÄÚ´æ³Ø£¬ÄÚ´æ³ØµÄºÜ¶à¿éÄÚ´æ¾ÍÊÇͨ¹ý¸ÃÖ¸ÕëÁ¬³ÉÁ´±íµÄ
05. ngx_uint_t failed; //¼Ç¼ÄÚ´æ·ÖÅä²»ÄÜÂú×ãÐèÇóµÄʧ°Ü´ÎÊý
06. } ngx_pool_data_t; //½á¹¹ÓÃÀ´Î¬»¤ÄÚ´æ³ØµÄÊý¾Ý¿é£¬¹©Óû§·ÖÅäÖ®Óá£

struct ngx_pool_s {  //ÄÚ´æ³ØµÄ¹ÜÀí·ÖÅäÄ£¿é  
02. ngx_pool_data_t d; //ÄÚ´æ³ØµÄÊý¾Ý¿é£¨ÉÏÃæÒÑÓÐÃèÊö£©£¬ÉèΪd
03. size_t max; //Êý¾Ý¿é´óС£¬Ð¡¿éÄÚ´æµÄ×î´óÖµ
04. ngx_pool_t *current; //Ö¸Ïòµ±Ç°»ò±¾ÄÚ´æ³Ø
05. ngx_chain_t *chain; //¸ÃÖ¸Õë¹Ò½ÓÒ»¸öngx_chain_t½á¹¹
06. ngx_pool_large_t *large; //Ö¸Ïò´ó¿éÄÚ´æ·ÖÅ䣬nginxÖУ¬´ó¿éÄÚ´æ·ÖÅäÖ±½Ó²ÉÓñê׼ϵͳ½Ó¿Úmalloc
07. ngx_pool_cleanup_t *cleanup; //Îö¹¹º¯Êý£¬¹ÒÔØÄÚ´æÊÍ·ÅʱÐèÒªÇåÀí×ÊÔ´µÄһЩ±ØÒª²Ù×÷
08. ngx_log_t *log; //ÄÚ´æ·ÖÅäÏà¹ØµÄÈÕÖ¾¼Ç¼
09. };

ÔÙÀ´¿´¿´´ó¿éÊý¾Ý·ÖÅäµÄ½á¹¹Ì壺

struct ngx_pool_large_s {  
02. ngx_pool_large_t *next;
03. void *alloc;
04. };

ÆäËüµÄÊý¾Ý½á¹¹ÓëÏà¹Ø¶¨Ò壺

typedef struct {  
02. ngx_fd_t fd;
03. u_char *name;
04. ngx_log_t *log;
05. } ngx_pool_cleanup_file_t;

#define NGX_MAX_ALLOC_FROM_POOL (ngx_pagesize - 1)  //ÔÚx86Ìåϵ½á¹¹Ï£¬¸ÃÖµÒ»°ãΪ4096B£¬¼´4K  

ÉÏÊöÕâЩÊý¾Ý½á¹¹µÄÂß¼­½á¹¹Í¼ÈçÏ£º

1.1¡¢ngx_pool_tµÄÂß¼­½á¹¹

ÔÙ¿´Ò»ÏÂÓÃUML»æÖƵÄngx_pool_tµÄÂß¼­½á¹¹Í¼£º

NginxÔ´ÂëÆÊÎöÖ®ÄÚ´æ¹ÜÀí

2¡¢ÄÚ´æ³Ø²Ù×÷

2.1¡¢´´½¨ÄÚ´æ³Ø

ngx_pool_t *  
02. ngx_create_pool(size_t size, ngx_log_t *log)
03. {
04. ngx_pool_t *p;
05.
06. p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
07. //ngx_memalign()º¯ÊýÖ´ÐÐÄÚ´æ·ÖÅ䣬 ¸Ãº¯ÊýµÄʵÏÖÔÚsrc/os/unix/ngx_alloc.cÎļþÖУ¨¼Ù¶¨NGX_HAVE_POSIX_MEMALIGN±»¶¨Ò壩£º
08.
09. if (p == NULL) {
10. return NULL;
11. }
12.
13. p->d.last = (u_char *) p + sizeof(ngx_pool_t);
14. p->d.end = (u_char *) p + size;
15. p->d.next = NULL;
16. p->d.failed = 0;
17.
18. size = size - sizeof(ngx_pool_t);
19. p->max = (size < NGX_MAX_ALLOC_FROM_POOL) ? size : NGX_MAX_ALLOC_FROM_POOL;
20. //×î´ó²»³¬¹ý4095B£¬±ðÍüÁËÉÏÃæNGX_MAX_ALLOC_FROM_POOLµÄ¶¨Òå
21.
22. p->current = p;
23. p->chain = NULL;
24. p->large = NULL;
25. p->cleanup = NULL;
26. p->log = log;
27.
28. return p;
29. }

ÀýÈ磬µ÷ÓÃngx_create_pool(1024, 0x80d1c4c)ºó£¬´´½¨µÄÄÚ´æ³ØÎïÀí½á¹¹ÈçÏÂͼ£º

½ô½Ó×Å£¬ÔÛÃǾÍÀ´·ÖÎöÏÂÉÏÃæ´úÂëÖÐËùÌáµ½µÄ£ºngx_memalign()º¯Êý¡£

void *  
02. ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
03. {
04. void *p;
05. int err;
06.
07. err = posix_memalign(&p, alignment, size);
08. //¸Ãº¯Êý·ÖÅäÒÔalignmentΪ¶ÔÆëµÄsize×Ö½ÚµÄÄÚ´æ´óС£¬ÆäÖÐpÖ¸Ïò·ÖÅäµÄÄÚ´æ¿é¡£
09.
10. if (err) {
11. ngx_log_error(NGX_LOG_EMERG, log, err,
12. "posix_memalign(%uz, %uz) failed", alignment, size);
13. p = NULL;
14. }
15.
16. ngx_log_debug3(NGX_LOG_DEBUG_ALLOC, log, 0,
17. "posix_memalign: %p:%uz @%uz", p, size, alignment);
18.
19. return p;
20. }
21. //´ÓÕâ¸öº¯ÊýµÄʵÏÖÌ壬ÎÒÃÇ¿ÉÒÔ¿´µ½p = ngx_memalign(NGX_POOL_ALIGNMENT, size, log);
22. //º¯Êý·ÖÅäÒÔNGX_POOL_ALIGNMENT×Ö½Ú¶ÔÆëµÄsize×Ö½ÚµÄÄڴ棬ÔÚsrc/core/ngx_palloc.hÎļþÖУº

#define NGX_POOL_ALIGNMENT       16  

Òò´Ë£¬nginxµÄÄÚ´æ³Ø·ÖÅ䣬ÊÇÒÔ16×Ö½ÚΪ±ß½ç¶ÔÆëµÄ¡£

2.1¡¢Ïú»ÙÄÚ´æ³Ø

½ÓÏÂÀ´£¬ÔÛÃÇÀ´¿´ÄÚ´æ³ØµÄÏú»Ùº¯Êý£¬poolÖ¸ÏòÐèÒªÏú»ÙµÄÄÚ´æ³Ø

void  
02. ngx_destroy_pool(ngx_pool_t *pool)
03. {
04. ngx_pool_t *p, *n;
05. ngx_pool_large_t *l;
06. ngx_pool_cleanup_t *c;
07.
08. for (c = pool->cleanup; c; c = c->next) {
09. if (c->handler) {
10. ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
11. "run cleanup: %p", c);
12. c->handler(c->data);
13. }
14. }
15. //Ç°Ãæ½²µ½£¬cleanupÖ¸ÏòÎö¹¹º¯Êý£¬ÓÃÓÚÖ´ÐÐÏà¹ØµÄÄÚ´æ³ØÏú»Ù֮ǰµÄÇåÀí¹¤×÷£¬ÈçÎļþµÄ¹Ø±ÕµÈ£¬
16. //ÇåÀíº¯ÊýÊÇÒ»¸öhandlerµÄº¯ÊýÖ¸Õë¹ÒÔØ¡£Òò´Ë£¬ÔÚÕⲿ·Ö£¬¶ÔÄÚ´æ³ØÖеÄÎö¹¹º¯Êý±éÀúµ÷Óá£
17.
18. for (l = pool->large; l; l = l->next) {
19. ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0, "free: %p", l->alloc);
20.
21. if (l->alloc) {
22. ngx_free(l->alloc);
23. }
24. }
25. //ÕâÒ»²¿·ÖÓÃÓÚÇåÀí´ó¿éÄڴ棬ngx_freeʵ¼ÊÉϾÍÊDZê×¼µÄfreeº¯Êý£¬
26. //¼´´óÄÚ´æ¿é¾ÍÊÇͨ¹ýmallocºÍfree²Ù×÷½øÐйÜÀíµÄ¡£
27.
28. #if (NGX_DEBUG)
29.
30. /**
31. * we could allocate the pool->log from this pool
32. * so we can not use this log while the free()ing the pool
33. */
34.
35. for (p = pool, n = pool->d.next; /** void */; p = n, n = n->d.next) {
36. ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
37. "free: %p, unused: %uz", p, p->d.end - p->d.last);
38.
39. if (n == NULL) {
40. break;
41. }
42. }
43. //Ö»ÓÐdebugģʽ²Å»áÖ´ÐÐÕâ¸öƬ¶ÎµÄ´úÂ룬Ö÷ÒªÊÇlog¼Ç¼£¬ÓÃÒÔ¸ú×Ùº¯ÊýÏú»ÙʱÈÕÖ¾¼Ç¼¡£
44. #endif
45.
46. for (p = pool, n = pool->d.next; /** void */; p = n, n = n->d.next) {
47. ngx_free(p);
48.
49. if (n == NULL) {
50. break;
51. }
52. }
53. }
54. //¸ÃƬ¶Î³¹µ×Ïú»ÙÄÚ´æ³Ø±¾Éí¡£

¸Ãº¯Êý½«±éÀúÄÚ´æ³ØÁ´±í£¬ËùÓÐÊÍ·ÅÄڴ棬Èç¹û×¢²áÁËclenup(Ò²ÊÇÒ»¸öÁ´±í½á¹¹)£¬Òཫ±éÀú¸ÃcleanupÁ´±í½á¹¹ÒÀ´Îµ÷ÓÃclenupµÄhandlerÇåÀí¡£Í¬Ê±£¬»¹½«±éÀúlargeÁ´±í£¬ÊÍ·Å´ó¿éÄÚ´æ¡£

2.3¡¢ÖØÖÃÄÚ´æ³Ø

void ngx_reset_pool(ngx_pool_t *pool)

ÖØÖÃÄÚ´æ³Ø£¬½«ÄÚ´æ³Ø»Ö¸´µ½¸Õ·ÖÅäʱµÄ³õʼ»¯×´Ì¬£¬×¢ÒâÄÚ´æ³Ø·ÖÅäµÄ³õʼ״̬ʱ£¬ÊDz»°üº¬´ó¿éÄÚ´æµÄ£¬Òò´Ë³õʼ״̬ÐèÒª½«Ê¹ÓõĴó¿éÄÚ´æÊͷŵô£¬²¢°ÑÄÚ´æ³ØÊý¾Ý½á¹¹µÄ¸÷ÏîÖ¸Õë»Ö¸´µ½³õʼ״ֵ̬¡£´úÂëÆ¬¶ÎÈçÏ£º

void  
02. ngx_reset_pool(ngx_pool_t *pool)
03. {
04. ngx_pool_t *p;
05. ngx_pool_large_t *l;
06.
07. for (l = pool->large; l; l = l->next) {
08. if (l->alloc) {
09. ngx_free(l->alloc);
10. }
11. }
12. //ÉÏÊöƬ¶ÎÖ÷ÒªÓÃÓÚÇåÀíʹÓõ½µÄ´ó¿éÄÚ´æ¡£
13.
14. pool->large = NULL;
15.
16. for (p = pool; p; p = p->d.next) {
17. p->d.last = (u_char *) p + sizeof(ngx_pool_t);
18. }
19. }

ÕâÀïËäÈ»ÖØÖÃÁËÄÚ´æ³Ø£¬µ«¿ÉÒÔ¿´µ½²¢Ã»ÓÐÊÍ·ÅÄÚ´æ³ØÖб»Ê¹ÓõÄС¿éÄڴ棬¶øÖ»Êǽ«ÆälastÖ¸ÕëÖ¸Ïò¿É¹²·ÖÅäµÄÄÚ´æµÄ³õʼλÖá£ÕâÑù£¬¾ÍʡȥÁËÄÚ´æ³ØµÄÊͷźÍÖØÐ·ÖÅä²Ù×÷£¬¶ø´ïµ½ÖØÖÃÄÚ´æ³ØµÄÄ¿µÄ¡£

ÉÏÃæÎÒÃÇÖ÷Òª²ûÊöÁËÄÚ´æ³Ø¹ÜÀíµÄ¼¸¸öº¯Êý£¬½ÓÏÂÀ´ÎÒÃÇÉîÈëµ½ÈçºÎ´ÓÄÚ´æ³ØÖÐÈ¥ÉêÇëʹÓÃÄÚ´æ¡£

2.4¡¢·ÖÅäÄÚ´æ£¨ÖØµã£©

2.4.1¡¢ngx_palloc Óëngx_pnallocº¯Êý

ÕâÁ½¸öº¯ÊýµÄ²ÎÊý¶¼Îª(ngx_pool_t *pool, size_t size)£¬ÇÒ·µ»ØÀàÐÍΪvoid*£¬Î¨Ò»µÄÇø±ðÊÇngx_palloc´ÓpoolÄÚ´æ³Ø·ÖÅäÒÔNGX_ALIGNMENT¶ÔÆëµÄÄڴ棬¶øngx_pnalloc·ÖÅäÊʺÏsize´óСµÄÄڴ棬²»¿¼ÂÇÄÚ´æ¶ÔÆë¡£

ÎÒÃÇÔÚÕâÀïÖ»·ÖÎöngx_palloc£¬¶ÔÓÚngx_pnallocÆäʵÏÖ·½Ê½»ù±¾ÀàËÆ£¬±ã²»ÔÙ׸Êö¡£

Îļþ£ºsrc/core/ngx_palloc.c

void *  
02. ngx_palloc(ngx_pool_t *pool, size_t size)
03. {
04. u_char *m;
05. ngx_pool_t *p;
06.
07. //Åжϴý·ÖÅäÄÚ´æÓëmaxÖµ
08. //1¡¢Ð¡ÓÚmaxÖµ£¬Ôò´Ócurrent½áµã¿ªÊ¼±éÀúpoolÁ´±í
09. if (size <= pool->max) {
10.
11. p = pool->current;
12.
13. do {
14. //Ö´ÐÐ¶ÔÆë²Ù×÷£¬
15. //¼´ÒÔlast¿ªÊ¼£¬¼ÆËãÒÔNGX_ALIGNMENT¶ÔÆëµÄÆ«ÒÆÎ»ÖÃÖ¸Õ룬
16. m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);
17.
18. //È»ºó¼ÆËãendÖµ¼õÈ¥Õâ¸öÆ«ÒÆÖ¸ÕëλÖõĴóСÊÇ·ñÂú×ãË÷Òª·ÖÅäµÄsize´óС£¬
19. //Èç¹ûÂú×㣬ÔòÒÆ¶¯lastÖ¸ÕëλÖ㬲¢·µ»ØËù·ÖÅäµ½µÄÄÚ´æµØÖ·µÄÆðʼµØÖ·£»
20. if ((size_t) (p->d.end - m) >= size) {
21. p->d.last = m + size;
22. //ÔڸýáµãÖ¸ÏòµÄÄÚ´æ¿éÖзÖÅäsize´óСµÄÄÚ´æ
23.
24. return m;
25. }
26.
27. //Èç¹û²»Âú×㣬Ôò²éÕÒÏÂÒ»¸öÁ´¡£
28. p = p->d.next;
29.
30. } while (p);
31.
32. //Èç¹û±éÀúÍêÕû¸öÄÚ´æ³ØÁ´±í¾ùδÕÒµ½ºÏÊÊ´óСµÄÄÚ´æ¿é¹©·ÖÅ䣬ÔòÖ´ÐÐngx_palloc_block()À´·ÖÅä¡£
33.
34. //ngx_palloc_block()º¯ÊýΪ¸ÃÄÚ´æ³ØÔÙ·ÖÅäÒ»¸öblock£¬¸ÃblockµÄ´óСΪÁ´±íÖÐÇ°ÃæÃ¿Ò»¸öblock´óСµÄÖµ¡£
35. //Ò»¸öÄÚ´æ³ØÊÇÓɶà¸öblockÁ´½ÓÆðÀ´µÄ¡£·ÖÅä³É¹¦ºó£¬½«¸ÃblockÁ´Èë¸ÃpollÁ´µÄ×îºó£¬
36. //ͬʱ£¬ÎªËùÒª·ÖÅäµÄsize´óСµÄÄÚ´æ½øÐзÖÅ䣬²¢·µ»Ø·ÖÅäÄÚ´æµÄÆðʼµØÖ·¡£
37. return ngx_palloc_block(pool, size); //2.4.1½Ú·ÖÎö
38.
39. }
40. //2¡¢Èç¹û´óÓÚmaxÖµ£¬ÔòÖ´Ðдó¿éÄÚ´æ·ÖÅäµÄº¯Êýngx_palloc_large£¬ÔÚlargeÁ´±íÀï·ÖÅäÄÚ´æ
41. return ngx_palloc_large(pool, size); //2.4.2½Ú·ÖÎö
42. }

ÀýÈ磬ÔÚ2.1½ÚÖд´½¨µÄÄÚ´æ³ØÖзÖÅä200BµÄÄڴ棬µ÷ÓÃngx_palloc(pool, 200)ºó£¬¸ÃÄÚ´æ³ØÎïÀí½á¹¹ÈçÏÂͼ£º

a¡¢´ý·ÖÅäÄÚ´æÐ¡ÓÚmaxÖµµÄÇé¿ö

ͬÑù£¬½ô½Ó×Å£¬ÔÛÃǾÍÀ´·ÖÎöÉÏÊö´úÂëÖеÄngx_palloc_block()º¯Êý£º

static void *  
02. ngx_palloc_block(ngx_pool_t *pool, size_t size)
03. {
04. u_char *m;
05. size_t psize;
06. ngx_pool_t *p, *new, *current;
07.
08. psize = (size_t) (pool->d.end - (u_char *) pool);
09. //¼ÆËãpoolµÄ´óС£¬¼´ÐèÒª·ÖÅäµÄblockµÄ´óС
10.
11. m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
12. if (m == NULL) {
13. return NULL;
14. }
15. //Ö´Ðа´NGX_POOL_ALIGNMENT¶ÔÆë·½Ê½µÄÄÚ´æ·ÖÅ䣬¼ÙÉèÄܹ»·ÖÅä³É¹¦£¬Ôò¼ÌÐøÖ´ÐкóÐø´úÂëÆ¬¶Î¡£
16.
17. //ÕâÀï¼ÆËãÐèÒª·ÖÅäµÄblockµÄ´óС
18. new = (ngx_pool_t *) m;
19.
20. new->d.end = m + psize;
21. new->d.next = NULL;
22. new->d.failed = 0;
23. //Ö´ÐиÃblockÏà¹ØµÄ³õʼ»¯¡£
24.
25. m += sizeof(ngx_pool_data_t);
26. //ÈÃmÖ¸Ïò¸Ã¿éÄÚ´ængx_pool_data_t½á¹¹ÌåÖ®ºóÊý¾ÝÇøÆðʼλÖÃ
27. m = ngx_align_ptr(m, NGX_ALIGNMENT);
28. new->d.last = m + size;
29. //ÔÚÊý¾ÝÇø·ÖÅäsize´óСµÄÄÚ´æ²¢ÉèÖÃlastÖ¸Õë
30.
31. current = pool->current;
32.
33. for (p = current; p->d.next; p = p->d.next) {
34. if (p->d.failed++ > 4) {
35. current = p->d.next;
36. //ʧ°Ü4´ÎÒÔÉÏÒÆ¶¯currentÖ¸Õë
37. }
38. }
39.
40. p->d.next = new;
41. //½«·ÖÅäµÄblockÁ´ÈëÄÚ´æ³Ø
42.
43. pool->current = current ? current : new;
44. //Èç¹ûÊǵÚÒ»´ÎΪÄÚ´æ³Ø·ÖÅäblock£¬Õâcurrent½«Ö¸ÏòзÖÅäµÄblock¡£
45.
46. return m;
47. }

×¢Ò⣺¸Ãº¯Êý·ÖÅäÒ»¿éÄÚ´æºó£¬lastÖ¸ÕëÖ¸ÏòµÄÊÇngx_pool_data_t½á¹¹Ìå(´óС16B)Ö®ºóÊý¾ÝÇøµÄÆðʼλÖ㬶ø´´½¨ÄÚ´æ³ØÊ±Ê±£¬lastÖ¸ÕëÖ¸ÏòµÄÊÇngx_pool_t½á¹¹Ìå(´óС40B)Ö®ºóÊý¾ÝÇøµÄÆðʼλÖᣠ½áºÏ2.8½ÚµÄÄÚ´æ³ØµÄÎïÀí½á¹¹£¬¸üÈÝÒ×Àí½â¡£

b¡¢´ý·ÖÅäÄÚ´æ´óÓÚmaxÖµµÄÇé¿ö

Èç2.4.1½ÚËùÊö£¬Èç¹û·ÖÅäµÄÄÚ´æ´óС´óÓÚmaxÖµ£¬´úÂë½«Ìøµ½ngx_palloc_large(pool, size)λÖã¬ok£¬ÏÂÃæ½øÈëngx_palloc_large(pool, size)º¯ÊýµÄ·ÖÎö£º

//ÕâÊÇÒ»¸östaticµÄº¯Êý£¬ËµÃ÷Íⲿº¯Êý²»»áËæ±ãµ÷Ó㬶øÊÇÌṩ¸øÄÚ²¿·ÖÅäµ÷Óõģ¬  
02. //¼´nginxÔÚ½øÐÐÄÚ´æ·ÖÅäÐèÇóʱ£¬²»»á×ÔÐÐÈ¥ÅжÏÊÇ·ñÊÇ´ó¿éÄڴ滹ÊÇС¿éÄڴ棬
03. //¶øÊǽ»ÓÉÄÚ´æ·ÖÅ亯ÊýÈ¥Åжϣ¬¶ÔÓÚÓû§ÐèÇóÀ´ËµÊÇÍêȫ͸Ã÷µÄ¡£
04. static void *
05. ngx_palloc_large(ngx_pool_t *pool, size_t size)
06. {
07. void *p;
08. ngx_uint_t n;
09. ngx_pool_large_t *large;
10.
11. p = ngx_alloc(size, pool->log); //ÏÂÎĽô½Ó׎«·ÖÎö´Ëngx_allocº¯Êý
12. if (p == NULL) {
13. return NULL;
14. }
15.
16. n = 0;
17.
18. //ÒÔϼ¸ÐУ¬½«·ÖÅäµÄÄÚ´æÁ´ÈëpoolµÄlargeÁ´ÖУ¬
19. //ÕâÀïָԭʼpoolÔÚ֮ǰÒѾ­·ÖÅä¹ýlargeÄÚ´æµÄÇé¿ö¡£
20. for (large = pool->large; large; large = large->next) {
21. if (large->alloc == NULL) {
22. large->alloc = p;
23. return p;
24. }
25.
26. if (n++ > 3) {
27. break;
28. }
29. }
30.
31. //Èç¹û¸Ãpool֮ǰ²¢Î´·ÖÅälargeÄڴ棬Ôò¾ÍûÓÐngx_pool_large_tÀ´¹ÜÀí´ó¿éÄÚ´æ
32. //Ö´ÐÐngx_pool_large_t½á¹¹ÌåµÄ·ÖÅ䣬ÓÃÓÚÀ´¹ÜÀílargeÄÚ´æ¿é¡£
33. large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
34. if (large == NULL) {
35. ngx_free(p);
36. return NULL;
37. }
38.
39. large->alloc = p;
40. large->next = pool->large;
41. pool->large = large;
42.
43. return p;
44. }

ÉÏÊö´úÂëÖУ¬µ÷ÓÃngx_allocÖ´ÐÐÄÚ´æ·ÖÅ䣺

void *  
02. ngx_alloc(size_t size, ngx_log_t *log)
03. {
04. void *p;
05.
06. p = malloc(size);
07. //´ÓÕâÀï¿ÉÒÔ¿´µ½£¬ngx_allocʵ¼ÊÉϾÍÊǵ÷ÓÃmallocº¯Êý·ÖÅäÄÚ´æµÄ¡£
08.
09. if (p == NULL) {
10. ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
11. "malloc() %uz bytes failed", size);
12. }
13.
14. ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);
15.
16. return p;
17. }

2.4.2¡¢ngx_pcallocÓëngx_pmemalignº¯Êý

ngx_pcallocÊÇÖ±½Óµ÷ÓÃpalloc·ÖÅäºÃÄڴ棬Ȼºó½øÐÐÒ»´Î0³õʼ»¯²Ù×÷¡£ngx_pcallocµÄÔ´ÂëÈçÏ£º

void *  
02. ngx_pcalloc(ngx_pool_t *pool, size_t size)
03. {
04. void *p;
05.
06. p = ngx_palloc(pool, size);
07. if (p) {
08. ngx_memzero(p, size);
09. }
10.
11. return p;
12. }

ngx_pmemalign½«ÔÚ·ÖÅäsize´óСµÄÄÚ´æ²¢°´alignment¶ÔÆë£¬È»ºó¹Òµ½large×Ö¶ÎÏ£¬µ±×ö´ó¿éÄÚ´æ´¦Àí¡£ngx_pmemalignµÄÔ´ÂëÈçÏ£º

void *  
02. ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment)
03. {
04. void *p;
05. ngx_pool_large_t *large;
06.
07. p = ngx_memalign(alignment, size, pool->log);
08. if (p == NULL) {
09. return NULL;
10. }
11.
12. large = ngx_palloc(pool, sizeof(ngx_pool_large_t));
13. if (large == NULL) {
14. ngx_free(p);
15. return NULL;
16. }
17.
18. large->alloc = p;
19. large->next = pool->large;
20. pool->large = large;
21.
22. return p;
23. }

ÆäÓàµÄ²»ÔÙÏêÊö¡£nginxÌṩ¸øÎÒÃÇʹÓõÄÄÚ´æ·ÖÅä½Ó¿Ú£¬¼´ÉÏÊö±¾2.4½ÚÖÐÕâ4ÖÖº¯Êý£¬ÖÁ´Ë£¬¶¼ÒÑ·ÖÎöÍê±Ï¡£

2.5¡¢ÊÍ·ÅÄÚ´æ

if (p == l->alloc) {  
02. ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, pool->log, 0,
03. "free: %p", l->alloc);
04. ngx_free(l->alloc);
05. l->alloc = NULL;
06.
07. return NGX_OK;
08. }
09. }
10.
11. return NGX_DECLINED;

ÐèҪעÒâµÄÊǸú¯ÊýÖ»ÊÍ·ÅlargeÁ´±íÖÐ×¢²áµÄÄڴ棬ÆÕͨÄÚ´æÔÚngx_destroy_poolÖÐͳһÊÍ·Å¡£

2.6¡¢×¢²ácleanup

ngx_pool_cleanup_t *  
02. ngx_pool_cleanup_add(ngx_pool_t *p, size_t size)
03. {
04. ngx_pool_cleanup_t *c;
05.
06. c = ngx_palloc(p, sizeof(ngx_pool_cleanup_t));
07. if (c == NULL) {
08. return NULL;
09. }
10.
11. if (size) {
12. c->data = ngx_palloc(p, size);
13. if (c->data == NULL) {
14. return NULL;
15. }
16.
17. } else {
18. c->data = NULL;
19. }
20.
21. c->handler = NULL;
22. c->next = p->cleanup;
23.
24. p->cleanup = c;
25.
26. ngx_log_debug1(NGX_LOG_DEBUG_ALLOC, p->log, 0, "add cleanup: %p", c);
27.
28. return c;
29. }

2.7¡¢ÎļþÏà¹Ø

һЩÎļþÏà¹ØµÄ²Ù×÷º¯ÊýÈçÏ£¬´Ë´¦¾Í²»ÔÚÏêÊöÁË¡£

void  
02. ngx_pool_run_cleanup_file(ngx_pool_t *p, ngx_fd_t fd)
03. {
04. //....
05. }
06.
07. void
08. ngx_pool_cleanup_file(void *data)
09. {
10. //....
11. }
12.
13. void
14. ngx_pool_delete_file(void *data)
15. {
16. //...
17. }

2.8¡¢ÄÚ´æ³ØµÄÎïÀí½á¹¹

Õë¶Ô±¾ÎÄǰ¼¸½ÚµÄÀý×Ó£¬»­³öµÄÄÚ´æ³ØµÄÎïÀí½á¹¹ÈçÏÂͼ¡£

´Ó¸ÃͼҲÄÜ¿´³ö2.4½ÚµÄ½áÂÛ£¬¼´ÄÚ´æ³ØµÚÒ»¿éÄÚ´æÇ°40×Ö½ÚΪngx_pool_t½á¹¹£¬ºóÐø¼ÓÈëµÄÄÚ´æ¿éǰ16¸ö×Ö½ÚΪngx_pool_data_t½á¹¹£¬ÕâÁ½¸ö½á¹¹Ö®ºó±ãÊÇÕæÕý¿ÉÒÔ·ÖÅäÄÚ´æÇøÓò¡£

È«ÎÄ×ܽá

À´×ÔÌÔ±¦Êý¾Ý¹²ÏíÆ½Ì¨blogÄÚµÄһƪÎÄÕ¶ÔÉÏÊöNginxÔ´ÂëÆÊÎöÖ®ÄÚ´æ³Ø£¬ÓëÄÚ´æ¹ÜÀí×ܽáµÃºÜºÃ£¬ÌØ´ËÒýÓÃÖ®£¬×÷Ϊ¶ÔÉÏÎÄÈ«ÎĵÄÒ»¸ö×ܽ᣺

NginxµÄÄÚ´æ³ØÊµÏֵúܾ«ÇÉ£¬´úÂëÒ²ºÜ¼ò½à¡£×ܵÄÀ´Ëµ£¬ËùÓеÄÄÚ´æ³Ø»ù±¾¶¼Ò»¸ö×ÚÖ¼£ºÉêÇë´ó¿éÄڴ棬±ÜÃ⡰ϸˮ³¤Á÷¡±¡£

3.1¡¢´´½¨Ò»¸öÄÚ´æ³Ø

nginxÄÚ´æ³ØÖ÷ÒªÓÐÏÂÃæÁ½¸ö½á¹¹À´Î¬»¤£¬ËûÃÇ·Ö±ðά»¤ÁËÄÚ´æ³ØµÄÍ·²¿ºÍÊý¾Ý²¿¡£´Ë´¦Êý¾Ý²¿¾ÍÊǹ©Óû§·ÖÅäС¿éÄÚ´æµÄµØ·½¡£

//¸Ã½á¹¹ÓÃÀ´Î¬»¤ÄÚ´æ³ØµÄÊý¾Ý¿é£¬¹©Óû§·ÖÅäÖ®Óᣠ  
02. typedef struct {
03. u_char *last; //µ±Ç°ÄÚ´æ·ÖÅä½áÊøÎ»Ö㬼´ÏÂÒ»¶Î¿É·ÖÅäÄÚ´æµÄÆðʼλÖÃ
04. u_char *end; //ÄÚ´æ³Ø½áÊøÎ»ÖÃ
05. ngx_pool_t *next; //Á´½Óµ½ÏÂÒ»¸öÄÚ´æ³Ø
06. ngx_uint_t failed; //ͳ¼Æ¸ÃÄÚ´æ³Ø²»ÄÜÂú×ã·ÖÅäÇëÇóµÄ´ÎÊý
07. } ngx_pool_data_t;

 

struct ngx_pool_s {  
02. ngx_pool_data_t d; //Êý¾Ý¿é
03. size_t max; //Êý¾Ý¿éµÄ´óС£¬¼´Ð¡¿éÄÚ´æµÄ×î´óÖµ
04. ngx_pool_t *current; //±£´æµ±Ç°ÄÚ´æ³Ø
05. ngx_chain_t *chain; //¿ÉÒÔ¹ÒÒ»¸öchain½á¹¹
06. ngx_pool_large_t *large; //·ÖÅä´ó¿éÄÚ´æÓ㬼´³¬¹ýmaxµÄÄÚ´æÇëÇó
07. ngx_pool_cleanup_t *cleanup; //¹ÒÔØÒ»Ð©ÄÚ´æ³ØÊͷŵÄʱºò£¬Í¬Ê±ÊͷŵÄ×ÊÔ´¡£
08. ngx_log_t *log;
09. };

ÓÐÁËÉÏÃæµÄÁ½¸ö½á¹¹£¬¾Í¿ÉÒÔ´´½¨Ò»¸öÄÚ´æ³ØÁË£¬nginxÓÃÀ´´´½¨Ò»¸öÄÚ´æ³ØµÄ½Ó¿ÚÊÇ£º

ngx_pool_t *ngx_create_pool(size_t size, ngx_log_t   *log)£¨Î»ÓÚsrc/core/ngx_palloc.cÖУ©;

µ÷ÓÃÕâ¸öº¯Êý¾Í¿ÉÒÔ´´½¨Ò»¸ö´óСΪsizeµÄÄÚ´æ³ØÁË¡£

ngx_create_pool½Ó¿Úº¯Êý¾ÍÊÇ·ÖÅäÉÏͼÕâÑùµÄÒ»´ó¿éÄڴ棬Ȼºó³õʼ»¯ºÃ¸÷¸öÍ·²¿×ֶΣ¨ÉÏͼÖеIJÊÉ«²¿·Ö£©¡£ºìÉ«±íʾµÄËĸö×ֶξÍÊÇÀ´×ÔÓÚÉÏÊöµÄµÚÒ»¸ö½á¹¹£¬Î¬»¤Êý¾Ý²¿·Ö£¬ÓÉͼ¿ÉÖª£ºlastÊÇÓû§´ÓÄÚ´æ³Ø·ÖÅäÐÂÄÚ´æµÄ¿ªÊ¼Î»Öã¬endÊÇÕâ¿éÄÚ´æ³ØµÄ½áÊøÎ»Öã¬ËùÓзÖÅäµÄÄÚ´æ¶¼²»Äܳ¬¹ýend¡£À¶É«±íʾµÄmax×ֶεÄÖµµÈÓÚÕû¸öÊý¾Ý²¿·ÖµÄ³¤¶È¡£Óû§ÇëÇóµÄÄÚ´æ´óÓÚmaxʱ£¬¾ÍÈÏΪÓû§ÇëÇóµÄÊÇÒ»¸ö´óÄڴ棬´ËʱÐèÒªÔÚ×ÏÉ«±íʾµÄlarge×Ö¶ÎÏÂÃæµ¥¶À·ÖÅ䣻Óû§ÇëÇóµÄÄÚ´æ²»´óÓÚmaxµÄ»°£¬¾ÍÊÇСÄÚ´æÉêÇ룬ֱ½ÓÔÚÊý¾Ý²¿·Ö·ÖÅ䣬´Ëʱ½«»áÒÆ¶¯lastÖ¸Õ루¾ßÌå¼ûÉÏÎÄ2.4.1½Ú£©¡£

3.2¡¢·ÖÅäС¿éÄÚ´æ(size <= max)

ÉÏÃæ´´½¨ºÃÁËÒ»¸ö¿ÉÓõÄÄÚ´æ³ØÁË£¬Ò²Ìáµ½ÁËС¿éÄÚ´æµÄ·ÖÅäÎÊÌâ¡£nginxÌṩ¸øÓû§Ê¹ÓõÄÄÚ´æ·ÖÅä½Ó¿ÚÓУº

void *ngx_palloc(ngx_pool_t *pool, size_t size);
void *ngx_pnalloc(ngx_pool_t *pool, size_t size);
void *ngx_pcalloc(ngx_pool_t *pool, size_t size);
void *ngx_pmemalign(ngx_pool_t *pool, size_t size, size_t alignment);

ngx_pallocºÍngx_pnalloc¶¼ÊÇ´ÓÄÚ´æ³ØÀï·ÖÅäsize´óСÄڴ棬ÖÁÓڷֵõÄÊÇС¿éÄڴ滹ÊÇ´ó¿éÄڴ棬½«È¡¾öÓÚsizeµÄ´óС£»

ËûÃǵIJ»Í¬Ö®´¦ÔÚÓÚ£¬pallocÈ¡µÃµÄÄÚ´æÊÇ¶ÔÆëµÄ£¬pnallocÔò·ñ¡£

ngx_pcallocÊÇÖ±½Óµ÷ÓÃpalloc·ÖÅäºÃÄڴ棬Ȼºó½øÐÐÒ»´Î0³õʼ»¯²Ù×÷¡£

ngx_pmemalign½«ÔÚ·ÖÅäsize´óСµÄÄÚ´æ²¢°´alignment¶ÔÆë£¬È»ºó¹Òµ½large×Ö¶ÎÏ£¬µ±×ö´ó¿éÄÚ´æ´¦Àí¡£ÏÂÃæÓÃͼÐÎչʾһÏ·ÖÅäС¿éÄÚ´æµÄÄ£ÐÍ£º

ÉÏͼÕâ¸öÄÚ´æ³ØÄ£ÐÍÊÇÓÉÉÏ3¸öСÄÚ´æ³Ø¹¹³ÉµÄ£¬ÓÉÓÚµÚÒ»¸öÄÚ´æ³ØÉÏÊ£ÓàµÄÄÚ´æ²»¹»·ÖÅäÁË£¬ÓÚÊǾʹ´½¨Á˵ڶþ¸öеÄÄÚ´æ³Ø£¬µÚÈý¸öÄÚ´æ³ØÊÇÓÉÓÚÇ°ÃæÁ½¸öÄÚ´æ³ØµÄÊ£Óಿ·Ö¶¼²»¹»·ÖÅ䣬ËùÒÔ´´½¨Á˵ÚÈý¸öÄÚ´æ³ØÀ´Âú×ãÓû§µÄÐèÇó¡£

ÓÉͼ¿É¼û£ºËùÓеÄСÄÚ´æ³ØÊÇÓÉÒ»¸öµ¥ÏòÁ´±íά»¤ÔÚÒ»ÆðµÄ¡£ÕâÀﻹÓÐÁ½¸ö×Ö¶ÎÐèÒª¹Ø×¢£¬failedºÍcurrent×ֶΡ£failed±íʾµÄÊǵ±Ç°Õâ¸öÄÚ´æ³ØµÄÊ£Óà¿ÉÓÃÄÚ´æ²»ÄÜÂú×ãÓû§·ÖÅäÇëÇóµÄ´ÎÊý£¬¼´ÊÇ˵£ºÒ»¸ö·ÖÅäÇëÇóµ½À´ºó£¬ÔÚÕâ¸öÄÚ´æ³ØÉÏ·ÖÅä²»µ½ÏëÒªµÄÄڴ棬ÄÇô¾Ífailed¾Í»áÔö¼Ó1£»Õâ¸ö·ÖÅäÇëÇ󽫻áµÝ½»¸øÏÂÒ»¸öÄÚ´æ³ØÈ¥´¦Àí£¬Èç¹ûÏÂÒ»¸öÄÚ´æ³ØÒ²²»ÄÜÂú×㣬ÄÇôËüµÄfailedÒ²»á¼Ó1£¬È»ºó½«ÇëÇó¼ÌÐøÍùÏ´«µÝ£¬Ö±µ½Âú×ãÇëÇóΪֹ£¨Èç¹ûûÓÐÏֳɵÄÄÚ´æ³ØÀ´Âú×㣬»áÔÙ´´½¨Ò»¸öеÄÄÚ´æ³Ø£©¡£

current×ֶλáËæ×ÅfailedµÄÔö¼Ó¶ø·¢Éú¸Ä±ä£¬Èç¹ûcurrentÖ¸ÏòµÄÄÚ´æ³ØµÄfailed´ïµ½ÁË4µÄ»°£¬current¾ÍÖ¸ÏòÏÂÒ»¸öÄÚ´æ³ØÁË¡£²Â²â£º4Õâ¸öÖµÓ¦¸ÃÊÇNginx×÷Õߵľ­ÑéÖµ£¬»òÕßÊÇÒ»¸öͳ¼ÆÖµ£¨Ïê¼ûÉÏÎÄ2.4.1½Úa²¿·Ö£©¡£

3.3¡¢´ó¿éÄÚ´æµÄ·ÖÅä(size > max)

´ó¿éÄÚ´æµÄ·ÖÅäÇëÇó²»»áÖ±½ÓÔÚÄÚ´æ³ØÉÏ·ÖÅäÄÚ´æÀ´Âú×㣬¶øÊÇÖ±½ÓÏò²Ù×÷ϵͳÉêÇëÕâôһ¿éÄڴ棨¾ÍÏñÖ±½ÓʹÓÃmalloc·ÖÅäÄÚ´æÒ»Ñù£©£¬È»ºó½«Õâ¿éÄÚ´æ¹Òµ½ÄÚ´æ³ØÍ·²¿µÄlarge×Ö¶ÎÏ¡£ÄÚ´æ³ØµÄ×÷ÓÃÔÚÓÚ½â¾öС¿éÄÚ´æ³ØµÄƵ·±ÉêÇëÎÊÌ⣬¶ÔÓÚÕâÖÖ´ó¿éÄڴ棬ÊÇ¿ÉÒÔÈÌÊÜÖ±½ÓÉêÇëµÄ¡£

ͬÑù£¬ÓÃͼÐÎչʾ´ó¿éÄÚ´æÉêÇëÄ£ÐÍ£º

×¢Òâÿ¿é´óÄÚ´æ¶¼¶ÔÓ¦ÓÐÒ»¸öÍ·²¿½á¹¹£¨next&alloc£©£¬Õâ¸öÍ·²¿½á¹¹ÊÇÓÃÀ´½«ËùÓдóÄÚ´æ´®³ÉÒ»¸öÁ´±íÓõġ£

Õâ¸öÍ·²¿½á¹¹²»ÊÇÖ±½ÓÏò²Ù×÷ϵͳÉêÇëµÄ£¬¶øÊǵ±×öС¿éÄڴ棨ͷ²¿½á¹¹Ã»¼¸¸ö×Ö½Ú£©Ö±½ÓÔÚÄÚ´æ³ØÀïÉêÇëµÄ¡£

ÕâÑùµÄ´ó¿éÄÚ´æÔÚʹÓÃÍêºó£¬¿ÉÄÜÐèÒªµÚһʱ¼äÊÍ·Å£¬½ÚÊ¡ÄÚ´æ¿Õ¼ä£¬Òò´ËnginxÌṩÁ˽ӿں¯Êý£º

ngx_int_t ngx_pfree(ngx_pool_t *pool,  void *p)£»

´Ëº¯ÊýרÃÅÓÃÀ´ÊÍ·Åij¸öÄÚ´æ³ØÉϵÄij¸ö´ó¿éÄڴ棬p¾ÍÊÇ´óÄÚ´æµÄµØÖ·¡£

ngx_pfreeÖ»»áÊÍ·Å´óÄڴ棬²»»áÊÍ·ÅÆä¶ÔÓ¦µÄÍ·²¿½á¹¹£¬±Ï¾¹Í·²¿½á¹¹Êǵ±×öСÄÚ´æÔÚÄÚ´æ³ØÀïÉêÇëµÄ£»ÒÅÁôÏÂÀ´µÄÍ·²¿½á¹¹»á×÷ÏÂÒ»´ÎÉêÇë´óÄÚ´æÖ®Óá£

3.4¡¢cleanup×ÊÔ´

¿ÉÒÔ¿´µ½ËùÓйÒÔØÔÚÄÚ´æ³ØÉϵÄ×ÊÔ´½«ÐγÉÒ»¸öÑ­»·Á´±í£¬Ò»Â·×ßÀ´£¬·¢ÏÖÁ´±íÕâÖÖ¿´ËƼòµ¥µÄÊý¾Ý½á¹¹È´±»Æµ·±Ê¹Óá£

ÓÉͼ¿ÉÖª£¬Ã¿¸öÐèÒªÇåÀíµÄ×ÊÔ´¶¼¶ÔÓ¦ÓÐÒ»¸öÍ·²¿½á¹¹£¬Õâ¸ö½á¹¹ÖÐÓÐÒ»¸ö¹Ø¼üµÄ×Ö¶Îhandler£¬handlerÊÇÒ»¸öº¯ÊýÖ¸Õ룬ÔÚ¹ÒÔØÒ»¸ö×ÊÔ´µ½ÄÚ´æ³ØÉϵÄʱºò£¬Í¬Ê±Ò²»á×¢²áÒ»¸öÇåÀí×ÊÔ´µÄº¯Êýµ½Õâ¸öhandlerÉÏ¡£¼´ÊÇ˵£¬ÄÚ´æ³ØÔÚÇåÀícleanupµÄʱºò£¬¾ÍÊǵ÷ÓÃÕâ¸öhandlerÀ´ÇåÀí¶ÔÓ¦µÄ×ÊÔ´¡£

±ÈÈ磺ÎÒÃÇ¿ÉÒÔ½«Ò»¸ö¿ª´òµÄÎļþÃèÊö·û×÷Ϊ×ÊÔ´¹ÒÔØµ½ÄÚ´æ³ØÉÏ£¬Í¬Ê±Ìṩһ¸ö¹Ø±ÕÎļþÃèÊöµÄº¯Êý×¢²áµ½handlerÉÏ£¬ÄÇôÄÚ´æ³ØÔÚÊͷŵÄʱºò£¬¾Í»áµ÷ÓÃÎÒÃÇÌṩµÄ¹Ø±ÕÎļþº¯ÊýÀ´´¦ÀíÎļþÃèÊö·û×ÊÔ´ÁË¡£

3.5¡¢ÄÚ´æµÄÊÍ·Å

nginxÖ»Ìṩ¸øÁËÓû§ÉêÇëÄÚ´æµÄ½Ó¿Ú£¬È´Ã»ÓÐÊÍ·ÅÄÚ´æµÄ½Ó¿Ú£¬ÄÇônginxÊÇÈçºÎÍê³ÉÄÚ´æÊͷŵÄÄØ£¿×ܲ»ÄÜÒ»Ö±ÉêÇ룬Óò»ÊͷŰ¡¡£Õë¶ÔÕâ¸öÎÊÌ⣬nginxÀûÓÃÁËweb serverÓ¦ÓõÄÌØÊⳡ¾°À´Íê³É£»

Ò»¸öweb server×ÜÊDz»Í£µÄ½ÓÊÜconnectionºÍrequest£¬ËùÒÔnginx¾Í½«ÄÚ´æ³Ø·ÖÁ˲»Í¬µÄµÈ¼¶£¬Óнø³Ì¼¶µÄÄÚ´æ³Ø¡¢connection¼¶µÄÄÚ´æ³Ø¡¢request¼¶µÄÄÚ´æ³Ø¡£

Ò²¾ÍÊÇ˵£¬´´½¨ºÃÒ»¸öworker½ø³ÌµÄʱºò£¬Í¬Ê±ÎªÕâ¸öworker½ø³Ì´´½¨Ò»¸öÄÚ´æ³Ø£¬´ýÓÐеÄÁ¬½Óµ½À´ºó£¬¾ÍÔÚworker½ø³ÌµÄÄÚ´æ³ØÉÏΪ¸ÃÁ¬½Ó´´½¨ÆðÒ»¸öÄÚ´æ³Ø£»Á¬½ÓÉϵ½À´Ò»¸örequestºó£¬ÓÖÔÚÁ¬½ÓµÄÄÚ´æ³ØÉÏΪrequest´´½¨ÆðÒ»¸öÄÚ´æ³Ø¡£

ÕâÑù£¬ÔÚrequest±»´¦ÀíÍêºó£¬¾Í»áÊÍ·ÅrequestµÄÕû¸öÄÚ´æ³Ø£¬Á¬½Ó¶Ï¿ªºó£¬¾Í»áÊÍ·ÅÁ¬½ÓµÄÄÚ´æ³Ø¡£Òò¶ø£¬¾Í±£Ö¤ÁËÄÚ´æÓзÖÅäÒ²ÓÐÊÍ·Å¡£

С½á£ºÍ¨¹ýÄÚ´æµÄ·ÖÅäºÍÊÍ·Å¿ÉÒÔ¿´³ö£¬nginxÖ»Êǽ«Ð¡¿éÄÚ´æµÄÉêÇë¾Û¼¯µ½Ò»ÆðÉêÇ룬ȻºóÒ»ÆðÊÍ·Å¡£±ÜÃâÁËÆµ·±ÉêÇëСÄڴ棬½µµÍÄÚ´æË鯬µÄ²úÉúµÈÎÊÌâ¡£

   
2852 ´Îä¯ÀÀ       58
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

ר¼ÒÊӽǿ´ITÓë¼Ü¹¹
Èí¼þ¼Ü¹¹Éè¼Æ
ÃæÏò·þÎñÌåϵ¼Ü¹¹ºÍÒµÎñ×é¼þ
ÈËÈËÍøÒÆ¶¯¿ª·¢¼Ü¹¹
¼Ü¹¹¸¯»¯Ö®ÃÕ
̸ƽ̨¼´·þÎñPaaS


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


Èñ°²¿Æ¼¼ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨
³É¶¼ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£Æû³µ ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
±±¾© Èí¼þ¼Ü¹¹Éè¼Æ
ÉϺ£ Èí¼þ¼Ü¹¹Éè¼Æ°¸ÀýÓëʵ¼ù
±±¾© ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ÉîÛÚ ¼Ü¹¹Éè¼Æ·½·¨°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù