# æä½ç³»ç»é¢è¯é¢
æä½ç³»ç»è¿åå 容ï¼å¨é¢è¯éçåå¨æææ¶åä¸å¦ MySQL å Redis é£ä¹å¼ºï¼ä½éå°äºå¾å¾è½æå¼å·®è·ãå°¤å ¶æ¯æ ¡æï¼è¿ç¨ãå å管çãæ»éè¿äºé¢ç®æ¯æ é ï¼ç¤¾æçè¯ä¹ä¼å¨ç³»ç»è®¾è®¡æåºå±åçä¸è¢«è¿½é®å°ã
è¿ç¯æç« æ´çäºæä½ç³»ç»é¢è¯ä¸æå¸¸è¢«é®å°çç¥è¯ç¹ï¼å æ¬ç¨æ·æä¸å æ ¸æãè¿ç¨ä¸çº¿ç¨ãé䏿»éãå å管çã䏿ï¼ä»¥åæå¡å¨ IO 模åï¼æ´ä½è¦çæ¯è¾å ¨é¢ãå 容ååçè§£åçï¼ä¸æ¯è®©ä½ èæ¦å¿µï¼èæ¯å¸®ä½ ææ¸ æ¥"为ä»ä¹æ¯è¿æ ·"ã
æå åå 容å¨é¢è¯éåºç°é¢çæé«ï¼å»ºè®®éç¹è±æ¶é´ï¼
- è¿ç¨ä¸çº¿ç¨ï¼ä¸¤è çåºå«ãåç¨æ¯ä»ä¹ãè¿ç¨é´éä¿¡çå ç§æ¹å¼ï¼ç®¡é/å ±äº«å å/ä¿¡å·é/socketï¼ï¼è¿æè¿ç¨è°åº¦ç®æ³ï¼è¿åé®å¾é常é¢ç¹ã
- é䏿»éï¼æ»éçåä¸ªå¿ è¦æ¡ä»¶ãå¦ä½é¿å æ»éãèªæéåäºæ¥éçåºå«ï¼ä»¥åé¶è¡å®¶ç®æ³ï¼è¿äºé½æ¯ç»å ¸èç¹ã
- å å管çï¼èæå ååç©çå åçå ³ç³»ã页表çå·¥ä½åçãç¼ºé¡µä¸æãåæ¶å¤å¶ï¼Copy On Writeï¼ï¼è¿æ malloc åºå±ç brk å mmap æºå¶ã
- IO 模åï¼select/poll/epoll çåºå«ãè¾¹ç¼è§¦ååæ°´å¹³è§¦åï¼ä»¥åé¶æ·è´çåçï¼è¿æ¯çè§£é«æ§è½æå¡å¨ï¼RedisãNginxãNettyï¼çåºç¡ã
å¦æä½ æ¯ç¬¬ä¸æ¬¡ç³»ç»å¤ä¹ æä½ç³»ç»ï¼å»ºè®®å æè¿ç¨çº¿ç¨åå å管çè¿ä¸¤åæéï¼å®ä»¬æ¯æ´ä¸ªæä½ç³»ç»ç¥è¯ä½ç³»çæ ¸å¿ï¼å ¶ä»å 容ç解起æ¥ä¹ä¼é¡ºå¾å¤ã
# ç¨æ·æåå æ ¸æ
# ç¨æ·æåå æ ¸æçåºå«ï¼
å æ ¸æåç¨æ·ææ¯æä½ç³»ç»ä¸ç两ç§è¿è¡æ¨¡å¼ãå®ä»¬ç主è¦åºå«å¨äºæéå坿§è¡çæä½ï¼
- å æ ¸æï¼Kernel Modeï¼ï¼å¨å æ ¸æä¸ï¼CPUå¯ä»¥æ§è¡ææçæä»¤åè®¿é®ææçç¡¬ä»¶èµæºãè¿ç§æ¨¡å¼ä¸çæä½å ·ææ´é«çæéï¼ä¸»è¦ç¨äºæä½ç³»ç»å æ ¸çè¿è¡ã
- ç¨æ·æï¼User Modeï¼ï¼å¨ç¨æ·æä¸ï¼CPUåªè½æ§è¡é¨åæä»¤éï¼æ æ³ç´æ¥è®¿é®ç¡¬ä»¶èµæºãè¿ç§æ¨¡å¼ä¸çæä½æéè¾ä½ï¼ä¸»è¦ç¨äºè¿è¡ç¨æ·ç¨åºã
å æ ¸æçåºå±æä½ä¸»è¦å æ¬ï¼å å管çãè¿ç¨ç®¡çã设å¤é©±å¨ç¨åºæ§å¶ãç³»ç»è°ç¨çãè¿äºæä½æ¶åå°æä½ç³»ç»çæ ¸å¿åè½ï¼éè¦è¾é«çæéæ¥æ§è¡ã
åä¸ºå æ ¸æåç¨æ·æçåå ä¸»è¦æä»¥ä¸å ç¹ï¼
- å®å ¨æ§ï¼éè¿å¯¹æéçååï¼ç¨æ·ç¨åºæ æ³ç´æ¥è®¿é®ç¡¬ä»¶èµæºï¼ä»èé¿å äºæ¶æç¨åºå¯¹ç³»ç»èµæºçç ´åã
- ç¨³å®æ§ï¼ç¨æ·æç¨åºåºç°é®é¢æ¶ï¼ä¸ä¼å½±åå°æ´ä¸ªç³»ç»ï¼é¿å äºç¨åºæ é导è´ç³»ç»å´©æºçé£é©ã
- é离æ§ï¼å æ ¸æåç¨æ·æçååä½¿å¾æä½ç³»ç»å æ ¸ä¸ç¨æ·ç¨åºä¹é´æäºæç¡®çè¾¹çï¼æå©äºç³»ç»ç模åååç»´æ¤ã
å æ ¸æåç¨æ·æçååæå©äºä¿è¯æä½ç³»ç»çå®å ¨æ§ãç¨³å®æ§åæç»´æ¤æ§ã
# è¿ç¨ç®¡ç
# 线ç¨åè¿ç¨çåºå«æ¯ä»ä¹ï¼

- æ¬è´¨åºå«ï¼è¿ç¨æ¯æä½ç³»ç»èµæºåé çåºæ¬åä½ï¼èçº¿ç¨æ¯ä»»å¡è°åº¦åæ§è¡çåºæ¬åä½
- å¨å¼éæ¹é¢ï¼æ¯ä¸ªè¿ç¨é½æç¬ç«ç代ç åæ°æ®ç©ºé´ï¼ç¨åºä¸ä¸æï¼ï¼ç¨åºä¹é´ç忢伿è¾å¤§çå¼éï¼çº¿ç¨å¯ä»¥çåè½»é级çè¿ç¨ï¼åä¸ç±»çº¿ç¨å ±äº«ä»£ç åæ°æ®ç©ºé´ï¼æ¯ä¸ªçº¿ç¨é½æèªå·±ç¬ç«çè¿è¡æ åç¨åºè®¡æ°å¨ï¼PCï¼ï¼çº¿ç¨ä¹é´åæ¢çå¼éå°
- ç¨³å®æ§æ¹é¢ï¼è¿ç¨ä¸æä¸ªçº¿ç¨å¦æå´©æºäºï¼å¯è½ä¼å¯¼è´æ´ä¸ªè¿ç¨é½å´©æºãèè¿ç¨ä¸çåè¿ç¨å´©æºï¼å¹¶ä¸ä¼å½±åå ¶ä»è¿ç¨ã
- å ååé æ¹é¢ï¼ç³»ç»å¨è¿è¡çæ¶åä¼ä¸ºæ¯ä¸ªè¿ç¨åé ä¸åçå å空é´ï¼è对线ç¨èè¨ï¼é¤äºCPUå¤ï¼ç³»ç»ä¸ä¼ä¸ºçº¿ç¨åé å åï¼çº¿ç¨æä½¿ç¨çèµæºæ¥èªå ¶æå±è¿ç¨çèµæºï¼ï¼çº¿ç¨ç»ä¹é´åªè½å ±äº«èµæº
- å å«å ³ç³»ï¼æ²¡æçº¿ç¨çè¿ç¨å¯ä»¥ç忝å线ç¨çï¼å¦æä¸ä¸ªè¿ç¨å æå¤ä¸ªçº¿ç¨ï¼åæ§è¡è¿ç¨ä¸æ¯ä¸æ¡çº¿çï¼èæ¯å¤æ¡çº¿
# è¿ç¨ï¼çº¿ç¨ï¼åç¨çåºå«æ¯ä»ä¹ï¼
- é¦å ï¼æä»¬æ¥è°è°è¿ç¨ãè¿ç¨æ¯æä½ç³»ç»ä¸è¿è¡èµæºåé åè°åº¦çåºæ¬åä½ï¼å®æ¥æèªå·±çç¬ç«å å空é´åç³»ç»èµæºãæ¯ä¸ªè¿ç¨é½æç¬ç«çå åæ ï¼ä¸ä¸å ¶ä»è¿ç¨å ±äº«ãè¿ç¨é´éä¿¡éè¦éè¿ç¹å®çæºå¶ï¼å¦ç®¡éãæ¶æ¯éåãä¿¡å·éçãç±äºè¿ç¨æ¥æç¬ç«çå å空é´ï¼å æ¤å ¶ç¨³å®æ§åå®å ¨æ§ç¸å¯¹è¾é«ï¼ä½åæ¶ä¸ä¸æåæ¢çå¼éä¹è¾å¤§ï¼å 为éè¦ä¿å忢夿´ä¸ªè¿ç¨çç¶æã
- æ¥ä¸æ¥æ¯çº¿ç¨ãçº¿ç¨æ¯è¿ç¨å çä¸ä¸ªæ§è¡åå ï¼ä¹æ¯CPUè°åº¦ååæ´¾çåºæ¬åä½ãä¸è¿ç¨ä¸åï¼çº¿ç¨å ±äº«è¿ç¨çå å空é´ï¼å æ¬å åå ¨å±åéã线ç¨ä¹é´éä¿¡æ´å 髿ï¼å 为å®ä»¬å¯ä»¥ç´æ¥è¯»åå ±äº«å åã线ç¨çä¸ä¸æåæ¢å¼éè¾å°ï¼å 为åªéè¦ä¿å忢å¤çº¿ç¨çä¸ä¸æï¼è䏿¯æ´ä¸ªè¿ç¨çç¶æãç¶èï¼ç±äºå¤ä¸ªçº¿ç¨å ±äº«å å空é´ï¼å æ¤å卿°æ®ç«äºå线ç¨å®å ¨çé®é¢ï¼éè¦éè¿åæ¥åäºæ¥æºå¶æ¥è§£å³ã
- æåæ¯åç¨ãåç¨æ¯ä¸ç§ç¨æ·æçè½»é级线ç¨ï¼å ¶è°åº¦å®å ¨ç±ç¨æ·ç¨åºæ§å¶ï¼èä¸éè¦å æ ¸çåä¸ãåç¨æ¥æèªå·±çå¯åå¨ä¸ä¸æåæ ï¼ä½ä¸å ¶ä»åç¨å ±äº«å å åãåç¨ç忢å¼éé常å°ï¼å 为åªéè¦ä¿å忢å¤åç¨çä¸ä¸æï¼èæ éè¿è¡å æ ¸çº§çä¸ä¸æåæ¢ãè¿ä½¿å¾åç¨å¨å¤ç大éå¹¶å任塿¶å ·æé常é«çæçãç¶èï¼åç¨éè¦ç¨åºåæ¾å¼å°è¿è¡è°åº¦å管çï¼ç¸å¯¹äºçº¿ç¨åè¿ç¨æ¥è¯´ï¼å ¶ç¼ç¨æ¨¡åæ´ä¸ºå¤æã
# 为ä»ä¹è¿ç¨å´©æºä¸ä¼å¯¹å ¶ä»è¿ç¨äº§çå¾å¤§å½±å
ä¸»è¦æ¯å 为ï¼
- è¿ç¨é离æ§ï¼æ¯ä¸ªè¿ç¨é½æèªå·±ç¬ç«çå å空é´ï¼å½ä¸ä¸ªè¿ç¨å´©æºæ¶ï¼å ¶å å空é´ä¼è¢«æä½ç³»ç»åæ¶ï¼ä¸ä¼å½±åå ¶ä»è¿ç¨çå å空é´ãè¿ç§è¿ç¨é´çé离æ§ä¿è¯äºä¸ä¸ªè¿ç¨å´©æºä¸ä¼ç´æ¥å½±åå ¶ä»è¿ç¨çæ§è¡ã
- è¿ç¨ç¬ç«æ§ï¼æ¯ä¸ªè¿ç¨é½æ¯ç¬ç«è¿è¡çï¼å®ä»¬ä¹é´ä¸ä¼å ±äº«èµæºï¼å¦æä»¶ãç½ç»è¿æ¥çãå æ¤ï¼ä¸ä¸ªè¿ç¨çå´©æºé常ä¸ä¼å¯¹å ¶ä»è¿ç¨çèµæºäº§çå½±åã
# ä½ è¯´å°è¿ç¨æ¯åé èµæºçåºæ¬åä½ï¼é£ä¹è¿ä¸ªèµæºæçæ¯ä»ä¹ï¼
èæå åãæä»¶å¥æãä¿¡å·éçèµæºã
# 讲ä¸ä¸ºä»ä¹è¿ç¨ä¹ä¸è¿è¦è®¾è®¡çº¿ç¨ï¼
æä»¬ä¸¾ä¸ªä¾åï¼åè®¾ä½ è¦ç¼åä¸ä¸ªè§é¢ææ¾å¨è½¯ä»¶ï¼é£ä¹è¯¥è½¯ä»¶åè½çæ ¸å¿æ¨¡åæä¸ä¸ªï¼
- ä»è§é¢æä»¶å½ä¸è¯»åæ°æ®ï¼
- 对读åçæ°æ®è¿è¡è§£å缩ï¼
- æè§£å缩åçè§é¢æ°æ®ææ¾åºæ¥ï¼
对äºåè¿ç¨çå®ç°æ¹å¼ï¼ææ³å¤§å®¶é½ä¼æ¯ä»¥ä¸è¿ä¸ªæ¹å¼ï¼

对äºåè¿ç¨çè¿ç§æ¹å¼ï¼åå¨ä»¥ä¸é®é¢ï¼
- ææ¾åºæ¥çç»é¢å声é³ä¼ä¸è¿è´¯ï¼å ä¸ºå½ CPU è½åä¸å¤å¼ºçæ¶åï¼Read çæ¶åå¯è½è¿ç¨å°±çå¨è¿äºï¼è¿æ ·å°±ä¼å¯¼è´çå天æè¿è¡æ°æ®è§£ååææ¾ï¼
- åä¸ªå½æ°ä¹é´ä¸æ¯å¹¶åæ§è¡ï¼å½±åèµæºçä½¿ç¨æçï¼
飿¹è¿æå¤è¿ç¨çæ¹å¼ï¼

对äºå¤è¿ç¨çè¿ç§æ¹å¼ï¼ä¾ç¶ä¼åå¨é®é¢ï¼
- è¿ç¨ä¹é´å¦ä½éä¿¡ï¼å ±äº«æ°æ®ï¼
- ç»´æ¤è¿ç¨çç³»ç»å¼éè¾å¤§ï¼å¦å建è¿ç¨æ¶ï¼åé èµæºãå»ºç« PCBï¼ç»æ¢è¿ç¨æ¶ï¼åæ¶èµæºãæ¤é PCBï¼è¿ç¨åæ¢æ¶ï¼ä¿åå½åè¿ç¨çç¶æä¿¡æ¯ï¼
é£å°åºå¦ä½è§£å³å¢ï¼éè¦æä¸ç§æ°çå®ä½ï¼æ»¡è¶³ä»¥ä¸ç¹æ§ï¼
- å®ä½ä¹é´å¯ä»¥å¹¶åè¿è¡ï¼
- å®ä½ä¹é´å ±äº«ç¸åçå°å空é´ï¼
è¿ä¸ªæ°çå®ä½ï¼å°±æ¯çº¿ç¨( Thread )ï¼çº¿ç¨ä¹é´å¯ä»¥å¹¶åè¿è¡ä¸å ±äº«ç¸åçå°å空é´ã
# å¤çº¿ç¨æ¯å线ç¨çä¼å¿ï¼å£å¿ï¼
- å¤çº¿ç¨æ¯å线ç¨çä¼å¿ï¼æé«ç¨åºçè¿è¡æçï¼å¯ä»¥å åå©ç¨å¤æ ¸å¤çå¨çèµæºï¼åæ¶å¤çå¤ä¸ªä»»å¡ï¼å å¿«ç¨åºçæ§è¡é度ã
- å¤çº¿ç¨æ¯å线ç¨çå£å¿ï¼åå¨å¤çº¿ç¨æ°æ®ç«äºè®¿é®çé®é¢ï¼éè¦éè¿éæºå¶æ¥ä¿è¯çº¿ç¨å®å ¨ï¼å¢å äºå éçå¼éï¼å¹¶ä¸è¿ä¼ææ»éçé£é©ãå¤çº¿ç¨ä¼æ¶èæ´å¤ç³»ç»èµæºï¼å¦CPUåå åï¼å 为æ¯ä¸ªçº¿ç¨é½éè¦å ç¨ä¸å®çå ååå¤çæ¶é´ã
# å¤çº¿ç¨æ¯ä¸æ¯è¶å¤è¶å¥½ï¼å¤ªå¤ä¼æä»ä¹é®é¢ï¼
å¤çº¿ç¨ä¸ä¸å®è¶å¤è¶å¥½ï¼è¿å¤ç线ç¨å¯è½ä¼å¯¼è´ä¸äºé®é¢ã
- 忢å¼éï¼çº¿ç¨çå建å忢伿¶èç³»ç»èµæºï¼å æ¬å ååCPUã妿å建太å¤çº¿ç¨ï¼ä¼å ç¨å¤§éçç³»ç»èµæºï¼å¯¼è´ç³»ç»è´è½½è¿é«ï¼æä¸ªçº¿ç¨å´©æºåï¼å¯è½ä¼å¯¼è´è¿ç¨å´©æºã
- æ»éçé®é¢ï¼è¿å¤ç线ç¨å¯è½ä¼å¯¼è´ç«äºæ¡ä»¶åæ»éãç«äºæ¡ä»¶æçæ¯å¤ä¸ªçº¿ç¨åæ¶è®¿é®åä¿®æ¹å ±äº«èµæºï¼å¦ææ²¡æåéç忥æºå¶ï¼å¯è½ä¼å¯¼è´æ°æ®ä¸ä¸è´æé误çç»æãèæ»é忝æå¤ä¸ªçº¿ç¨ç¸äºçå¾ å¯¹æ¹éæ¾èµæºï¼å¯¼è´ç¨åºæ æ³ç»§ç»æ§è¡ã
# è¿ç¨åæ¢å线ç¨åæ¢çåºå«ï¼
- è¿ç¨åæ¢ï¼è¿ç¨åæ¢æ¶åå°æ´å¤çå 容ï¼å æ¬æ´ä¸ªè¿ç¨çå°å空é´ãå ¨å±åéãæä»¶æè¿°ç¬¦çãå æ¤ï¼è¿ç¨åæ¢çå¼éé常æ¯çº¿ç¨åæ¢å¤§ã
- 线ç¨åæ¢ï¼çº¿ç¨åæ¢åªæ¶åå°çº¿ç¨çå æ ãå¯åå¨åç¨åºè®¡æ°å¨çï¼ä¸æ¶åè¿ç¨çº§å«çèµæºï¼å æ¤çº¿ç¨åæ¢çå¼éè¾å°ã
# 线ç¨åæ¢ä¸ºä»ä¹æ¯è¿ç¨åæ¢å¿«ï¼èçäºä»ä¹èµæºï¼
线ç¨åæ¢æ¯è¿ç¨åæ¢å¿«æ¯å 为线ç¨å ±äº«åä¸è¿ç¨çå°å空é´åèµæºï¼çº¿ç¨åæ¢æ¶åªéåæ¢å æ åç¨åºè®¡æ°å¨çå°éä¿¡æ¯ï¼èä¸éè¦åæ¢å°å空é´ï¼é¿å äºè¿ç¨åæ¢æ¶éè¦åæ¢å åæ å°è¡¨ç大éèµæºçå¼éï¼ä»èèçäºæ¶é´åç³»ç»èµæºã
# 线ç¨åæ¢è¯¦ç»è¿ç¨æ¯æä¹æ ·çï¼ä¸ä¸æä¿åå¨åªéï¼

线ç¨åæ¢ç详ç»è¿ç¨å¯ä»¥å为以ä¸å 个æ¥éª¤ï¼
- ä¸ä¸æä¿åï¼å½æä½ç³»ç»å³å®åæ¢å°å¦ä¸ä¸ªçº¿ç¨æ¶ï¼å®é¦å ä¼ä¿åå½å线ç¨çä¸ä¸æä¿¡æ¯ãä¸ä¸æä¿¡æ¯å æ¬å¯åå¨ç¶æãç¨åºè®¡æ°å¨ãå æ æéçï¼ç¨äºä¿å线ç¨çæ§è¡ç¶æã
- 忢å°è°åº¦å¨ï¼æä½ç³»ç»å°æ§è¡æåæ¢å°è°åº¦å¨ï¼Schedulerï¼ãè°åº¦å¨è´è´£éæ©ä¸ä¸ä¸ªè¦æ§è¡ç线ç¨ï¼å¹¶æ ¹æ®è°åº¦ç®æ³ååºå³çã
- ä¸ä¸ææ¢å¤ï¼è°åº¦å¨éæ©äºä¸ä¸ä¸ªè¦æ§è¡ç线ç¨åï¼å®ä¼ä»è¯¥çº¿ç¨ä¿åçä¸ä¸æä¿¡æ¯ä¸æ¢å¤çº¿ç¨çæ§è¡ç¶æã
- 忢尿°çº¿ç¨ï¼è°åº¦å¨å°æ§è¡æåæ¢å°æ°çº¿ç¨ï¼ä½¿å ¶å¼å§æ§è¡ã
ä¸ä¸æä¿¡æ¯çä¿åéå¸¸ç±æä½ç³»ç»è´è´£ç®¡çï¼å ·ä½ä¿åå¨åªéåå³äºæä½ç³»ç»çå®ç°æ¹å¼ãä¸è¬æ åµä¸ï¼ä¸ä¸æä¿¡æ¯ä¼ä¿åå¨çº¿ç¨çæ§å¶åï¼Thread Control Blockï¼TCBï¼ä¸ã
TCBæ¯æä½ç³»ç»ç¨äºç®¡ç线ç¨çæ°æ®ç»æï¼å å«äºçº¿ç¨çç¶æãå¯åå¨çå¼ãå æ ä¿¡æ¯çãå½åç线ç¨åæ¢æ¶ï¼æä½ç³»ç»ä¼éè¿åæ¢TCBæ¥ä¿å忢å¤çº¿ç¨çä¸ä¸æä¿¡æ¯ã
# è¿ç¨çç¶æï¼äºç§ç¶æï¼ï¼å¦ä½åæ¢ï¼
ä¸ä¸ªå®æ´çè¿ç¨ç¶æçåè¿å¦ä¸å¾ï¼

è¿ç¨äºç§ç¶æçåè¿
åæ¥è¯¦ç»è¯´æä¸ä¸è¿ç¨çç¶æåè¿ï¼
- NULL -> åå»ºç¶æï¼ä¸ä¸ªæ°è¿ç¨è¢«å建æ¶ç第ä¸ä¸ªç¶æï¼
- åå»ºç¶æ -> å°±ç»ªç¶æï¼å½è¿ç¨è¢«åå»ºå®æå¹¶åå§ååï¼ä¸å就绪åå¤è¿è¡æ¶ï¼åä¸ºå°±ç»ªç¶æï¼è¿ä¸ªè¿ç¨æ¯å¾å¿«çï¼
- 就绪æ -> è¿è¡ç¶æï¼å¤äºå°±ç»ªç¶æçè¿ç¨è¢«æä½ç³»ç»çè¿ç¨è°åº¦å¨éä¸åï¼å°±åé ç» CPU æ£å¼è¿è¡è¯¥è¿ç¨ï¼
- è¿è¡ç¶æ -> ç»æç¶æï¼å½è¿ç¨å·²ç»è¿è¡å®ææåºéæ¶ï¼ä¼è¢«æä½ç³»ç»ä½ç»æç¶æå¤çï¼
- è¿è¡ç¶æ -> å°±ç»ªç¶æï¼å¤äºè¿è¡ç¶æçè¿ç¨å¨è¿è¡è¿ç¨ä¸ï¼ç±äºåé ç»å®çè¿è¡æ¶é´çç¨å®ï¼æä½ç³»ç»ä¼æè¯¥è¿ç¨å为就绪æï¼æ¥çä»å°±ç»ªæéä¸å¦å¤ä¸ä¸ªè¿ç¨è¿è¡ï¼
- è¿è¡ç¶æ -> é»å¡ç¶æï¼å½è¿ç¨è¯·æ±æä¸ªäºä»¶ä¸å¿ é¡»çå¾ æ¶ï¼ä¾å¦è¯·æ± I/O äºä»¶ï¼
- é»å¡ç¶æ -> å°±ç»ªç¶æï¼å½è¿ç¨è¦çå¾ çäºä»¶å®ææ¶ï¼å®ä»é»å¡ç¶æåå°å°±ç»ªç¶æï¼
# è¿ç¨ä¸ä¸ææåªäºï¼
å个è¿ç¨ä¹é´æ¯å ±äº« CPU èµæºçï¼å¨ä¸åçæ¶åè¿ç¨ä¹é´éè¦åæ¢ï¼è®©ä¸åçè¿ç¨å¯ä»¥å¨ CPU æ§è¡ï¼é£ä¹è¿ä¸ªä¸ä¸ªè¿ç¨åæ¢å°å¦ä¸ä¸ªè¿ç¨è¿è¡ï¼ç§°ä¸ºè¿ç¨çä¸ä¸æåæ¢ã
å¨è¯¦ç»è¯´è¿ç¨ä¸ä¸æåæ¢åï¼æä»¬å æ¥çç CPU ä¸ä¸æåæ¢
大夿°æä½ç³»ç»é½æ¯å¤ä»»å¡ï¼éå¸¸æ¯æå¤§äº CPU æ°éçä»»å¡åæ¶è¿è¡ãå®é ä¸ï¼è¿äºä»»å¡å¹¶ä¸æ¯åæ¶è¿è¡çï¼åªæ¯å 为系ç»å¨å¾ççæ¶é´å ï¼è®©å个任å¡åå«å¨ CPU è¿è¡ï¼äºæ¯å°±é æåæ¶è¿è¡çéè§ã
任塿¯äº¤ç» CPU è¿è¡çï¼é£ä¹å¨æ¯ä¸ªä»»å¡è¿è¡åï¼CPU éè¦ç¥éä»»å¡ä»åªéå è½½ï¼åä»åªéå¼å§è¿è¡ã
æä»¥ï¼æä½ç³»ç»éè¦äºå 帮 CPU 设置好 CPU å¯åå¨åç¨åºè®¡æ°å¨ã
CPU å¯å卿¯ CPU å é¨ä¸ä¸ªå®¹éå°ï¼ä½æ¯é度æå¿«çå åï¼ç¼åï¼ãæä¸¾ä¸ªä¾åï¼å¯åå¨åæ¯ä½ çå£è¢ï¼å ååä½ ç书å ï¼ç¡¬çåæ¯ä½ å®¶éçæåï¼å¦æä½ çä¸è¥¿åæ¾å°å£è¢ï¼é£è¯å®æ¯æ¯ä½ ä»ä¹¦å æå®¶éæåååºæ¥è¦å¿«çå¤ã
忥ï¼ç¨åºè®¡æ°å¨åæ¯ç¨æ¥åå¨ CPU æ£å¨æ§è¡çæä»¤ä½ç½®ãæè å³å°æ§è¡çä¸ä¸æ¡æä»¤ä½ç½®ã
æä»¥è¯´ï¼CPU å¯åå¨åç¨åºè®¡æ°æ¯ CPU å¨è¿è¡ä»»ä½ä»»å¡åï¼æå¿ é¡»ä¾èµçç¯å¢ï¼è¿äºç¯å¢å°±å«å CPU ä¸ä¸æã
æ¢ç¶ç¥éäºä»ä¹æ¯ CPU ä¸ä¸æï¼é£çè§£ CPU ä¸ä¸æåæ¢å°±ä¸é¾äºã
CPU ä¸ä¸æåæ¢å°±æ¯å æåä¸ä¸ªä»»å¡ç CPU ä¸ä¸æï¼CPU å¯åå¨åç¨åºè®¡æ°å¨ï¼ä¿åèµ·æ¥ï¼ç¶åå è½½æ°ä»»å¡çä¸ä¸æå°è¿äºå¯åå¨åç¨åºè®¡æ°å¨ï¼æåå跳转å°ç¨åºè®¡æ°å¨ææçæ°ä½ç½®ï¼è¿è¡æ°ä»»å¡ã
ç³»ç»å æ ¸ä¼åå¨ä¿æä¸æ¥çä¸ä¸æä¿¡æ¯ï¼å½æ¤ä»»å¡å次被åé ç» CPU è¿è¡æ¶ï¼CPU ä¼éæ°å è½½è¿äºä¸ä¸æï¼è¿æ ·å°±è½ä¿è¯ä»»å¡åæ¥çç¶æä¸åå½±åï¼è®©ä»»å¡çèµ·æ¥è¿æ¯è¿ç»è¿è¡.
ä¸é¢è¯´å°æè°çãä»»å¡ãï¼ä¸»è¦å å«è¿ç¨ã线ç¨å䏿ãæä»¥ï¼å¯ä»¥æ ¹æ®ä»»å¡çä¸åï¼æ CPU ä¸ä¸æåæ¢åæï¼è¿ç¨ä¸ä¸æåæ¢ã线ç¨ä¸ä¸æåæ¢å䏿ä¸ä¸æåæ¢ã
è¿ç¨çä¸ä¸æåæ¢å°åºæ¯åæ¢ä»ä¹å¢ï¼
è¿ç¨æ¯ç±å æ ¸ç®¡çåè°åº¦çï¼æä»¥è¿ç¨ç忢åªè½åçå¨å æ ¸æã
æä»¥ï¼è¿ç¨çä¸ä¸æåæ¢ä¸ä» å å«äºèæå åãæ ãå ¨å±åéçç¨æ·ç©ºé´çèµæºï¼è¿å æ¬äºå æ ¸å æ ãå¯åå¨çå æ ¸ç©ºé´çèµæºã
é常ï¼ä¼æäº¤æ¢çä¿¡æ¯ä¿åå¨è¿ç¨ç PCBï¼å½è¦è¿è¡å¦å¤ä¸ä¸ªè¿ç¨çæ¶åï¼æä»¬éè¦ä»è¿ä¸ªè¿ç¨ç PCB ååºä¸ä¸æï¼ç¶åæ¢å¤å° CPU ä¸ï¼è¿ä½¿å¾è¿ä¸ªè¿ç¨å¯ä»¥ç»§ç»æ§è¡ï¼å¦ä¸å¾æç¤ºï¼

大家éè¦æ³¨æï¼è¿ç¨çä¸ä¸æå¼éæ¯å¾å ³é®çï¼æä»¬å¸æå®çå¼éè¶å°è¶å¥½ï¼è¿æ ·å¯ä»¥ä½¿å¾è¿ç¨å¯ä»¥ææ´å¤æ¶é´è±è´¹å¨æ§è¡ç¨åºä¸ï¼è䏿¯èè´¹å¨ä¸ä¸æåæ¢ã
# è¿ç¨é´é讯æåªäºæ¹å¼ï¼
Linux å æ ¸æä¾äºä¸å°è¿ç¨é´éä¿¡çæ¹å¼ï¼
- 管é
- æ¶æ¯éå
- å ±äº«å å
- ä¿¡å·
- ä¿¡å·é
- socket

Linux å æ ¸æä¾äºä¸å°è¿ç¨é´éä¿¡çæ¹å¼ï¼å ¶ä¸æç®åçæ¹å¼å°±æ¯ç®¡éï¼ç®¡éå为ãå¿å管éãåãå½å管éãã
å¿å管é顾åæä¹ï¼å®æ²¡æååæ è¯ï¼å¿åç®¡éæ¯ç¹æ®æä»¶åªåå¨äºå åï¼æ²¡æåå¨äºæä»¶ç³»ç»ä¸ï¼shell å½ä»¤ä¸çã|ãç«çº¿å°±æ¯å¿å管éï¼éä¿¡çæ°æ®æ¯æ æ ¼å¼çæµå¹¶ä¸å¤§å°åéï¼éä¿¡çæ¹å¼æ¯ååçï¼æ°æ®åªè½å¨ä¸ä¸ªæ¹å䏿µå¨ï¼å¦æè¦ååéä¿¡ï¼éè¦å建两个管éï¼åæ¥å¿åç®¡éæ¯åªè½ç¨äºåå¨ç¶åå ³ç³»çè¿ç¨é´éä¿¡ï¼å¿å管éççå½å¨æéçè¿ç¨å建è建ç«ï¼éçè¿ç¨ç»æ¢èæ¶å¤±ã
å½å管éçªç ´äºå¿å管éåªè½å¨äº²ç¼å ³ç³»è¿ç¨é´çéä¿¡éå¶ï¼å 为使ç¨å½å管éçåæï¼éè¦å¨æä»¶ç³»ç»å建ä¸ä¸ªç±»å为 p çè®¾å¤æä»¶ï¼é£ä¹æ¯«æ å ³ç³»çè¿ç¨å°±å¯ä»¥éè¿è¿ä¸ªè®¾å¤æä»¶è¿è¡éä¿¡ãå¦å¤ï¼ä¸ç®¡æ¯å¿å管éè¿æ¯å½å管éï¼è¿ç¨åå ¥çæ°æ®é½æ¯ç¼åå¨å æ ¸ä¸ï¼å¦ä¸ä¸ªè¿ç¨è¯»åæ°æ®æ¶åèªç¶ä¹æ¯ä»å æ ¸ä¸è·åï¼åæ¶éä¿¡æ°æ®é½éµå¾ªå è¿å åºååï¼ä¸æ¯æ lseek ä¹ç±»çæä»¶å®ä½æä½ã
æ¶æ¯éåå æäºç®¡ééä¿¡çæ°æ®æ¯æ æ ¼å¼çåèæµçé®é¢ï¼æ¶æ¯éåå®é 䏿¯ä¿åå¨å æ ¸çãæ¶æ¯é¾è¡¨ãï¼æ¶æ¯éåçæ¶æ¯ä½æ¯å¯ä»¥ç¨æ·èªå®ä¹çæ°æ®ç±»åï¼åéæ°æ®æ¶ï¼ä¼è¢«åæä¸ä¸ªä¸ä¸ªç¬ç«çæ¶æ¯ä½ï¼å½ç¶æ¥æ¶æ°æ®æ¶ï¼ä¹è¦ä¸åéæ¹åéçæ¶æ¯ä½çæ°æ®ç±»åä¿æä¸è´ï¼è¿æ ·æè½ä¿è¯è¯»åçæ°æ®æ¯æ£ç¡®çãæ¶æ¯éåéä¿¡çéåº¦ä¸æ¯æåæ¶çï¼æ¯ç«æ¯æ¬¡æ°æ®çåå ¥å读åé½éè¦ç»è¿ç¨æ·æä¸å æ ¸æä¹é´çæ·è´è¿ç¨ã
å ±äº«å åå¯ä»¥è§£å³æ¶æ¯éåéä¿¡ä¸ç¨æ·æä¸å æ ¸æä¹é´æ°æ®æ·è´è¿ç¨å¸¦æ¥çå¼éï¼å®ç´æ¥åé ä¸ä¸ªå ±äº«ç©ºé´ï¼æ¯ä¸ªè¿ç¨é½å¯ä»¥ç´æ¥è®¿é®ï¼å°±å访é®è¿ç¨èªå·±ç空é´ä¸æ ·å¿«æ·æ¹ä¾¿ï¼ä¸éè¦é·å ¥å æ ¸ææè ç³»ç»è°ç¨ï¼å¤§å¤§æé«äºéä¿¡çé度ï¼äº«ææå¿«çè¿ç¨é´éä¿¡æ¹å¼ä¹åã使¯ä¾¿æ·é«æçå ±äº«å åéä¿¡ï¼å¸¦æ¥æ°çé®é¢ï¼å¤è¿ç¨ç«äºåä¸ªå ±äº«èµæºä¼é ææ°æ®çéä¹±ã
é£ä¹ï¼å°±éè¦ä¿¡å·éæ¥ä¿æ¤å ±äº«èµæºï¼ä»¥ç¡®ä¿ä»»ä½æ¶å»åªè½æä¸ä¸ªè¿ç¨è®¿é®å ±äº«èµæºï¼è¿ç§æ¹å¼å°±æ¯äºæ¥è®¿é®ãä¿¡å·éä¸ä» å¯ä»¥å®ç°è®¿é®çäºæ¥æ§ï¼è¿å¯ä»¥å®ç°è¿ç¨é´ç忥ï¼ä¿¡å·éå ¶å®æ¯ä¸ä¸ªè®¡æ°å¨ï¼è¡¨ç¤ºçæ¯èµæºä¸ªæ°ï¼å ¶å¼å¯ä»¥éè¿ä¸¤ä¸ªååæä½æ¥æ§å¶ï¼å嫿¯ P æä½å V æä½ã
ä¸ä¿¡å·éååå¾ç¸ä¼¼çå«ä¿¡å·ï¼å®ä¿©ååè½ç¶ç¸ä¼¼ï¼ä½åè½ä¸ç¹å¿é½ä¸ä¸æ ·ãä¿¡å·æ¯å¼æ¥éä¿¡æºå¶ï¼ä¿¡å·å¯ä»¥å¨åºç¨è¿ç¨åå æ ¸ä¹é´ç´æ¥äº¤äºï¼å æ ¸ä¹å¯ä»¥å©ç¨ä¿¡å·æ¥éç¥ç¨æ·ç©ºé´çè¿ç¨åçäºåªäºç³»ç»äºä»¶ï¼ä¿¡å·äºä»¶çæ¥æºä¸»è¦æç¡¬ä»¶æ¥æºï¼å¦é®ç Cltr+C ï¼åè½¯ä»¶æ¥æºï¼å¦ kill å½ä»¤ï¼ï¼ä¸æ¦æä¿¡å·åçï¼è¿ç¨æä¸ç§æ¹å¼ååºä¿¡å· 1. æ§è¡é»è®¤æä½ã2. ææä¿¡å·ã3. 忽ç¥ä¿¡å·ãæä¸¤ä¸ªä¿¡å·æ¯åºç¨è¿ç¨æ æ³ææå忽ç¥çï¼å³ SIGKILL å SIGSTOPï¼è¿æ¯ä¸ºäºæ¹ä¾¿æä»¬è½å¨ä»»ä½æ¶åç»ææåæ¢æä¸ªè¿ç¨ã
åé¢è¯´å°çéä¿¡æºå¶ï¼é½æ¯å·¥ä½äºåä¸å°ä¸»æºï¼å¦æè¦ä¸ä¸å主æºçè¿ç¨é´éä¿¡ï¼é£ä¹å°±éè¦ Socket éä¿¡äºãSocket å®é ä¸ä¸ä» ç¨äºä¸åç主æºè¿ç¨é´éä¿¡ï¼è¿å¯ä»¥ç¨äºæ¬å°ä¸»æºè¿ç¨é´éä¿¡ï¼å¯æ ¹æ®å建 Socket çç±»åä¸åï¼å为ä¸ç§å¸¸è§çéä¿¡æ¹å¼ï¼ä¸ä¸ªæ¯åºäº TCP åè®®çéä¿¡æ¹å¼ï¼ä¸ä¸ªæ¯åºäº UDP åè®®çéä¿¡æ¹å¼ï¼ä¸ä¸ªæ¯æ¬å°è¿ç¨é´éä¿¡æ¹å¼ã
# 管éæå ç§æ¹å¼ï¼
管éå¨Linuxä¸æä¸¤ç§æ¹å¼ï¼å¿å管éåå½å管éã
- å¿å管éï¼æ¯ä¸ç§å¨ç¶åè¿ç¨æè å å¼è¿ç¨ä¹é´è¿è¡éä¿¡çæºå¶ï¼åªè½ç¨äºå ·æäº²ç¼å ³ç³»çè¿ç¨é´éä¿¡ï¼é常éè¿pipeç³»ç»è°ç¨å建ã
- å½å管éï¼æ¯ä¸ç§å 许æ å ³çè¿ç¨é´è¿è¡éä¿¡çæºå¶ï¼åºäºæä»¶ç³»ç»ï¼å¯ä»¥å¨ä¸ç¸å ³çè¿ç¨ä¹é´è¿è¡éä¿¡ã
# ä¿¡å·åä¿¡å·éæä»ä¹åºå«ï¼
- ä¿¡å·ï¼ä¸ç§å¤ç弿¥äºä»¶çæ¹å¼ãä¿¡å·æ¯æ¯è¾å¤æçéä¿¡æ¹å¼ï¼ç¨äºéç¥æ¥æ¶è¿ç¨ææç§äºä»¶åçï¼é¤äºç¨äºè¿ç¨å¤ï¼è¿å¯ä»¥åéä¿¡å·ç»è¿ç¨æ¬èº«ã
- ä¿¡å·éï¼è¿ç¨é´éä¿¡å¤çåæ¥äºæ¥çæºå¶ãæ¯å¨å¤çº¿ç¨ç¯å¢ä¸ä½¿ç¨çä¸ç§è®¾æ½ï¼å®è´è´£åè°å个线ç¨ï¼ä»¥ä¿è¯å®ä»¬è½å¤æ£ç¡®ï¼åçç使ç¨å ¬å ±èµæºã
# å ±äº«å åæä¹å®ç°çï¼
å ±äº«å åçæºå¶ï¼å°±æ¯æ¿åºä¸åèæå°åç©ºé´æ¥ï¼æ å°å°ç¸åçç©çå åä¸ãè¿æ ·è¿ä¸ªè¿ç¨åå ¥çä¸è¥¿ï¼å¦å¤ä¸ä¸ªè¿ç¨é©¬ä¸å°±è½çå°äºï¼é½ä¸éè¦æ·è´æ¥æ·è´å»ï¼ä¼ æ¥ä¼ å»ï¼å¤§å¤§æé«äºè¿ç¨é´éä¿¡çé度ã

# 线ç¨é´é讯æä»ä¹æ¹å¼ï¼
Linuxç³»ç»æä¾äºäºç§ç¨äºçº¿ç¨éä¿¡çæ¹å¼ï¼äºæ¥éã读åéãæ¡ä»¶åéãèªæéåä¿¡å·éã
- äºæ¥éï¼Mutexï¼ï¼äºæ¥é(mutex)仿¬è´¨ä¸è¯´æ¯ä¸æéï¼å¨è®¿é®å ±äº«èµæºåå¯¹äºæ¥éè¿è¡å éï¼å¨è®¿é®å®æåéæ¾äºæ¥éä¸çéãå¯¹äºæ¥éè¿è¡å é以åï¼ä»»ä½å ¶ä»è¯å¾åæ¬¡å¯¹äºæ¥éå éç线ç¨å°ä¼é»å¡ç´å°å½å线ç¨éæ¾è¯¥äºæ¥éãå¦æéæ¾äºæ¥éæ¶æå¤ä¸ªçº¿ç¨é»å¡ï¼ææå¨è¯¥äºæ¥éä¸çé»å¡çº¿ç¨é½ä¼åæå¯è¿è¡ç¶æï¼ç¬¬ä¸ä¸ªå为è¿è¡ç¶æç线ç¨å¯ä»¥å¯¹äºæ¥éå éï¼å ¶ä»çº¿ç¨å°ä¼çå°äºæ¥éä¾ç¶è¢«éä½ï¼åªè½åå»å次çå¾ å®éæ°å为å¯ç¨ã
- æ¡ä»¶åéï¼Condition Variablesï¼ï¼æ¡ä»¶åé(cond)æ¯å¨å¤çº¿ç¨ç¨åºä¸ç¨æ¥å®ç°"çå¾ --ãå¤é"é»è¾å¸¸ç¨çæ¹æ³ãæ¡ä»¶åéå©ç¨çº¿ç¨é´å ±äº«çå ¨å±åéè¿è¡åæ¥çä¸ç§æºå¶ï¼ä¸»è¦å æ¬ä¸¤ä¸ªå¨ä½ï¼ä¸ä¸ªçº¿ç¨çå¾ "æ¡ä»¶åéçæ¡ä»¶æç«"èæèµ·ï¼å¦ä¸ä¸ªçº¿ç¨ä½¿âæ¡ä»¶æç«âã为äºé²æ¢ç«äºï¼æ¡ä»¶åéçä½¿ç¨æ»æ¯åä¸ä¸ªäºæ¥éç»åå¨ä¸èµ·ã线ç¨å¨æ¹åæ¡ä»¶ç¶æåå¿ é¡»é¦å éä½äºæ¥éï¼å½æ°pthread_cond_waitæèªå·±æ¾å°çå¾ æ¡ä»¶ç线ç¨å表ä¸ï¼ç¶åå¯¹äºæ¥éè§£é(è¿ä¸¤ä¸ªæä½æ¯ååæä½)ãå¨å½æ°è¿åæ¶ï¼äºæ¥é忬¡è¢«éä½ã
- èªæéï¼Spinlockï¼ï¼èªæééè¿ CPU æä¾ç CAS 彿°ï¼Compare And Swapï¼ï¼å¨ãç¨æ·æã宿å éåè§£éæä½ï¼ä¸ä¼ä¸»å¨äº§ç线ç¨ä¸ä¸æåæ¢ï¼æä»¥ç¸æ¯äºæ¥éæ¥è¯´ï¼ä¼å¿«ä¸äºï¼å¼éä¹å°ä¸äºãä¸è¬å éçè¿ç¨ï¼å å«ä¸¤ä¸ªæ¥éª¤ï¼ç¬¬ä¸æ¥ï¼æ¥çéçç¶æï¼å¦æéæ¯ç©ºé²çï¼åæ§è¡ç¬¬äºæ¥ï¼ç¬¬äºæ¥ï¼å°é设置为å½åçº¿ç¨ææï¼ä½¿ç¨èªæéçæ¶åï¼å½åçå¤çº¿ç¨ç«äºéçæ åµï¼å é失败ç线ç¨ä¼ãå¿çå¾ ãï¼ç´å°å®æ¿å°éãCAS 彿°å°±æè¿ä¸¤ä¸ªæ¥éª¤åå¹¶æä¸æ¡ç¡¬ä»¶çº§æä»¤ï¼å½¢æååæä»¤ï¼è¿æ ·å°±ä¿è¯äºè¿ä¸¤ä¸ªæ¥éª¤æ¯ä¸å¯åå²çï¼è¦ä¹ä¸æ¬¡æ§æ§è¡å®ä¸¤ä¸ªæ¥éª¤ï¼è¦ä¹ä¸¤ä¸ªæ¥éª¤é½ä¸æ§è¡ãè¿éçãå¿çå¾ ãå¯ä»¥ç¨ while 循ç¯çå¾ å®ç°ï¼ä¸è¿æå¥½æ¯ä½¿ç¨ CPU æä¾ç PAUSE æä»¤æ¥å®ç°ãå¿çå¾ ãï¼å 为å¯ä»¥åå°å¾ªç¯çå¾ æ¶çèçµéã
- ä¿¡å·éï¼Semaphoresï¼ï¼ä¿¡å·éå¯ä»¥æ¯å½åçï¼æåä¿¡å·éï¼ææ åçï¼ä» éäºå½åè¿ç¨å ç线ç¨ï¼ï¼ç¨äºæ§å¶å¯¹èµæºçè®¿é®æ¬¡æ°ãé常信å·éè¡¨ç¤ºèµæºçæ°éï¼å¯¹åºçå鿝ä¸ä¸ªæ´åï¼semï¼åéãå¦å¤ï¼è¿æä¸¤ä¸ªååæä½çç³»ç»è°ç¨å½æ°æ¥æ§å¶ä¿¡å·éçï¼å嫿¯ï¼P æä½ï¼å° sem å 1ï¼ç¸ååï¼å¦æ sem < 0ï¼åè¿ç¨/线ç¨è¿å ¥é»å¡çå¾ ï¼å¦åç»§ç»ï¼è¡¨æ P æä½å¯è½ä¼é»å¡ï¼V æä½ï¼å° sem å 1ï¼ç¸å åï¼å¦æ sem <= 0ï¼å¤éä¸ä¸ªçå¾ ä¸çè¿ç¨/线ç¨ï¼è¡¨æ V æä½ä¸ä¼é»å¡ï¼
- 读åéï¼Read-Write Locksï¼ï¼è¯»åéä»å颿ææä»¬ä¹å¯ä»¥ç¥éï¼å®ç±ã读éãåãåéã两é¨åææï¼å¦æåªè¯»åå ±äº«èµæºç¨ã读éãå éï¼å¦æè¦ä¿®æ¹å ±äº«èµæºåç¨ãåéãå éãæä»¥ï¼è¯»åééç¨äºè½æç¡®åºå读æä½ååæä½çåºæ¯ã读åéçå·¥ä½åçæ¯ï¼å½ãåéãæ²¡æè¢«çº¿ç¨æææ¶ï¼å¤ä¸ªçº¿ç¨è½å¤å¹¶åå°ææè¯»éï¼è¿å¤§å¤§æé«äºå ±äº«èµæºçè®¿é®æçï¼å 为ã读éãæ¯ç¨äºè¯»åå ±äº«èµæºçåºæ¯ï¼æä»¥å¤ä¸ªçº¿ç¨åæ¶ææè¯»éä¹ä¸ä¼ç ´åå ±äº«èµæºçæ°æ®ã使¯ï¼ä¸æ¦ãåéãè¢«çº¿ç¨ææåï¼è¯»çº¿ç¨çè·å读éçæä½ä¼è¢«é»å¡ï¼èä¸å ¶ä»å线ç¨çè·ååéçæä½ä¹ä¼è¢«é»å¡ãæä»¥è¯´ï¼å鿝ç¬å éï¼å ä¸ºä»»ä½æ¶å»åªè½æä¸ä¸ªçº¿ç¨ææåéï¼ç±»ä¼¼äºæ¥éåèªæéï¼èè¯»éæ¯å ±äº«éï¼å 为读éå¯ä»¥è¢«å¤ä¸ªçº¿ç¨åæ¶ææãç¥éäºè¯»åéçå·¥ä½åçåï¼æä»¬å¯ä»¥åç°ï¼è¯»åéå¨è¯»å¤åå°çåºæ¯ï¼è½åæ¥åºä¼å¿ã
# é¤äºäºæ¥éä½ è¿ç¥éä»ä¹éï¼åå«åºç¨äºä»ä¹åºæ¯ï¼
è¿æè¯»åéãèªæéãæ¡ä»¶åéãä¿¡å·éã
- 读åéï¼è¯»åéå 许å¤ä¸ªçº¿ç¨åæ¶è¯»åå ±äº«èµæºï¼ä½åªå 许ä¸ä¸ªçº¿ç¨è¿è¡åæä½ãéç¨äºè¯»æä½é¢ç¹ãåæä½è¾å°çåºæ¯ï¼å¯ä»¥æé«å¹¶åæ§è½ã
- èªæéï¼èªæéæ¯ä¸ç§å¿çå¾ éï¼çº¿ç¨å¨è·åéæ¶ä¸ä¼è¿å ¥é»å¡ç¶æï¼èæ¯å¾ªç¯å¿çå¾ ç´å°è·åå°éãéç¨äºä¸´çåºå¾å°ä¸éçæææ¶é´å¾ççåºæ¯ï¼é¿å 线ç¨é¢ç¹åæ¢å¸¦æ¥çå¼éã
- æ¡ä»¶åéï¼æ¡ä»¶åéç¨äºçº¿ç¨é´ç忥åéä¿¡ãå®é常ä¸äºæ¥éä¸èµ·ä½¿ç¨ï¼çº¿ç¨å¯ä»¥éè¿æ¡ä»¶åéçå¾ æä¸ªæ¡ä»¶æ»¡è¶³ï¼å½æ¡ä»¶æ»¡è¶³æ¶ï¼å ¶ä»çº¿ç¨å¯ä»¥éè¿æ¡ä»¶åéåéä¿¡å·éç¥çå¾ çº¿ç¨ã
- ä¿¡å·éï¼ä¿¡å·éæ¯ä¸ç§è®¡æ°å¨ï¼ç¨äºæ§å¶å¯¹å ±äº«èµæºç访é®ãå®å¯ä»¥ç¨æ¥éå¶åæ¶è®¿é®èµæºççº¿ç¨æ°éï¼æè ç¨äºçº¿ç¨é´ç忥ã
# è¿ç¨è°åº¦ç®æ³æåªäºï¼
å æ¥å æå¡è°åº¦ç®æ³
æç®åçä¸ä¸ªè°åº¦ç®æ³ï¼å°±æ¯éæ¢å å¼çå æ¥å æå¡ï¼First Come First Severd, FCFSï¼ç®æ³äºã
顾åæä¹ï¼å
æ¥åå°ï¼æ¯æ¬¡ä»å°±ç»ªéåéæ©æå
è¿å
¥éåçè¿ç¨ï¼ç¶åä¸ç´è¿è¡ï¼ç´å°è¿ç¨éåºæè¢«é»å¡ï¼æä¼ç»§ç»ä»éåä¸éæ©ç¬¬ä¸ä¸ªè¿ç¨æ¥çè¿è¡ã
è¿ä¼¼ä¹å¾å ¬å¹³ï¼ä½æ¯å½ä¸ä¸ªé¿ä½ä¸å è¿è¡äºï¼é£ä¹åé¢ççä½ä¸çå¾ çæ¶é´å°±ä¼å¾é¿ï¼ä¸å©äºçä½ä¸ã FCFS 对é¿ä½ä¸æå©ï¼éç¨äº CPU ç¹å¿åä½ä¸çç³»ç»ï¼èä¸éç¨äº I/O ç¹å¿åä½ä¸çç³»ç»ã
æçä½ä¸ä¼å è°åº¦ç®æ³
æçä½ä¸ä¼å ï¼Shortest Job First, SJFï¼è°åº¦ç®æ³åæ ·ä¹æ¯é¡¾åæä¹ï¼å®ä¼ä¼å éæ©è¿è¡æ¶é´æççè¿ç¨æ¥è¿è¡ï¼è¿æå©äºæé«ç³»ç»çååéã

è¿æ¾ç¶å¯¹é¿ä½ä¸ä¸å©ï¼å¾å®¹æé æä¸ç§æç«¯ç°è±¡ã
æ¯å¦ï¼ä¸ä¸ªé¿ä½ä¸å¨å°±ç»ªéåçå¾ è¿è¡ï¼èè¿ä¸ªå°±ç»ªéåæé常å¤ççä½ä¸ï¼é£ä¹å°±ä¼ä½¿å¾é¿ä½ä¸ä¸æçå¾åæ¨ï¼å¨è½¬æ¶é´åé¿ï¼è´ä½¿é¿ä½ä¸é¿æä¸ä¼è¢«è¿è¡ã
é«ååºæ¯ä¼å è°åº¦ç®æ³
åé¢çãå æ¥å æå¡è°åº¦ç®æ³ãåãæçä½ä¸ä¼å è°åº¦ç®æ³ã齿²¡æå¾å¥½çæè¡¡çä½ä¸åé¿ä½ä¸ã
é£ä¹ï¼é«ååºæ¯ä¼å ï¼Highest Response Ratio Next, HRRNï¼è°åº¦ç®æ³ä¸»è¦æ¯æè¡¡äºçä½ä¸åé¿ä½ä¸ã
æ¯æ¬¡è¿è¡è¿ç¨è°åº¦æ¶ï¼å 计ç®ãååºæ¯ä¼å 级ãï¼ç¶åæãååºæ¯ä¼å 级ãæé«çè¿ç¨æå ¥è¿è¡ï¼ãååºæ¯ä¼å 级ãç计ç®å ¬å¼ï¼

ä»ä¸é¢çå ¬å¼ï¼å¯ä»¥åç°ï¼
- å¦æä¸¤ä¸ªè¿ç¨çãçå¾ æ¶é´ãç¸åæ¶ï¼ãè¦æ±çæå¡æ¶é´ãè¶çï¼ãååºæ¯ãå°±è¶é«ï¼è¿æ ·çä½ä¸çè¿ç¨å®¹æè¢«éä¸è¿è¡ï¼
- å¦æä¸¤ä¸ªè¿ç¨ãè¦æ±çæå¡æ¶é´ãç¸åæ¶ï¼ãçå¾ æ¶é´ãè¶é¿ï¼ãååºæ¯ãå°±è¶é«ï¼è¿å°±å ¼é¡¾å°äºé¿ä½ä¸è¿ç¨ï¼å 为è¿ç¨çååºæ¯å¯ä»¥éæ¶é´çå¾ çå¢å èæé«ï¼å½å ¶çå¾ æ¶é´è¶³å¤é¿æ¶ï¼å ¶ååºæ¯ä¾¿å¯ä»¥åå°å¾é«ï¼ä»èè·å¾è¿è¡çæºä¼ï¼
æ¶é´ç轮转è°åº¦ç®æ³
æå¤èãæç®åãæå ¬å¹³ä¸ä½¿ç¨æå¹¿çç®æ³å°±æ¯æ¶é´ç轮转ï¼Round Robin, RRï¼è°åº¦ç®æ³ã
æ¯ä¸ªè¿ç¨è¢«åé
ä¸ä¸ªæ¶é´æ®µï¼ç§°ä¸ºæ¶é´çï¼Quantum)ï¼å³å
许该è¿ç¨å¨è¯¥æ¶é´æ®µä¸è¿è¡ã
- 妿æ¶é´çç¨å®ï¼è¿ç¨è¿å¨è¿è¡ï¼é£ä¹å°ä¼ææ¤è¿ç¨ä» CPU éæ¾åºæ¥ï¼å¹¶æ CPU åé å¦å¤ä¸ä¸ªè¿ç¨ï¼
- å¦æè¯¥è¿ç¨å¨æ¶é´çç»æåé»å¡æç»æï¼å CPU ç«å³è¿è¡åæ¢ï¼
å¦å¤ï¼æ¶é´ççé¿åº¦å°±æ¯ä¸ä¸ªå¾å ³é®çç¹ï¼
- 妿æ¶é´ç设å¾å¤ªçä¼å¯¼è´è¿å¤çè¿ç¨ä¸ä¸æåæ¢ï¼éä½äº CPU æçï¼
- å¦æè®¾å¾å¤ªé¿åå¯è½å¼èµ·å¯¹çä½ä¸è¿ç¨çååºæ¶é´åé¿ãå°
é常æ¶é´ç设为 20ms~50ms é常æ¯ä¸ä¸ªæ¯è¾åççæä¸å¼ã
æé«ä¼å 级è°åº¦ç®æ³
åé¢çãæ¶é´çè½®è½¬ç®æ³ãåäºä¸ªå设ï¼å³è®©ææçè¿ç¨åçéè¦ï¼ä¹ä¸åè¢è°ï¼å¤§å®¶çè¿è¡æ¶é´é½ä¸æ ·ã
使¯ï¼å¯¹äºå¤ç¨æ·è®¡ç®æºç³»ç»å°±æä¸åççæ³äºï¼å®ä»¬å¸æè°åº¦æ¯æä¼å 级çï¼å³å¸æè°åº¦ç¨åºè½ä»å°±ç»ªéåä¸éæ©æé«ä¼å 级çè¿ç¨è¿è¡è¿è¡ï¼è¿ç§°ä¸ºæé«ä¼å 级ï¼Highest Priority Firstï¼HPFï¼è°åº¦ç®æ³ã è¿ç¨çä¼å 级å¯ä»¥å为ï¼éæä¼å 级æå¨æä¼å 级ï¼
- éæä¼å 级ï¼å建è¿ç¨æ¶åï¼å°±å·²ç»ç¡®å®äºä¼å 级äºï¼ç¶åæ´ä¸ªè¿è¡æ¶é´ä¼å 级é½ä¸ä¼ååï¼
- 卿ä¼å çº§ï¼æ ¹æ®è¿ç¨ç卿ååè°æ´ä¼å çº§ï¼æ¯å¦å¦æè¿ç¨è¿è¡æ¶é´å¢å ï¼åéä½å ¶ä¼å 级ï¼å¦æè¿ç¨çå¾ æ¶é´ï¼å°±ç»ªéåççå¾ æ¶é´ï¼å¢å ï¼ååé«å ¶ä¼å 级ï¼ä¹å°±æ¯éçæ¶é´çæ¨ç§»å¢å çå¾ è¿ç¨çä¼å 级ã
è¯¥ç®æ³ä¹æä¸¤ç§å¤çä¼å 级é«çæ¹æ³ï¼éæ¢å å¼åæ¢å å¼ï¼
- 鿢å å¼ï¼å½å°±ç»ªéåä¸åºç°ä¼å 级é«çè¿ç¨ï¼è¿è¡å®å½åè¿ç¨ï¼åéæ©ä¼å 级é«çè¿ç¨ã
- æ¢å å¼ï¼å½å°±ç»ªéåä¸åºç°ä¼å 级é«çè¿ç¨ï¼å½åè¿ç¨æèµ·ï¼è°åº¦ä¼å 级é«çè¿ç¨è¿è¡ã
使¯ä¾ç¶æç¼ºç¹ï¼å¯è½ä¼å¯¼è´ä½ä¼å 级çè¿ç¨æ°¸è¿ä¸ä¼è¿è¡ã
å¤çº§åé¦éåè°åº¦ç®æ³
å¤çº§åé¦éåï¼Multilevel Feedback Queueï¼è°åº¦ç®æ³æ¯ãæ¶é´çè½®è½¬ç®æ³ãåãæé«ä¼å çº§ç®æ³ãç综åååå±ã
顾åæä¹ï¼
- ãå¤çº§ã表示æå¤ä¸ªéåï¼æ¯ä¸ªéåä¼å 级ä»é«å°ä½ï¼åæ¶ä¼å 级è¶é«æ¶é´çè¶çã
- ãåé¦ãè¡¨ç¤ºå¦æææ°çè¿ç¨å å ¥ä¼å 级é«çéåæ¶ï¼ç«å»åæ¢å½åæ£å¨è¿è¡çè¿ç¨ï¼è½¬èå»è¿è¡ä¼å 级é«çéåï¼
æ¥ççï¼å®æ¯å¦ä½å·¥ä½çï¼
- 设置äºå¤ä¸ªéåï¼èµäºæ¯ä¸ªéåä¸åçä¼å çº§ï¼æ¯ä¸ªéåä¼å 级ä»é«å°ä½ï¼åæ¶ä¼å 级è¶é«æ¶é´çè¶çï¼
- æ°çè¿ç¨ä¼è¢«æ¾å ¥å°ç¬¬ä¸çº§éåçæ«å°¾ï¼æå æ¥å æå¡çååæéçå¾ è¢«è°åº¦ï¼å¦æå¨ç¬¬ä¸çº§éåè§å®çæ¶é´ç没è¿è¡å®æï¼åå°å ¶è½¬å ¥å°ç¬¬äºçº§éåçæ«å°¾ï¼ä»¥æ¤ç±»æ¨ï¼ç´è³å®æï¼
- å½è¾é«ä¼å 级çéåä¸ºç©ºï¼æè°åº¦è¾ä½ä¼å 级çéåä¸çè¿ç¨è¿è¡ã妿è¿ç¨è¿è¡æ¶ï¼ææ°è¿ç¨è¿å ¥è¾é«ä¼å 级çéåï¼å忢å½åè¿è¡çè¿ç¨å¹¶å°å ¶ç§»å ¥å°åéåæ«å°¾ï¼æ¥ç让è¾é«ä¼å 级çè¿ç¨è¿è¡ï¼
å¯ä»¥åç°ï¼å¯¹äºçä½ä¸å¯è½å¯ä»¥å¨ç¬¬ä¸çº§éåå¾å¿«è¢«å¤çå®ã
对äºé¿ä½ä¸ï¼å¦æå¨ç¬¬ä¸çº§éåå¤çä¸å®ï¼å¯ä»¥ç§»å ¥ä¸æ¬¡éåçå¾ è¢«æ§è¡ï¼è½ç¶çå¾ çæ¶é´åé¿äºï¼ä½æ¯è¿è¡æ¶é´ä¹ä¼æ´é¿äºï¼æä»¥è¯¥ç®æ³å¾å¥½çå ¼é¡¾äºé¿çä½ä¸ï¼åæ¶æè¾å¥½çååºæ¶é´ã
# é
# 为ä»ä¹å¹¶åæ§è¡çº¿ç¨è¦å éï¼
å¹¶åæ§è¡çº¿ç¨éè¦å éä¸»è¦æ¯ä¸ºäºä¿æ¤å ±äº«æ°æ®ï¼é²æ¢åºç°"ç«ææ¡ä»¶"ã
"ç«ææ¡ä»¶"æ¯æå½å¤ä¸ªçº¿ç¨åæ¶è®¿é®åæä½åä¸åæ°æ®æ¶ï¼æç»ç»æä¾èµäºçº¿ç¨çæ§è¡é¡ºåºï¼è¿å¯è½å¯¼è´æ°æ®çä¸ä¸è´æ§ã
éè¿å éï¼æä»¬å¯ä»¥ç¡®ä¿å¨ä»»ä½æ¶å»åªæä¸ä¸ªçº¿ç¨è½å¤è®¿é®å ±äº«æ°æ®ï¼ä»èé¿å "ç«ææ¡ä»¶"ï¼ç¡®ä¿æ°æ®çä¸è´æ§å宿´æ§ã
# èªæéæ¯ä»ä¹ï¼åºç¨å¨åªäºåºæ¯ï¼
èªæéå é失败åï¼çº¿ç¨ä¼å¿çå¾ ï¼ç´å°å®æ¿å°éã
èªæéæ¯éè¿ CPU æä¾ç CAS 彿°ï¼Compare And Swapï¼ï¼å¨ãç¨æ·æã宿å éåè§£éæä½ï¼ä¸ä¼ä¸»å¨äº§ç线ç¨ä¸ä¸æåæ¢ï¼æä»¥ç¸æ¯äºæ¥éæ¥è¯´ï¼ä¼å¿«ä¸äºï¼å¼éä¹å°ä¸äºã
ä¸è¬å éçè¿ç¨ï¼å å«ä¸¤ä¸ªæ¥éª¤ï¼
- ç¬¬ä¸æ¥ï¼æ¥çéçç¶æï¼å¦æéæ¯ç©ºé²çï¼åæ§è¡ç¬¬äºæ¥ï¼
- ç¬¬äºæ¥ï¼å°é设置为å½åçº¿ç¨ææï¼
CAS 彿°å°±æè¿ä¸¤ä¸ªæ¥éª¤åå¹¶æä¸æ¡ç¡¬ä»¶çº§æä»¤ï¼å½¢æååæä»¤ï¼è¿æ ·å°±ä¿è¯äºè¿ä¸¤ä¸ªæ¥éª¤æ¯ä¸å¯åå²çï¼è¦ä¹ä¸æ¬¡æ§æ§è¡å®ä¸¤ä¸ªæ¥éª¤ï¼è¦ä¹ä¸¤ä¸ªæ¥éª¤é½ä¸æ§è¡ã
æ¯å¦ï¼è®¾é为åé lockï¼æ´æ° 0 è¡¨ç¤ºéæ¯ç©ºé²ç¶æï¼æ´æ° pid è¡¨ç¤ºçº¿ç¨ IDï¼é£ä¹ CAS(lock, 0, pid) å°±è¡¨ç¤ºèªæéçå éæä½ï¼CAS(lock, pid, 0) å表示解éæä½ã
使ç¨èªæéçæ¶åï¼å½åçå¤çº¿ç¨ç«äºéçæ
åµï¼å é失败ç线ç¨ä¼ãå¿çå¾
ãï¼ç´å°å®æ¿å°éãè¿éçãå¿çå¾
ãå¯ä»¥ç¨ while 循ç¯çå¾
å®ç°ï¼ä¸è¿æå¥½æ¯ä½¿ç¨ CPU æä¾ç PAUSE æä»¤æ¥å®ç°ãå¿çå¾
ãï¼å 为å¯ä»¥åå°å¾ªç¯çå¾
æ¶çèçµéã
èªæéæ¯ææ¯è¾ç®åçä¸ç§éï¼ä¸ç´èªæï¼å©ç¨ CPU 卿ï¼ç´å°éå¯ç¨ãéè¦æ³¨æï¼å¨åæ ¸ CPU ä¸ï¼éè¦æ¢å å¼çè°åº¦å¨ï¼å³ä¸æéè¿æ¶é䏿ä¸ä¸ªçº¿ç¨ï¼è¿è¡å ¶ä»çº¿ç¨ï¼ãå¦åï¼èªæéå¨å CPU 䏿 æ³ä½¿ç¨ï¼å 为ä¸ä¸ªèªæççº¿ç¨æ°¸è¿ä¸ä¼æ¾å¼ CPUã
èªæéå¼éå°ï¼å¨å¤æ ¸ç³»ç»ä¸ä¸è¬ä¸ä¼ä¸»å¨äº§ç线ç¨åæ¢ï¼éå弿¥ãåç¨çå¨ç¨æ·æåæ¢è¯·æ±çç¼ç¨æ¹å¼ï¼ä½å¦æè¢«éä½çä»£ç æ§è¡æ¶é´è¿é¿ï¼èªæç线ç¨ä¼é¿æ¶é´å ç¨ CPU èµæºï¼æä»¥èªæçæ¶é´å被éä½çä»£ç æ§è¡çæ¶é´æ¯æãæ£æ¯ãçå ³ç³»ï¼æä»¬éè¦æ¸ æ¥çç¥éè¿ä¸ç¹ã
èªæéä¸äºæ¥é使ç¨å±é¢æ¯è¾ç¸ä¼¼ï¼ä½å®ç°å±é¢ä¸å®å ¨ä¸åï¼å½å é失败æ¶ï¼äºæ¥éç¨ã线ç¨åæ¢ãæ¥åºå¯¹ï¼èªæéåç¨ãå¿çå¾ ãæ¥åºå¯¹ã
å¦æä½ è½ç¡®å®è¢«éä½çä»£ç æ§è¡æ¶é´å¾çï¼å°±ä¸åºè¯¥ç¨äºæ¥éï¼èåºè¯¥éç¨èªæéï¼å¦å使ç¨äºæ¥éã
# æ»éåçæ¡ä»¶æ¯ä»ä¹ï¼
æ»éåªæåæ¶æ»¡è¶³ä»¥ä¸å个æ¡ä»¶æä¼åçï¼
- äºæ¥æ¡ä»¶ï¼äºæ¥æ¡ä»¶æ¯æå¤ä¸ªçº¿ç¨ä¸è½åæ¶ä½¿ç¨åä¸ä¸ªèµæºã
- ææå¹¶çå¾ æ¡ä»¶ï¼ææå¹¶çå¾ æ¡ä»¶æ¯æï¼å½çº¿ç¨ A å·²ç»ææäºèµæº 1ï¼åæ³ç³è¯·èµæº 2ï¼èèµæº 2 å·²ç»è¢«çº¿ç¨ C ææäºï¼æä»¥çº¿ç¨ A å°±ä¼å¤äºçå¾ ç¶æï¼ä½æ¯çº¿ç¨ A å¨çå¾ èµæº 2 çåæ¶å¹¶ä¸ä¼éæ¾èªå·±å·²ç»ææçèµæº 1ã
- ä¸å¯å¥å¤ºæ¡ä»¶ï¼ä¸å¯å¥å¤ºæ¡ä»¶æ¯æï¼å½çº¿ç¨å·²ç»ææäºèµæº ï¼å¨èªå·±ä½¿ç¨å®ä¹åä¸è½è¢«å ¶ä»çº¿ç¨è·åï¼çº¿ç¨ B 妿乿³ä½¿ç¨æ¤èµæºï¼ååªè½å¨çº¿ç¨ A 使ç¨å®å¹¶éæ¾åæè½è·åã
- ç¯è·¯çå¾ æ¡ä»¶ï¼ç¯è·¯çå¾ æ¡ä»¶æçæ¯ï¼å¨æ»éåççæ¶åï¼ä¸¤ä¸ªçº¿ç¨è·åèµæºçé¡ºåºææäºç¯å½¢é¾ã
# å¦ä½é¿å æ»éï¼
é¿å æ»éé®é¢å°±åªéè¦ç ´ç¯å ¶ä¸ä¸ä¸ªæ¡ä»¶å°±å¯ä»¥ï¼æå¸¸è§çå¹¶ä¸å¯è¡çå°±æ¯ä½¿ç¨èµæºæåºåé æ³ï¼æ¥ç ´ç¯ç¯è·¯çå¾ æ¡ä»¶ã
é£ä»ä¹æ¯èµæºæåºåé æ³å¢ï¼çº¿ç¨ A å çº¿ç¨ B è·åèµæºç顺åºè¦ä¸æ ·ï¼å½çº¿ç¨ A æ¯å å°è¯è·åèµæº Aï¼ç¶åå°è¯è·åèµæº B çæ¶åï¼çº¿ç¨ B åæ ·ä¹æ¯å å°è¯è·åèµæº Aï¼ç¶åå°è¯è·åèµæº Bãä¹å°±æ¯è¯´ï¼çº¿ç¨ A å çº¿ç¨ B æ»æ¯ä»¥ç¸åç顺åºç³è¯·èªå·±æ³è¦çèµæºã

# 讲ä¸ä¸é¶è¡å®¶ç®æ³
ç³»ç»åçæ»éæ¯å¾æ£å¸¸çï¼æä»¬éè¦ä¸»å¨å»é¢é²æ»éï¼å³è¿è¡æåºçèµæºåé ï¼ä½¿ç¨é¶è¡å®¶ç®æ³ã
é¶è¡å®¶ç®æ³æ¯ææä»£è¡¨æ§çé¿å æ»éçç®æ³ã
为ä»ä¹å«é¶è¡å®¶ç®æ³å¢ï¼å°±æ¯è¿ä¸ªç®æ³çé»è¾å¾åé¶è¡æ¾è´·çé»è¾ï¼ä¹å°±æ¯å°½å¯è½é¿å åè´¦çåºç°ã
é¶è¡å®¶ç®æ³çä¸å¡é»è¾å¦ä¸ã
- ä¸è´è·æ§è¡ï¼ä¸ä¸ªè¿ç¨çæå¤§éæ±éä¸è¶ è¿ç³»ç»æ¥æçæ»èµæºæ°ï¼æä¼è¢«æ¥çº³æ§è¡ã
- å¯åæï¼ä¸ä¸ªè¿ç¨å¯ä»¥åæè¯·æ±èµæºï¼ä½æ»è¯·æ±ä¹¦ä¸å¯è¶ è¿æå¤§éæ±éã
- æ¨è¿åé ï¼å½ç³»ç»ç°æèµæºæ°å°äºè¿ç¨éæ±æ¶ï¼å¯¹è¿ç¨çéæ±å¯ä»¥å»¶è¿åé ï¼ä½æ»è®©è¿ç¨å¨æéæ¶é´å è·åèµæºã
å¬èµ·æ¥æç¹ç»ï¼æä»¬è¿æ¯ä¸¾ä¸ªä¾åæ¥è¯´æã
åå¦ç³»ç»ä¸æä¸ç±»äºæ¥èµæº R1ãR2ãR3ï¼å¯ç¨èµæºæ°å嫿¯ 9ã8ã5ï¼å¨æå®æ¶å»æ P1ãP2ãP3ãP4 å P5 è¿äºä¸ªè¿ç¨ï¼è¿äºè¿ç¨ç对ä¸ç±»äºæ¥èµæºçæå¤§éæ±éåå·²åé èµæºæ°å¦ä¸è¡¨æç¤ºï¼é£ä¹ç³»ç»å¦ä½å åè¿è¡è¿äºä¸ªè¿ç¨ï¼ä¸ä¼åçæ»éé®é¢ï¼
| è¿ç¨ | æå¤§éæ±éï¼åå«ä¸ºR1 R2 R3ï¼ | å·²åé èµæºæ°ï¼åå«ä¸ºR1 R2 R3ï¼ |
|---|---|---|
| P1 | 6 5 2 | 1 2 1 |
| P2 | 2 2 1 | 2 1 1 |
| P3 | 8 1 1 | 2 1 0 |
| P4 | 1 2 1 | 1 2 0 |
| P5 | 3 4 4 | 1 1 3 |
ç¬¬ä¸æ¥ï¼åæ
é¦å åæé¦æ¬¡éæ±çèµæºï¼ç³»ç»å©ä½å¯ç¨èµæºæ°å嫿¯ 2ã1ã0ï¼åè¿ç¨éè¦çèµæºæ°å¦ä¸è¡¨æç¤ºã
èµæº R1 çå©ä½å¯ç¨èµæºæ° = 9 - 1 - 2 - 2 - 1 - 1 = 2ã
èµæº R2 çå©ä½å¯ç¨èµæºæ° = 8 - 2 - 1 - 1 - 2 - 1 = 1ã
èµæº R3 çå©ä½å¯ç¨èµæºæ° = 5 - 1 - 1 - 0 - 0 - 3 = 0ã
| è¿ç¨ | æå¤§éæ±é | å·²åé èµæºæ° | 馿¬¡åé éè¦çèµæºæ° |
|---|---|---|---|
| P1 | 6 5 2 | 1 2 1 | 5 3 1 |
| P2 | 2 2 1 | 2 1 1 | 0 1 0 |
| P3 | 8 1 1 | 2 1 0 | 6 0 1 |
| P4 | 1 2 1 | 1 2 0 | 0 0 1 |
| P5 | 3 4 4 | 1 1 3 | 2 3 1 |
æ ¹æ®é¶è¡å®¶ç®æ³ä¸è´è·ååãä¸ä¸ªè¿ç¨çæå¤§éæ±éä¸è¶ è¿ç³»ç»æ¥æçæ»èµæºæ°ï¼æä¼è¢«æ¥çº³æ§è¡ãï¼ä¼å ç»è¿ç¨ P2 æ§è¡ï¼å 为å©ä½ç 0 1 0 èµæºå¤è®© P2 æ§è¡ã
ç¬¬äºæ¥ï¼æ§è¡ P2
P2 æ§è¡ä¹åï¼éæ¾äºååæ¾å ¥ç 2 1 0 èµæºï¼èä¸å¯ä»¥éæ¾å·²åé ç 2 1 1 èµæºï¼æä»¥æ¤æ¶çèµæºå©ä½éã
èµæº R1 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P2 æ¶èæ° + P2 æ§è¡å®éæ¾çèµæºæ° = 2 - 0 +ï¼2 + 0ï¼ = 4ã
èµæº R2 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P2 æ¶èæ° + P2 æ§è¡å®éæ¾çèµæºæ° = 1 - 1 + ï¼1 + 1ï¼ = 2ã
èµæº R3 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P2 æ¶èæ° + P2 æ§è¡å®éæ¾çèµæºæ° = 0 - 0 +ï¼0 + 1ï¼ = 1ã
æ§è¡å®æ P2 åï¼æä½ç³»ç»å©ä½å¯ç¨èµæºæ°ä¸º 4 2 1ã
| è¿ç¨ | æå¤§éæ±é | å·²åé èµæºæ° | ç¬¬äºæ¬¡åé éè¦çèµæºæ° |
|---|---|---|---|
| P1 | 6 5 2 | 1 2 1 | 5 3 1 |
| P2 | 宿 | 宿 | 宿 |
| P3 | 8 1 1 | 2 1 0 | 6 0 1 |
| P4 | 1 2 1 | 1 2 0 | 0 0 1 |
| P5 | 3 4 4 | 1 1 3 | 2 3 1 |
ç¬¬ä¸æ¥ï¼æ§è¡ P4
æ¤æ¶æä½ç³»ç»å©ä½å¯ç¨èµæºæ°ä¸º 4 2 1ï¼åªè½æ§è¡è¿ç¨ P4ï¼å ä¸ºå ¶ä»è¿ç¨èµæºä¸å¤ã
P4 æ§è¡ä¹åï¼éæ¾äºååæ¾å ¥ç 0 0 1 èµæºï¼èä¸å¯ä»¥éæ¾å·²åé ç 1 2 1 èµæºï¼æä»¥æ¤æ¶çèµæºå©ä½éã
èµæº R1 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P4 æ¶èæ° + P4 æ§è¡å®éæ¾çèµæºæ° = 4 - 0 +ï¼1 + 0ï¼ = 5ã
èµæº R2 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P4 æ¶èæ° + P4 æ§è¡å®éæ¾çèµæºæ° = 2 - 0 + ï¼2 + 0ï¼ = 4ã
èµæº R3 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P4 æ¶èæ° + P4 æ§è¡å®éæ¾çèµæºæ° = 1 - 1 +ï¼0 + 1ï¼ = 1ã
æ§è¡å®æ P4 åï¼æä½ç³»ç»å©ä½å¯ç¨èµæºæ°ä¸º 5 4 1ã
| è¿ç¨ | æå¤§éæ±é | å·²åé èµæºæ° | ç¬¬ä¸æ¬¡åé éè¦çèµæºæ° |
|---|---|---|---|
| P1 | 6 5 2 | 1 2 1 | 5 3 1 |
| P2 | 宿 | 宿 | 宿 |
| P3 | 8 1 1 | 2 1 0 | 6 0 1 |
| P4 | 宿 | 宿 | 宿 |
| P5 | 3 4 4 | 1 1 3 | 2 3 1 |
ç¬¬åæ¥ï¼æ§è¡ P5
æ¤æ¶æä½ç³»ç»å©ä½å¯ç¨èµæºæ°ä¸º 5 4 1ï¼åªè½æ§è¡è¿ç¨ P5ï¼å ä¸ºå ¶ä»è¿ç¨èµæºä¸å¤ã
P5 æ§è¡ä¹åï¼éæ¾äºååæ¾å ¥ç 2 3 1 èµæºï¼èä¸å¯ä»¥éæ¾å·²åé ç 1 1 3 èµæºï¼æä»¥æ¤æ¶çèµæºå©ä½éã
èµæº R1 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P5 æ¶èæ° + P5 æ§è¡å®éæ¾çèµæºæ° = 5 - 2 +ï¼1 + 2ï¼ = 6ã
èµæº R2 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P5 æ¶èæ° + P5 æ§è¡å®éæ¾çèµæºæ° = 4 - 3 + ï¼1 + 3ï¼ = 5ã
èµæº R3 çå©ä½å¯ç¨èµæºæ° = åèµæºæ° - æ§è¡ P5 æ¶èæ° + P5 æ§è¡å®éæ¾çèµæºæ° = 1 - 1 +ï¼3 + 1ï¼ = 4ã
æ§è¡å®æ P5 åï¼æä½ç³»ç»å©ä½å¯ç¨èµæºæ°ä¸º 6 5 4ã
| è¿ç¨ | æå¤§éæ±é | å·²åé èµæºæ° | ç¬¬ä¸æ¬¡åé éè¦çèµæºæ° |
|---|---|---|---|
| P1 | 6 5 2 | 1 2 1 | 5 3 1 |
| P2 | 宿 | 宿 | 宿 |
| P3 | 8 1 1 | 2 1 0 | 6 0 1 |
| P4 | 宿 | 宿 | 宿 |
| P5 | 宿 | 宿 | 宿 |
ç¬¬äºæ¥ï¼æ§è¡ P1 æè P3
æ¤æ¶æä½ç³»ç»å©ä½å¯ç¨èµæºæ°ä¸º 6 5 4ï¼å¯ä»¥æ§è¡ P1 æ P3ã
æä»¥å®å ¨æ§è¡é¡ºåºä¸º p2 => p4 => p5 => p1 => p3 æ p2 => p4 => p5 => p3 => p1ã

æ

é¶è¡å®¶ç®æ³æ»ç»
é¶è¡å®¶ç®æ³çæ ¸å¿ææ³ï¼å°±æ¯å¨åé ç»è¿ç¨èµæºåï¼é¦å 夿è¿ä¸ªè¿ç¨çå®å ¨æ§ï¼ä¹å°±æ¯é¢æ§è¡ï¼å¤æåé 忝å¦äº§çæ»éç°è±¡ãå¦æç³»ç»å½åèµæºè½æ»¡è¶³å ¶æ§è¡ï¼åå°è¯åé ï¼å¦æä¸æ»¡è¶³å让该è¿ç¨çå¾ ã
éè¿ä¸ææ£æ¥å©ä½å¯ç¨èµæºæ¯å¦æ»¡è¶³æä¸ªè¿ç¨çæå¤§éæ±ï¼å¦æå¯ä»¥åå å ¥å®å ¨åºåï¼å¹¶æè¯¥è¿ç¨å½åææçèµæºåæ¶ï¼ä¸æéå¤è¿ä¸ªè¿ç¨ï¼çæåè½å¦å®ç°è®©ææè¿ç¨é½å å ¥å®å ¨åºåãå®å ¨åºåä¸å®ä¸ä¼åçæ»éï¼ä½æ²¡ææ»éä¸ä¸å®æ¯å®å ¨åºåã
# ä¹è§éåæ²è§éæä»ä¹åºå«ï¼
ä¹è§éï¼
- åºæ¬ææ³ï¼ä¹è§éå设å¤ä¸ªäºå¡ä¹é´å¾å°åçå²çªï¼å æ¤å¨è¯»åæ°æ®æ¶ä¸ä¼å éï¼èæ¯å¨æ´æ°æ°æ®æ¶æ£æ¥æ°æ®ççæ¬ï¼å¦ä½¿ç¨çæ¬å·ææ¶é´æ³ï¼ï¼å¦æçæ¬å¹é åæ§è¡æ´æ°æä½ï¼å¦å认为åçäºå²çªã
- 使ç¨åºæ¯ï¼ä¹è§ééç¨äºè¯»å¤åå°çåºæ¯ï¼å¯ä»¥åå°éçç«äºï¼æé«å¹¶åæ§è½ãä¾å¦ï¼æ°æ®åºä¸çä¹è§éæºå¶å¯ä»¥ç¨äºå¤çå¹¶åæ´æ°åä¸è¡æ°æ®çæ åµã
æ²è§éï¼
- åºæ¬ææ³ï¼æ²è§éå设å¤ä¸ªäºå¡ä¹é´ä¼é¢ç¹åçå²çªï¼å æ¤å¨è¯»åæ°æ®æ¶ä¼å éï¼é²æ¢å ¶ä»äºå¡å¯¹æ°æ®è¿è¡ä¿®æ¹ï¼ç´å°å½åäºå¡å®ææä½åæéæ¾éã
- 使ç¨åºæ¯ï¼æ²è§ééç¨äºåå¤çåºæ¯ï¼éè¿å éä¿è¯æ°æ®çä¸è´æ§ãä¾å¦ï¼æ°æ®åºä¸çè¡çº§éæºå¶å¯ä»¥ç¨äºå¤çå¹¶åæ´æ°åä¸è¡æ°æ®çæ åµã
ä¹è§ééç¨äºè¯»å¤åå°çåºæ¯ï¼éè¿çæ¬æ§å¶æ¥å¤çå²çªï¼èæ²è§ééç¨äºåå¤çåºæ¯ï¼éè¿å 鿥é¿å å²çªã
# å å管ç
# ä»ç»ä¸ä¸æä½ç³»ç»å å管ç
æä½ç³»ç»è®¾è®¡äºèæå åï¼æ¯ä¸ªè¿ç¨é½æèªå·±çç¬ç«çèæå åï¼æä»¬æåçç¨åºä¸ä¼ç´æ¥ä¸ç©çå æäº¤éã

æäºèæå åä¹åï¼å®å¸¦æ¥äºè¿äºå¥½å¤ï¼
- 第ä¸ï¼èæå åå¯ä»¥ä½¿å¾è¿ç¨å¯¹è¿è¡å åè¶ è¿ç©çå å大å°ï¼å 为ç¨åºè¿è¡ç¬¦åå±é¨æ§åçï¼CPU 访é®å å伿徿æ¾çéå¤è®¿é®çå¾åæ§ï¼å¯¹äºé£äºæ²¡æè¢«ç»å¸¸ä½¿ç¨å°çå åï¼æä»¬å¯ä»¥æå®æ¢åºå°ç©çå åä¹å¤ï¼æ¯å¦ç¡¬çä¸ç swap åºåã
- 第äºï¼ç±äºæ¯ä¸ªè¿ç¨é½æèªå·±çé¡µè¡¨ï¼æä»¥æ¯ä¸ªè¿ç¨çèæå å空é´å°±æ¯ç¸äºç¬ç«çãè¿ç¨ä¹æ²¡æåæ³è®¿é®å ¶ä»è¿ç¨çé¡µè¡¨ï¼æä»¥è¿äºé¡µè¡¨æ¯ç§æçï¼è¿å°±è§£å³äºå¤è¿ç¨ä¹é´å°åå²çªçé®é¢ã
- 第ä¸ï¼é¡µè¡¨éç页表项ä¸é¤äºç©çå°åä¹å¤ï¼è¿æä¸äºæ è®°å±æ§çæ¯ç¹ï¼æ¯å¦æ§å¶ä¸ä¸ªé¡µç读åæéï¼æ 记该页æ¯å¦åå¨çãå¨å åè®¿é®æ¹é¢ï¼æä½ç³»ç»æä¾äºæ´å¥½çå®å ¨æ§ã
Linux æ¯éè¿å¯¹å ååé¡µçæ¹å¼æ¥ç®¡çå åï¼åé¡µæ¯ææ´ä¸ªèæåç©çå å空é´åæä¸æ®µæ®µåºå®å°ºå¯¸ç大å°ãè¿æ ·ä¸ä¸ªè¿ç»å¹¶ä¸å°ºå¯¸åºå®çå å空é´ï¼æä»¬å«é¡µï¼Pageï¼ãå¨ Linux ä¸ï¼æ¯ä¸é¡µç大å°ä¸º 4KBã
èæå°åä¸ç©çå°åä¹é´éè¿é¡µè¡¨æ¥æ å°ï¼å¦ä¸å¾ï¼

页表æ¯åå¨å¨å åéçï¼å å管çåå ï¼MMUï¼å°±åå°èæå åå°åè½¬æ¢æç©çå°åçå·¥ä½ã
èå½è¿ç¨è®¿é®çèæå°åå¨é¡µè¡¨ä¸æ¥ä¸å°æ¶ï¼ç³»ç»ä¼äº§çä¸ä¸ªç¼ºé¡µå¼å¸¸ï¼è¿å ¥ç³»ç»å æ ¸ç©ºé´åé ç©çå åãæ´æ°è¿ç¨é¡µè¡¨ï¼æååè¿åç¨æ·ç©ºé´ï¼æ¢å¤è¿ç¨çè¿è¡ã
# ä»ä¹æ¯èæå ååç©çå åï¼
- èæå åï¼æ¯æä½ç³»ç»æä¾ç»æ¯ä¸ªè¿è¡ä¸ç¨åºçä¸ç§å°å空é´ï¼æ¯ä¸ªç¨åºå¨è¿è¡æ¶è®¤ä¸ºèªå·±æ¥æçå å空é´å°±æ¯èæå åï¼å ¶å¤§å°å¯ä»¥è¿è¿å¤§äºç©çå åç大å°ãèæå åéè¿å°ç¨åºçå°å空é´ååæè¥å¹²ä¸ªåºå®å¤§å°çé¡µææ®µï¼å¹¶å°è¿äºé¡µæè 段æ å°å°ç©çå åä¸çä¸åä½ç½®ï¼ä»è使å¾ç¨åºå¨è¿è¡æ¶å¯ä»¥æ´é«æå°å©ç¨ç©çå åã
- ç©çå åï¼ç©çå åæ¯è®¡ç®æºå®é åå¨çå åï¼æ¯è®¡ç®æºä¸çå®é 硬件é¨ä»¶ã
# 讲ä¸ä¸é¡µè¡¨ï¼
åé¡µæ¯ææ´ä¸ªèæåç©çå å空é´åæä¸æ®µæ®µåºå®å°ºå¯¸ç大å°ãè¿æ ·ä¸ä¸ªè¿ç»å¹¶ä¸å°ºå¯¸åºå®çå å空é´ï¼æä»¬å«é¡µï¼Pageï¼ãå¨ Linux ä¸ï¼æ¯ä¸é¡µç大å°ä¸º 4KBã
èæå°åä¸ç©çå°åä¹é´éè¿é¡µè¡¨æ¥æ å°ï¼å¦ä¸å¾ï¼

页表æ¯åå¨å¨å åéçï¼å å管çåå ï¼MMUï¼å°±åå°èæå åå°åè½¬æ¢æç©çå°åçå·¥ä½ã
èå½è¿ç¨è®¿é®çèæå°åå¨é¡µè¡¨ä¸æ¥ä¸å°æ¶ï¼ç³»ç»ä¼äº§çä¸ä¸ªç¼ºé¡µå¼å¸¸ï¼è¿å ¥ç³»ç»å æ ¸ç©ºé´åé ç©çå åãæ´æ°è¿ç¨é¡µè¡¨ï¼æååè¿åç¨æ·ç©ºé´ï¼æ¢å¤è¿ç¨çè¿è¡ã
å åå页ç±äºå å空é´é½æ¯é¢å åå好çï¼ä¹å°±ä¸ä¼åå ååæ®µä¸æ ·ï¼å¨æ®µä¸æ®µä¹é´ä¼äº§çé´éé常å°çå åï¼è¿æ£æ¯å段ä¼äº§çå¤é¨å åç¢ççåå ãèéç¨äºå页ï¼é¡µä¸é¡µä¹é´æ¯ç´§å¯æåçï¼æä»¥ä¸ä¼æå¤é¨ç¢çã
使¯ï¼å 为å åå页æºå¶åé å åçæå°å使¯ä¸é¡µï¼å³ä½¿ç¨åºä¸è¶³ä¸é¡µå¤§å°ï¼æä»¬æå°åªè½åé ä¸ä¸ªé¡µï¼æä»¥é¡µå ä¼åºç°å åæµªè´¹ï¼æä»¥é对å åå页æºå¶ä¼æå é¨å åç¢ççç°è±¡ã
å¨å页æºå¶ä¸ï¼èæå°åå为两é¨åï¼é¡µå·å页å åç§»ã页å·ä½ä¸ºé¡µè¡¨çç´¢å¼ï¼é¡µè¡¨å å«ç©ç页æ¯é¡µæå¨ç©çå åçåºå°åï¼è¿ä¸ªåºå°åä¸é¡µå åç§»çç»å就形æäºç©çå åå°åï¼è§ä¸å¾ã

æ»ç»ä¸ä¸ï¼å¯¹äºä¸ä¸ªå åå°å转æ¢ï¼å ¶å®å°±æ¯è¿æ ·ä¸ä¸ªæ¥éª¤ï¼
- æèæå åå°åï¼ååæé¡µå·ååç§»éï¼
- æ ¹æ®é¡µå·ï¼ä»é¡µè¡¨éé¢ï¼æ¥è¯¢å¯¹åºçç©ç页å·ï¼
- ç´æ¥æ¿ç©ç页å·ï¼å ä¸åé¢çåç§»éï¼å°±å¾å°äºç©çå åå°åã
ä¸é¢ä¸¾ä¸ªä¾åï¼èæå åä¸ç页éè¿é¡µè¡¨æ å°ä¸ºäºç©çå åä¸ç页ï¼å¦ä¸å¾ï¼

# 讲ä¸ä¸æ®µè¡¨ï¼
èæå°åä¹å¯ä»¥éè¿æ®µè¡¨ä¸ç©çå°åè¿è¡æ å°çï¼å段æºå¶ä¼æç¨åºçèæå°ååæ 4 ä¸ªæ®µï¼æ¯ä¸ªæ®µå¨æ®µè¡¨ä¸æä¸ä¸ªé¡¹ï¼å¨è¿ä¸é¡¹æ¾å°æ®µçåºå°åï¼åå ä¸åç§»éï¼äºæ¯å°±è½æ¾å°ç©çå åä¸çå°åï¼å¦ä¸å¾ï¼

妿è¦è®¿é®æ®µ 3 ä¸åç§»é 500 çèæå°åï¼æä»¬å¯ä»¥è®¡ç®åºç©çå°åä¸ºï¼æ®µ 3 åºå°å 7000 + åç§»é 500 = 7500ã
# èæå°åæ¯æä¹è½¬åå°ç©çå°åçï¼
èæå°å转å为ç©çå°åæ¯éè¿å å管çåå ï¼Memory Management Unitï¼MMUï¼æ¥å®æçãMMUæ¯è®¡ç®æºç³»ç»ä¸ç硬件ç»ä»¶ï¼è´è´£èæå°ååç©çå°åä¹é´ç转æ¢ã
å¨èæå°å转æ¢çè¿ç¨ä¸ï¼é常ä¼ä½¿ç¨é¡µè¡¨ï¼Page Tableï¼æ¥è¿è¡æ å°ã页表æ¯ä¸ç§æ°æ®ç»æï¼å®å°èæå°å空é´åå为åºå®å¤§å°ç页ï¼Pageï¼ï¼å¯¹åºäºç©çå åä¸ç页æ¡ï¼Page Frameï¼ãæ¯ä¸ªé¡µè¡¨é¡¹ï¼Page Table Entryï¼è®°å½äºèæé¡µåç©ç页ç对åºå ³ç³»ã
å½ç¨åºè®¿é®ä¸ä¸ªèæå°åæ¶ï¼MMUä¼å°èæå°åå解为页å·å页å åç§»éãç¶åï¼MMU伿¥æ¾é¡µè¡¨ï¼æ ¹æ®é¡µå·æ¾å°å¯¹åºç页表项ã页表项ä¸å å«äºç©ç页çå°åæé¡µæ¡å·ãæåï¼MMUå°ç©ç页çå°åä¸é¡µå åç§»éç»åï¼å¾å°å¯¹åºçç©çå°åã
èæå°å转å为ç©çå°åçè¿ç¨ä¸ï¼è¿å¯è½æ¶åå°å¤çº§é¡µè¡¨ãTLBï¼Translation Lookaside Bufferï¼ç¼åçæºå¶ï¼ä»¥æé«å°å转æ¢çæçã

# ç¨åºçå åå¸å±æ¯æä¹æ ·çï¼

éè¿è¿å¼ å¾ä½ å¯ä»¥çå°ï¼ç¨æ·ç©ºé´å åï¼ä»ä½å°é«å嫿¯ 6 ç§ä¸åçå åæ®µï¼
- ä»£ç æ®µï¼å æ¬äºè¿å¶å¯æ§è¡ä»£ç ï¼
- æ°æ®æ®µï¼å æ¬å·²åå§åçéæå¸¸éåå ¨å±åéï¼
- BSS 段ï¼å æ¬æªåå§åçéæåéåå ¨å±åéï¼
- å æ®µï¼å æ¬å¨æåé çå åï¼ä»ä½å°åå¼å§åä¸å¢é¿ï¼
- æä»¶æ å°æ®µï¼å æ¬å¨æåºãå ±äº«å åçï¼
- æ æ®µï¼å
æ¬å±é¨åéå彿°è°ç¨çä¸ä¸æçãæ ç大尿¯åºå®çï¼ä¸è¬æ¯
8 MBãå½ç¶ç³»ç»ä¹æä¾äºåæ°ï¼ä»¥ä¾¿æä»¬èªå®ä¹å¤§å°ï¼
ä¸å¾ä¸çå åå¸å±å¯ä»¥çå°ï¼ä»£ç 段ä¸é¢è¿æä¸æ®µå å空é´çï¼ç°è²é¨åï¼ï¼è¿ä¸ååºåæ¯ãä¿çåºãï¼ä¹æä»¥è¦æä¿çåºè¿æ¯å 为å¨å¤§å¤æ°çç³»ç»éï¼æä»¬è®¤ä¸ºæ¯è¾å°æ°å¼çå°å䏿¯ä¸ä¸ªåæ³å°åï¼ä¾å¦ï¼æä»¬éå¸¸å¨ C ç代ç éä¼å°æ æçæéèµå¼ä¸º NULLãå æ¤ï¼è¿éä¼åºç°ä¸æ®µä¸å¯è®¿é®çå åä¿çåºï¼é²æ¢ç¨åºå 为åºç° bugï¼å¯¼è´è¯»æåäºä¸äºå°å åå°åçæ°æ®ï¼è使å¾ç¨åºè·é£ã
å¨è¿ 7 个å
åæ®µä¸ï¼å åæä»¶æ å°æ®µçå
忝卿åé
çãæ¯å¦è¯´ï¼ä½¿ç¨ C æ ååºç malloc() æè
mmap() ï¼å°±å¯ä»¥åå«å¨å åæä»¶æ å°æ®µå¨æåé
å
åã
# å åæ çåºå«ï¼
- åé æ¹å¼ï¼å æ¯å¨æåé å åï¼ç±ç¨åºåæå¨ç³è¯·åéæ¾å åï¼é常ç¨äºåå¨å¨ææ°æ®ç»æåå¯¹è±¡ãæ æ¯éæåé å åï¼ç±ç¼è¯å¨èªå¨åé åéæ¾å åï¼ç¨äºåå¨å½æ°çå±é¨åéå彿°è°ç¨ä¿¡æ¯ã
- å å管çï¼å éè¦ç¨åºåæå¨ç®¡çå åçåé åéæ¾ï¼å¦æç®¡çä¸å½å¯è½ä¼å¯¼è´å åæ³æ¼æå åæº¢åºãæ ç±ç¼è¯å¨èªå¨ç®¡çå åï¼éµå¾ªåè¿å åºçååï¼åéççå½å¨æç±å ¶ä½ç¨åå³å®ï¼å½æ°è°ç¨æ¶åé å åï¼å½æ°è¿åæ¶éæ¾å åã
- 大å°åé度ï¼å éå¸¸æ¯æ 大ï¼å å空é´è¾å¤§ï¼å¨æåé åéæ¾å åéè¦æ¶é´å¼éãæ å¤§å°æéï¼é常æ¯è¾å°ï¼å ååé åéæ¾é度è¾å¿«ï¼å 为æ¯ç¼è¯å¨èªå¨ç®¡çã
# fork()ä¼å¤å¶åªäºä¸è¥¿ï¼
- fork é¶æ®µä¼å¤å¶ç¶è¿ç¨ç页表ï¼èæå åï¼
- fork ä¹åï¼å¦æåçäºåæ¶å¤å¶ï¼å°±ä¼å¤å¶ç©çå å
# ä»ç»copy on write(åæ¶å¤å¶)
主è¿ç¨å¨æ§è¡ fork çæ¶åï¼æä½ç³»ç»ä¼æä¸»è¿ç¨çã页表ãå¤å¶ä¸ä»½ç»åè¿ç¨ï¼è¿ä¸ªé¡µè¡¨è®°å½çèæå°ååç©çå°åæ å°å ³ç³»ï¼èä¸ä¼å¤å¶ç©çå åï¼ä¹å°±æ¯è¯´ï¼ä¸¤è çèæç©ºé´ä¸åï¼ä½å ¶å¯¹åºçç©çç©ºé´æ¯åä¸ä¸ªã

è¿æ ·ä¸æ¥ï¼åè¿ç¨å°±å ±äº«äºç¶è¿ç¨çç©çå åæ°æ®äºï¼è¿æ ·è½å¤è约ç©çå åèµæºï¼é¡µè¡¨å¯¹åºç页表项ç屿§ä¼æ 记该ç©çå åçæé为åªè¯»ã
ä¸è¿ï¼å½ç¶è¿ç¨æè åè¿ç¨å¨åè¿ä¸ªå ååèµ·åæä½æ¶ï¼CPU å°±ä¼è§¦ååä¿æ¤ä¸æï¼è¿ä¸ªåä¿æ¤ä¸ææ¯ç±äºè¿åæé导è´çï¼ç¶åæä½ç³»ç»ä¼å¨ãåä¿æ¤ä¸æå¤ç彿°ãéè¿è¡ç©çå åçå¤å¶ï¼å¹¶éæ°è®¾ç½®å ¶å åæ å°å ³ç³»ï¼å°ç¶åè¿ç¨çå å读åæé设置为å¯è¯»åï¼æåæä¼å¯¹å åè¿è¡åæä½ï¼è¿ä¸ªè¿ç¨è¢«ç§°ä¸ºãåæ¶å¤å¶(Copy On Write)ãã
åæ¶å¤å¶é¡¾åæä¹ï¼å¨åçåæä½çæ¶åï¼æä½ç³»ç»æä¼å»å¤å¶ç©çå åï¼è¿æ ·æ¯ä¸ºäºé²æ¢ fork å建åè¿ç¨æ¶ï¼ç±äºç©çå åæ°æ®çå¤å¶æ¶é´è¿é¿è导è´ç¶è¿ç¨é¿æ¶é´é»å¡çé®é¢ã
# copy on writeèçäºä»ä¹èµæºï¼
èçäºç©çå åçèµæºï¼å 为 fork çæ¶åï¼åè¿ç¨ä¸éè¦å¤å¶ç¶è¿ç¨çç©çå åï¼é¿å äºä¸å¿ è¦çå åå¤å¶å¼éï¼åè¿ç¨åªéè¦å¤å¶ç¶è¿ç¨ç页表ï¼è¿æ¶åç¶åè¿ç¨ç页表æåç齿¯å ±äº«çç©çå åã
åªæå½ç¶åè¿ç¨ä»»ä½æä¸æ¹å¯¹è¿çå ±äº«çç©çå ååçäºä¿®æ¹æä½ï¼æä¼è§¦ååæ¶å¤å¶æºå¶ï¼è¿æ¶åæä¼å¤å¶åçä¿®æ¹æä½çç©çå åã
# malloc 1KBå1MB æä»ä¹åºå«ï¼
malloc() æºç éé»è®¤å®ä¹äºä¸ä¸ªéå¼ï¼
- å¦æç¨æ·åé çå åå°äº 128 KBï¼åéè¿ brk() ç³è¯·å åï¼
- å¦æç¨æ·åé çå åå¤§äº 128 KBï¼åéè¿ mmap() ç³è¯·å åï¼
注æï¼ä¸åç glibc çæ¬å®ä¹çéå¼ä¹æ¯ä¸åçã
# ä»ç»ä¸ä¸brkï¼mmap
å®é ä¸ï¼malloc() 并䏿¯ç³»ç»è°ç¨ï¼èæ¯ C åºéç彿°ï¼ç¨äºå¨æåé å åã
malloc ç³è¯·å åçæ¶åï¼ä¼æä¸¤ç§æ¹å¼åæä½ç³»ç»ç³è¯·å å åã
- æ¹å¼ä¸ï¼éè¿ brk() ç³»ç»è°ç¨ä»å åé å å
- æ¹å¼äºï¼éè¿ mmap() ç³»ç»è°ç¨å¨æä»¶æ å°åºååé å åï¼
æ¹å¼ä¸å®ç°çæ¹å¼å¾ç®åï¼å°±æ¯éè¿ brk() 彿°å°ãå é¡¶ãæéåé«å°åç§»å¨ï¼è·å¾æ°çå å空é´ãå¦ä¸å¾ï¼

æ¹å¼äºéè¿ mmap() ç³»ç»è°ç¨ä¸ãç§æå¿åæ å°ãçæ¹å¼ï¼å¨æä»¶æ å°åºåé ä¸åå åï¼ä¹å°±æ¯ä»æä»¶æ å°åºâå·âäºä¸åå åãå¦ä¸å¾ï¼

# æä½ç³»ç»å åä¸è¶³çæ¶åä¼åçä»ä¹ï¼
åºç¨ç¨åºéè¿ malloc 彿°ç³è¯·å åçæ¶åï¼å®é ä¸ç³è¯·çæ¯èæå åï¼æ¤æ¶å¹¶ä¸ä¼åé ç©çå åã
å½åºç¨ç¨åºè¯»åäºè¿åèæå åï¼CPU å°±ä¼å»è®¿é®è¿ä¸ªèæå åï¼ è¿æ¶ä¼åç°è¿ä¸ªèæå åæ²¡ææ å°å°ç©çå åï¼ CPU å°±ä¼äº§çç¼ºé¡µä¸æï¼è¿ç¨ä¼ä»ç¨æ·æåæ¢å°å æ ¸æï¼å¹¶å°ç¼ºé¡µä¸æäº¤ç»å æ ¸ç Page Fault Handler ï¼ç¼ºé¡µä¸æå½æ°ï¼å¤çã
ç¼ºé¡µä¸æå¤ç彿°ä¼çæ¯å¦æç©ºé²çç©çå åï¼å¦ææï¼å°±ç´æ¥åé ç©çå åï¼å¹¶å»ºç«èæå åä¸ç©çå åä¹é´çæ å°å ³ç³»ã
å¦ææ²¡æç©ºé²çç©çå åï¼é£ä¹å æ ¸å°±ä¼å¼å§è¿è¡åæ¶å åçå·¥ä½ï¼åæ¶çæ¹å¼ä¸»è¦æ¯ä¸¤ç§ï¼ç´æ¥å ååæ¶ååå°å ååæ¶ã
- åå°å ååæ¶ï¼kswapdï¼ï¼å¨ç©çå åç´§å¼ çæ¶åï¼ä¼å¤é kswapd å æ ¸çº¿ç¨æ¥åæ¶å åï¼è¿ä¸ªåæ¶å åçè¿ç¨å¼æ¥çï¼ä¸ä¼é»å¡è¿ç¨çæ§è¡ã
- ç´æ¥å ååæ¶ï¼direct reclaimï¼ï¼å¦æåå°å¼æ¥åæ¶è·ä¸ä¸è¿ç¨å åç³è¯·çé度ï¼å°±ä¼å¼å§ç´æ¥åæ¶ï¼è¿ä¸ªåæ¶å åçè¿ç¨æ¯åæ¥çï¼ä¼é»å¡è¿ç¨çæ§è¡ã
å¦æç´æ¥å ååæ¶åï¼ç©ºé²çç©çå åä»ç¶æ æ³æ»¡è¶³æ¤æ¬¡ç©çå åçç³è¯·ï¼é£ä¹å æ ¸å°±ä¼æ¾æåç大æäº ââ触å OOM ï¼Out of Memoryï¼æºå¶ã
OOM Killer æºå¶ä¼æ ¹æ®ç®æ³éæ©ä¸ä¸ªå ç¨ç©çå åè¾é«çè¿ç¨ï¼ç¶åå°å ¶ææ»ï¼ä»¥ä¾¿éæ¾å åèµæºï¼å¦æç©çå åä¾ç¶ä¸è¶³ï¼OOM Killer ä¼ç»§ç»ææ»å ç¨ç©çå åè¾é«çè¿ç¨ï¼ç´å°éæ¾è¶³å¤çå åä½ç½®ã
ç³è¯·ç©çå åçè¿ç¨å¦ä¸å¾ï¼

ç³»ç»å åç´§å¼ çæ¶åï¼å°±ä¼è¿è¡åæ¶å åçå·¥ä½ï¼é£å ·ä½åªäºå 忝å¯ä»¥è¢«åæ¶çå¢ï¼
ä¸»è¦æä¸¤ç±»å åå¯ä»¥è¢«åæ¶ï¼èä¸å®ä»¬çåæ¶æ¹å¼ä¹ä¸åã
- æä»¶é¡µï¼File-backed Pageï¼ï¼å æ ¸ç¼åçç£çæ°æ®ï¼Bufferï¼åå æ ¸ç¼åçæä»¶æ°æ®ï¼Cacheï¼é½å«ä½æä»¶é¡µã大é¨åæä»¶é¡µï¼é½å¯ä»¥ç´æ¥éæ¾å åï¼ä»¥åæéè¦æ¶ï¼åä»ç£çéæ°è¯»åå°±å¯ä»¥äºãèé£äºè¢«åºç¨ç¨åºä¿®æ¹è¿ï¼å¹¶ä¸ææ¶è¿æ²¡åå ¥ç£ççæ°æ®ï¼ä¹å°±æ¯è页ï¼ï¼å°±å¾å åå ¥ç£çï¼ç¶åæè½è¿è¡å åéæ¾ãæä»¥ï¼åæ¶å¹²åé¡µçæ¹å¼æ¯ç´æ¥éæ¾å åï¼åæ¶èé¡µçæ¹å¼æ¯å ååç£çååéæ¾å åã
- å¿å页ï¼Anonymous Pageï¼ï¼è¿é¨åå åæ²¡æå®é è½½ä½ï¼ä¸åæä»¶ç¼åæç¡¬çæä»¶è¿æ ·ä¸ä¸ªè½½ä½ï¼æ¯å¦å ãæ æ°æ®çãè¿é¨åå åå¾å¯è½è¿è¦å次被访é®ï¼æä»¥ä¸è½ç´æ¥éæ¾å åï¼å®ä»¬åæ¶çæ¹å¼æ¯éè¿ Linux ç Swap æºå¶ï¼Swap 伿ä¸å¸¸è®¿é®çå åå åå°ç£çä¸ï¼ç¶åéæ¾è¿äºå åï¼ç»å ¶ä»æ´éè¦çè¿ç¨ä½¿ç¨ã忬¡è®¿é®è¿äºå åæ¶ï¼éæ°ä»ç£çè¯»å ¥å åå°±å¯ä»¥äºã
æä»¶é¡µåå¿å页ç忶齿¯åºäº LRU ç®æ³ï¼ä¹å°±æ¯ä¼å åæ¶ä¸å¸¸è®¿é®çå åãLRU åæ¶ç®æ³ï¼å®é ä¸ç»´æ¤ç active å inactive 两个ååé¾è¡¨ï¼å ¶ä¸ï¼
- active_list æ´»è·å å页é¾è¡¨ï¼è¿éåæ¾çæ¯æè¿è¢«è®¿é®è¿ï¼æ´»è·ï¼çå å页ï¼
- inactive_list 䏿´»è·å å页é¾è¡¨ï¼è¿éåæ¾çæ¯å¾å°è¢«è®¿é®ï¼éæ´»è·ï¼çå å页ï¼
è¶æ¥è¿é¾è¡¨å°¾é¨ï¼å°±è¡¨ç¤ºå å页è¶ä¸å¸¸è®¿é®ãè¿æ ·ï¼å¨åæ¶å åæ¶ï¼ç³»ç»å°±å¯ä»¥æ ¹æ®æ´»è·ç¨åº¦ï¼ä¼å 忶䏿´»è·çå åã
# 页é¢ç½®æ¢æåªäºç®æ³ï¼
页é¢ç½®æ¢ç®æ³çåè½æ¯ï¼å½åºç°ç¼ºé¡µå¼å¸¸ï¼éè°å ¥æ°é¡µé¢èå å已满æ¶ï¼éæ©è¢«ç½®æ¢çç©ç页é¢ï¼ä¹å°±æ¯è¯´éæ©ä¸ä¸ªç©ç页颿¢åºå°ç£çï¼ç¶åæéè¦è®¿é®ç页颿¢å ¥å°ç©ç页ã
é£å ¶ç®æ³ç®æ 忝ï¼å°½å¯è½åå°é¡µé¢çæ¢å ¥æ¢åºç次æ°ï¼å¸¸è§ç页é¢ç½®æ¢ç®æ³æå¦ä¸å ç§ï¼
- æä½³é¡µé¢ç½®æ¢ç®æ³ï¼OPTï¼
- å è¿å åºç½®æ¢ç®æ³ï¼FIFOï¼
- æè¿æä¹ æªä½¿ç¨çç½®æ¢ç®æ³ï¼LRUï¼
- æ¶é页é¢ç½®æ¢ç®æ³ï¼Lockï¼
- æä¸å¸¸ç¨ç½®æ¢ç®æ³ï¼LFUï¼
æä½³é¡µé¢ç½®æ¢ç®æ³
æä½³é¡µé¢ç½®æ¢ç®æ³åºæ¬æè·¯æ¯ï¼ç½®æ¢å¨ãæªæ¥ãæé¿æ¶é´ä¸è®¿é®ç页é¢ã
æä»¥ï¼è¯¥ç®æ³å®ç°éè¦è®¡ç®å å䏿¯ä¸ªé»è¾é¡µé¢çãä¸ä¸æ¬¡ãè®¿é®æ¶é´ï¼ç¶åæ¯è¾ï¼éæ©æªæ¥æé¿æ¶é´ä¸è®¿é®ç页é¢ã
æä»¬ä¸¾ä¸ªä¾åï¼å设ä¸å¼å§æ 3 个空é²çç©ç页ï¼ç¶åæè¯·æ±ç页é¢åºåï¼é£å®çç½®æ¢è¿ç¨å¦ä¸å¾ï¼

å¨è¿ä¸ªè¯·æ±ç页é¢åºåä¸ï¼ç¼ºé¡µå
±åçäº 7 次ï¼ç©ºé²é¡µæ¢å
¥ 3 次 + æä¼é¡µé¢ç½®æ¢ 4 次ï¼ï¼é¡µé¢ç½®æ¢å
±åçäº 4 次ã
è¿å¾çæ³ï¼ä½æ¯å®é ç³»ç»ä¸æ æ³å®ç°ï¼å 为ç¨åºè®¿é®é¡µé¢æ¶æ¯å¨æçï¼æä»¬æ¯æ æ³é¢ç¥æ¯ä¸ªé¡µé¢å¨ãä¸ä¸æ¬¡ã访é®åççå¾ æ¶é´ã
æä»¥ï¼æä½³é¡µé¢ç½®æ¢ç®æ³ä½ç¨æ¯ä¸ºäºè¡¡éä½ çç®æ³çæçï¼ä½ çç®æ³æçè¶æ¥è¿è¯¥ç®æ³çæçï¼é£ä¹è¯´æä½ çç®æ³æ¯é«æçã
å è¿å åºç½®æ¢ç®æ³
æ¢ç¶æä»¬æ æ³é¢ç¥é¡µé¢å¨ä¸ä¸æ¬¡è®¿é®åæéççå¾ æ¶é´ï¼é£æä»¬å¯ä»¥éæ©å¨å åé©»çæ¶é´å¾é¿ç页é¢è¿è¡ä¸ç½®æ¢ï¼è¿ä¸ªå°±æ¯ãå è¿å åºç½®æ¢ãç®æ³çææ³ã
è¿æ¯ä»¥åé¢ç请æ±ç页é¢åºåä½ä¸ºä¾åï¼å设使ç¨å è¿å åºç½®æ¢ç®æ³ï¼åè¿ç¨å¦ä¸å¾ï¼

å¨è¿ä¸ªè¯·æ±ç页é¢åºåä¸ï¼ç¼ºé¡µå
±åçäº 10 次ï¼é¡µé¢ç½®æ¢å
±åçäº 7 次ï¼è·æä½³é¡µé¢ç½®æ¢ç®æ³æ¯è¾èµ·æ¥ï¼æ§è½ææ¾å·®äºå¾å¤ã
æè¿æä¹ æªä½¿ç¨çç½®æ¢ç®æ³
æè¿æä¹ æªä½¿ç¨ï¼LRUï¼çç½®æ¢ç®æ³çåºæ¬æè·¯æ¯ï¼åç缺页æ¶ï¼éæ©æé¿æ¶é´æ²¡æè¢«è®¿é®ç页é¢è¿è¡ç½®æ¢ï¼ä¹å°±æ¯è¯´ï¼è¯¥ç®æ³å设已ç»å¾ä¹ 没æä½¿ç¨ç页é¢å¾æå¯è½å¨æªæ¥è¾é¿ç䏿®µæ¶é´å ä»ç¶ä¸ä¼è¢«ä½¿ç¨ã
è¿ç§ç®æ³è¿ä¼¼æä¼ç½®æ¢ç®æ³ï¼æä¼ç½®æ¢ç®æ³æ¯éè¿ãæªæ¥ãçä½¿ç¨æ 嵿¥æ¨æµè¦æ·æ±°ç页é¢ï¼è LRU 忝éè¿ãåå²ãçä½¿ç¨æ 嵿¥æ¨æµè¦æ·æ±°ç页é¢ã
è¿æ¯ä»¥åé¢ç请æ±ç页é¢åºåä½ä¸ºä¾åï¼åè®¾ä½¿ç¨æè¿æä¹ æªä½¿ç¨çç½®æ¢ç®æ³ï¼åè¿ç¨å¦ä¸å¾ï¼

å¨è¿ä¸ªè¯·æ±ç页é¢åºåä¸ï¼ç¼ºé¡µå
±åçäº 9 次ï¼é¡µé¢ç½®æ¢å
±åçäº 6 次ï¼è·å
è¿å
åºç½®æ¢ç®æ³æ¯è¾èµ·æ¥ï¼æ§è½æé«äºä¸äºã
è½ç¶ LRU å¨çè®ºä¸æ¯å¯ä»¥å®ç°çï¼ä½ä»£ä»·å¾é«ã为äºå®å ¨å®ç° LRUï¼éè¦å¨å åä¸ç»´æ¤ä¸ä¸ªææé¡µé¢çé¾è¡¨ï¼æè¿æå¤ä½¿ç¨ç页é¢å¨è¡¨å¤´ï¼æè¿æå°ä½¿ç¨ç页é¢å¨è¡¨å°¾ã
å°é¾çæ¯ï¼å¨æ¯æ¬¡è®¿é®å åæ¶é½å¿ é¡»è¦æ´æ°ãæ´ä¸ªé¾è¡¨ããå¨é¾è¡¨ä¸æ¾å°ä¸ä¸ªé¡µé¢ï¼å é¤å®ï¼ç¶åæå®ç§»å¨å°è¡¨å¤´æ¯ä¸ä¸ªé常费æ¶çæä½ã
æä»¥ï¼LRU è½ç¶çä¸å»ä¸éï¼ä½æ¯ç±äºå¼éæ¯è¾å¤§ï¼å®é åºç¨ä¸æ¯è¾å°ä½¿ç¨ã
æ¶é页é¢ç½®æ¢ç®æ³
é£ææ²¡æä¸ç§å³è½ä¼åç½®æ¢ç次æ°ï¼ä¹è½æ¹ä¾¿å®ç°çç®æ³å¢ï¼
æ¶é页é¢ç½®æ¢ç®æ³å°±å¯ä»¥ä¸¤è å ¼å¾ï¼å®è· LRU è¿ä¼¼ï¼åæ¯å¯¹ FIFO çä¸ç§æ¹è¿ã
è¯¥ç®æ³çæè·¯æ¯ï¼æææç页é¢é½ä¿åå¨ä¸ä¸ªç±»ä¼¼éé¢çãç¯å½¢é¾è¡¨ãä¸ï¼ä¸ä¸ªè¡¨éæåæèç页é¢ã
å½åçç¼ºé¡µä¸ææ¶ï¼ç®æ³é¦å æ£æ¥è¡¨éæåç页é¢ï¼
- 妿å®ç访é®ä½ä½æ¯ 0 å°±æ·æ±°è¯¥é¡µé¢ï¼å¹¶ææ°çé¡µé¢æå ¥è¿ä¸ªä½ç½®ï¼ç¶åæè¡¨éåç§»ä¸ä¸ªä½ç½®ï¼
- å¦æè®¿é®ä½æ¯ 1 å°±æ¸ é¤è®¿é®ä½ï¼å¹¶æè¡¨éåç§»ä¸ä¸ªä½ç½®ï¼éå¤è¿ä¸ªè¿ç¨ç´å°æ¾å°äºä¸ä¸ªè®¿é®ä½ä¸º 0 ç页é¢ä¸ºæ¢ï¼
æç»äºä¸å¯æ¶é页é¢ç½®æ¢ç®æ³ç工使µç¨å¾ï¼ä½ å¯ä»¥å¨ä¸æ¹çå°ï¼

äºè§£äºè¿ä¸ªç®æ³ç工使¹å¼ï¼å°±æç½ä¸ºä»ä¹å®è¢«ç§°ä¸ºæ¶éï¼Clockï¼ç®æ³äºã
æä¸å¸¸ç¨ç®æ³
æä¸å¸¸ç¨ï¼LFUï¼ç®æ³ï¼è¿ååå¬èµ·æ¥å¾è°ç®ï¼ä½æ¯å®çææä¸æ¯æè¿ä¸ªç®æ³ä¸å¸¸ç¨ï¼èæ¯å½åçç¼ºé¡µä¸ææ¶ï¼éæ©ãè®¿é®æ¬¡æ°ãæå°çé£ä¸ªé¡µé¢ï¼å¹¶å°å ¶æ·æ±°ã
å®çå®ç°æ¹å¼æ¯ï¼å¯¹æ¯ä¸ªé¡µé¢è®¾ç½®ä¸ä¸ªã访é®è®¡æ°å¨ãï¼æ¯å½ä¸ä¸ªé¡µé¢è¢«è®¿é®æ¶ï¼è¯¥é¡µé¢ç访é®è®¡æ°å¨å°±ç´¯å 1ãå¨åçç¼ºé¡µä¸ææ¶ï¼æ·æ±°è®¡æ°å¨å¼æå°çé£ä¸ªé¡µé¢ã
çèµ·æ¥å¾ç®åï¼æ¯ä¸ªé¡µé¢å ä¸ä¸ªè®¡æ°å¨å°±å¯ä»¥å®ç°äºï¼ä½æ¯å¨æä½ç³»ç»ä¸å®ç°çæ¶åï¼æä»¬éè¦èèæçåç¡¬ä»¶ææ¬çã
è¦å¢å ä¸ä¸ªè®¡æ°å¨æ¥å®ç°ï¼è¿ä¸ªç¡¬ä»¶ææ¬æ¯æ¯è¾é«çï¼å¦å¤å¦æè¦å¯¹è¿ä¸ªè®¡æ°å¨æ¥æ¾åªä¸ªé¡µé¢è®¿é®æ¬¡æ°æå°ï¼æ¥æ¾é¾è¡¨æ¬èº«ï¼å¦æé¾è¡¨é¿åº¦å¾å¤§ï¼æ¯éå¸¸èæ¶çï¼æçä¸é«ã
ä½è¿æä¸ªé®é¢ï¼LFU ç®æ³åªèèäºé¢çé®é¢ï¼æ²¡èèæ¶é´çé®é¢ï¼æ¯å¦æäºé¡µé¢å¨è¿å»æ¶é´é访é®çé¢çå¾é«ï¼ä½æ¯ç°å¨å·²ç»æ²¡æè®¿é®äºï¼èå½åé¢ç¹è®¿é®ç页é¢ç±äºæ²¡æè¿äºé¡µé¢è®¿é®ç次æ°é«ï¼å¨åçç¼ºé¡µä¸ææ¶ï¼å°±ä¼å¯è½ä¼è¯¯ä¼¤å½ååå¼å§é¢ç¹è®¿é®ï¼ä½è®¿é®æ¬¡æ°è¿ä¸é«ç页é¢ã
é£è¿ä¸ªé®é¢çè§£å³çåæ³è¿æ¯æçï¼å¯ä»¥å®æåå°è®¿é®ç次æ°ï¼æ¯å¦å½åçæ¶é´ä¸ææ¶ï¼æè¿å»æ¶é´è®¿é®ç页é¢çè®¿é®æ¬¡æ°é¤ä»¥ 2ï¼ä¹å°±è¯´ï¼éçæ¶é´çæµå¤±ï¼ä»¥åçé«è®¿é®æ¬¡æ°ç页é¢ä¼æ ¢æ ¢åå°ï¼ç¸å½äºå 大äºè¢«ç½®æ¢çæ¦çã
# 䏿
# ä»ä¹æ¯ä¸æï¼
CPUåä¸å½åçå·¥ä½ä»»å¡ï¼å»å¤çå ¶ä»äºæ ï¼å¤çå®ååæ¥ç»§ç»æ§è¡åæçä»»å¡ï¼è¿ä¸è¿ç¨ä¾¿æ¯ä¸æã
䏿å为å¤é¨ä¸æåå é¨ä¸æï¼
å¤é¨ä¸æå为å¯å±è½ä¸æåä¸å¯å±è½ä¸æï¼
å¯å±è½ä¸æï¼éè¿INTR线åCPU请æ±ç䏿ï¼ä¸»è¦æ¥èªå¤é¨è®¾å¤å¦ç¡¬çï¼æå°æºï¼ç½å¡çãæ¤ç±»ä¸æå¹¶ä¸ä¼å½±åç³»ç»è¿è¡ï¼å¯éæ¶å¤çï¼çè³ä¸å¤çï¼æä»¥å为å¯å±è½ã
ä¸å¯å±è½ä¸æï¼éè¿NMI线åCPU请æ±ç䏿ï¼å¦çµæºæçµï¼ç¡¬ä»¶çº¿è·¯æ éçãè¿éä¸å¯å±è½çææä¸æ¯ä¸å¯ä»¥å±è½ï¼ä¸å»ºè®®å±è½ï¼èæ¯é®é¢å¤ªå¤§ï¼å±è½ä¸äºï¼ä¸è½å±è½çææã注ï¼INTRåNMI齿¯CPUçå¼è
å é¨ä¸æå为é·é±ãæ éãç»æ¢ï¼
é·é±ï¼æ¯ä¸ç§ææçï¼é¢å 宿çå¼å¸¸äºä»¶ï¼ä¸è¬æ¯å¨ç¼åç¨åºæ¶æ æè®¾ä¸çé·é±æä»¤ï¼èåæ§è¡å°é·é±æä»¤åï¼CPUå°ä¼è°ç¨ç¹å®ç¨åºè¿è¡ç¸åºçå¤çï¼å¤çç»æåè¿åå°é·é±æä»¤çä¸ä¸æ¡æä»¤ãå¦ç³»ç»è°ç¨ï¼ç¨åºè°è¯åè½çãå¦printf彿°ï¼æåºå±çå®ç°ä¸ä¼æä¸æ¡int 0x80æä»¤ï¼è¿å°±æ¯ä¸æ¡é·é±æä»¤ï¼ä½¿ç¨0x80å·ä¸æè¿è¡ç³»ç»è°ç¨ã
**æ éï¼æ 鿝å¨å¼èµ·æ éçæä»¤è¢«æ§è¡ï¼ä½è¿æ²¡ææ§è¡ç»ææ¶ï¼CPUæ£æµå°çä¸ç±»çæå¤äºä»¶ã**åºéæ¶äº¤ç±æ éå¤çç¨åºå¤çï¼å¦æè½å¤çä¿®æ£è¿ä¸ªé误ï¼å°±å°æ§å¶è¿åå°å¼èµ·æ éçæä»¤å³CPUéæ°æ§è¿æ¡æä»¤ã妿ä¸è½å¤çå°±æ¥éã常è§çæ é为缺页ï¼å½CPUå¼ç¨çèæå°å对åºçç©ç页ä¸å卿¶å°±ä¼åçæ éã缺页å¼å¸¸æ¯è½å¤ä¿®æ£çï¼æçä¸é¨ç缺页å¤çç¨åºï¼å®ä¼å°ç¼ºå¤±çç©ç页ä»ç£çä¸éæ°è°è¿ä¸»åãèå忬¡æ§è¡å¼èµ·æ éçæä»¤æ¶ä¾¿è½å¤é¡ºå©æ§è¡äºã
**ç»æ¢ï¼æ§è¡æä»¤çè¿ç¨ä¸åçäºè´å½é误ï¼ä¸å¯ä¿®å¤ï¼ç¨åºæ æ³ç»§ç»è¿è¡ï¼åªè½ç»æ¢ï¼é叏伿¯ä¸äºç¡¬ä»¶çé误ã**ç»æ¢å¤çç¨åºä¸ä¼å°æ§å¶è¿åç»åç¨åºï¼èæ¯ç´æ¥ç»æ¢åç¨åº
# è®²è®²ä¸æçæµç¨
䏿æ¯è®¡ç®æºç³»ç»ä¸ä¸ç§æºå¶ï¼ç¨äºå¨å¤ç卿§è¡æä»¤æ¶æåå½åä»»å¡ï¼å¹¶è½¬èæ§è¡å ¶ä»ä»»å¡æå¤çç¹å®äºä»¶ã以䏿¯ä¸æçåºæ¬æµç¨ï¼
åç䏿ï¼å½å¤é¨è®¾å¤æè 软件ç¨åºéè¦å¤çå¨ç注ææè ååºæ¶ï¼ä¼ååºä¸æä¿¡å·ãå¤çå¨å¨æ¥æ¶å°ä¸æä¿¡å·åï¼ä¼åæ¢å½åæ§è¡çæä»¤ï¼ä¿åå½åæ§è¡ç°åºï¼å¹¶è·³è½¬å°ä¸æå¤çç¨åºæ§è¡ã
䏿ååºï¼å¤ç卿¥æ¶å°ä¸æä¿¡å·åï¼ä¼æ ¹æ®ä¸æåé表æ¾å°å¯¹åºç䏿å¤çç¨åºçå ¥å£å°åã å¤çå¨ä¼ä¿åå½åæ§è¡ç°åºï¼å¦ç¨åºè®¡æ°å¨ãå¯åå¨ç¶æçï¼ï¼ä»¥ä¾¿å¨ä¸æå¤ç宿åè½å¤æ¢å¤æ§è¡ã
䏿å¤çï¼å¤çå¨è·³è½¬å°ä¸æå¤çç¨åºçå ¥å£å°åå¼å§æ§è¡ä¸æå¤çç¨åºã䏿å¤çç¨åºä¼æ ¹æ®ä¸æç±»åè¿è¡ç¸åºçå¤çï¼å¯è½æ¶åå°ä¿åç°åºãå¤ç䏿äºä»¶ãæ§è¡ç¹å®ä»»å¡çã
# 䏿çç±»åæåªäºï¼
䏿æäºä»¶æ¥æºåç±»ï¼å¯ä»¥å为å¤é¨ä¸æåå é¨ä¸æã䏿äºä»¶æ¥èªäºCPUå¤é¨ç被称为å¤é¨ä¸æï¼æ¥èªäºCPUå é¨çå为å é¨ä¸æã
è¿ä¸æ¥ç»åï¼å¤é¨ä¸æè¿å¯å为å¯å±è½ä¸æï¼maskable interruptï¼åä¸å¯å±è½ä¸æï¼non-maskable interruptï¼ä¸¤ç§ï¼èå é¨ä¸ææäºä»¶æ¯å¦æ£å¸¸æ¥ååå¯åä¸ºè½¯ä¸æåå¼å¸¸ä¸¤ç§ã
- å¤é¨ä¸æç䏿äºä»¶æ¥æºäºCPUå¤é¨ï¼å¿ ç¶æ¯æä¸ªç¡¬ä»¶äº§ççï¼æä»¥å¤é¨ä¸æåè¢«ç§°ä¸ºç¡¬ä»¶ä¸æï¼hardware interruptï¼ãè®¡ç®æºçå¤é¨è®¾å¤ï¼å¦ç½å¡ã声å¡ãæ¾å¡çé½è½äº§ç䏿ãå¤é¨è®¾å¤çä¸æä¿¡å·æ¯éè¿ä¸¤æ ¹ä¿¡å·çº¿éç¥CPUçï¼ä¸æ ¹æ¯INTRï¼å¦ä¸æ ¹æ¯NMIãCPUä»INTRæ¶å°çä¸æä¿¡å·é½æ¯ä¸å½±åç³»ç»è¿è¡çï¼CPUå¯ä»¥éæ©å±è½ï¼éè¿è®¾ç½®ä¸æå±è½å¯åå¨ä¸çIFä½ï¼ï¼èä»NMI䏿¶å°çä¸æä¿¡å·åæ¯å½±åç³»ç»è¿è¡ç严éé误ï¼ä¸å¯å±è½ï¼å 为å±è½çæä¹ä¸å¤§ï¼ç³»ç»å·²ç»æ æ³è¿è¡ã
- å é¨ä¸ææ¥èªäºå¤çå¨å é¨ï¼å ¶ä¸è½¯ä¸ææ¯ç±è½¯ä»¶ä¸»å¨åèµ·ç䏿ï¼å¸¸è¢«ç¨äºç³»ç»è°ç¨ï¼system callï¼ï¼èå¼å¸¸åæ¯æä»¤æ§è¡æé´CPUå é¨äº§ççé误å¼èµ·çãå¼å¸¸ä¹åä¸å¯å±è½ä¸æä¸æ ·ä¸åeflagså¯åå¨çIFä½å½±åï¼åºå«å¨äºä¸å¯å±è½ä¸æåççäºä»¶ä¼å¯¼è´å¤ç卿 æ³è¿è¡ï¼å¦æçµãçµæºæ éçï¼ï¼èå¼å¸¸åæ¯å½±åç³»ç»æ£å¸¸è¿è¡ç䏿ï¼å¦é¤0ãè¶ç访é®çï¼ã
# 䏿çä½ç¨æ¯ä»ä¹ï¼
ä¸æä½¿å¾è®¡ç®æºç³»ç»å ·å¤åºå¯¹å¯¹å¤ççªåäºä»¶çè½åï¼æé«äºCPUç工使çï¼å¦ææ²¡æä¸æç³»ç»ï¼CPUå°±åªè½æç §åæ¥çç¨åºç¼åçå å顺åºï¼å¯¹å个å¤è®¾è¿è¡æ¥è¯¢åå¤çï¼å³è½®è¯¢å·¥ä½æ¹å¼ï¼è½®è¯¢æ¹æ³è²ä¼¼å ¬å¹³ï¼ä½å®é 工使çå´å¾ä½ï¼å´ä¸è½åæ¶ååºç´§æ¥äºä»¶ã
# ç½ç» i/o
# ä½ äºè§£è¿åªäºio模åï¼
- é»å¡I/O模åï¼åºç¨ç¨åºåèµ·I/Oæä½åä¼è¢«é»å¡ï¼ç´å°æä½å®ææè¿åç»æãéç¨äºå¯¹å®æ¶æ§è¦æ±ä¸é«çåºæ¯ã
- éé»å¡I/O模åï¼åºç¨ç¨åºåèµ·I/Oæä½åç«å³è¿åï¼ä¸ä¼è¢«é»å¡ï¼ä½éè¦ä¸æè½®è¯¢æè 使ç¨select/poll/epollçç³»ç»è°ç¨æ¥æ£æ¥I/Oæä½æ¯å¦å®æãéåäºéè¦è¿è¡å¤è·¯å¤ç¨çåºæ¯ï¼ä¾å¦éè¦åæ¶å¤çå¤ä¸ªsocketè¿æ¥çæå¡å¨ç¨åºã
- I/Oå¤ç¨æ¨¡åï¼éè¿selectãpollãepollçç³»ç»è°ç¨ï¼åºç¨ç¨åºå¯ä»¥åæ¶çå¾ å¤ä¸ªI/Oæä½ï¼å½å ¶ä¸ä»»ä½ä¸ä¸ªI/Oæä½åå¤å°±ç»ªæ¶ï¼åºç¨ç¨åºä¼è¢«éç¥ãéåäºéè¦åæ¶å¤çå¤ä¸ªI/Oæä½çåºæ¯ï¼æ¯å¦é«å¹¶åçæå¡ç«¯ç¨åºã
- ä¿¡å·é©±å¨I/O模åï¼åºç¨ç¨åºåèµ·I/Oæä½åï¼å¯ä»¥ç»§ç»åå ¶ä»äºæ ï¼å½I/Oæä½å®ææ¶ï¼æä½ç³»ç»ä¼ååºç¨ç¨åºåéä¿¡å·æ¥éç¥å ¶å®æãéåäºéè¦å¼æ¥I/Oéç¥çåºæ¯ï¼å¯ä»¥æé«ç³»ç»çå¹¶åè½åã
- 弿¥I/O模åï¼åºç¨ç¨åºåèµ·I/Oæä½åå¯ä»¥ç«å³åå ¶ä»äºæ ï¼å½I/Oæä½å®ææ¶ï¼åºç¨ç¨åºä¼å¾å°éç¥ã弿¥I/O模åç±æä½ç³»ç»å æ ¸å®æI/Oæä½ï¼åºç¨ç¨åºåªéçå¾ éç¥å³å¯ãéåäºéè¦å¤§éå¹¶åè¿æ¥å髿§è½çåºæ¯ï¼è½å¤åå°ç³»ç»è°ç¨æ¬¡æ°ï¼æé«ç³»ç»æçã
# æå¡å¨å¤çå¹¶åè¯·æ±æåªå ç§æ¹å¼ï¼
- å线ç¨webæå¡å¨æ¹å¼ï¼webæå¡å¨ä¸æ¬¡å¤çä¸ä¸ªè¯·æ±ï¼ç»æå读åå¹¶å¤çä¸ä¸ä¸ªè¯·æ±ï¼æ§è½æ¯è¾ä½ï¼ä¸æ¬¡åªè½å¤çä¸ä¸ªè¯·æ±ã
- å¤è¿ç¨/å¤çº¿ç¨webæå¡å¨ï¼webæå¡å¨çæå¤ä¸ªè¿ç¨æçº¿ç¨å¹¶è¡å¤çå¤ä¸ªç¨æ·è¯·æ±ï¼è¿ç¨æçº¿ç¨å¯ä»¥æéæäºå çæãæçwebæå¡å¨åºç¨ç¨åºä¸ºæ¯ä¸ªç¨æ·è¯·æ±çæä¸ä¸ªåç¬çè¿ç¨æçº¿ç¨æ¥è¿è¡ååºï¼ä¸è¿ï¼ä¸æ¦å¹¶åè¯·æ±æ°éè¾¾å°æåä¸ä¸æ¶ï¼å¤ä¸ªåæ¶è¿è¡çè¿ç¨æçº¿ç¨å°ä¼æ¶è大éçç³»ç»èµæºãï¼å³æ¯ä¸ªè¿ç¨åªè½ååºä¸ä¸ªè¯·æ±ï¼å¹¶ä¸ä¸ä¸ªè¿ç¨å¯¹åºä¸ä¸ªçº¿ç¨ï¼
- I/Oå¤è·¯å¤ç¨webæå¡å¨ï¼webæå¡å¨å¯ä»¥I/Oå¤è·¯å¤ç¨ï¼è¾¾å°åªç¨ä¸ä¸ªçº¿ç¨å°±è½çå¬åå¤çå¤ä¸ªå®¢æ·ç«¯ç i/o äºä»¶ã
- å¤è·¯å¤ç¨å¤çº¿ç¨webæå¡å¨ï¼å°å¤è¿ç¨åå¤è·¯å¤ç¨çåè½ç»åèµ·æ¥å½¢æçwebæå¡å¨æ¶æï¼å ¶é¿å äºè®©ä¸ä¸ªè¿ç¨æå¡äºè¿å¤çç¨æ·è¯·æ±ï¼å¹¶è½å åå©ç¨å¤CPUä¸»æºææä¾ç计ç®è½åãï¼è¿ç§æ¶æå¯ä»¥ç解为æå¤ä¸ªè¿ç¨ï¼å¹¶ä¸ä¸ä¸ªè¿ç¨åçæå¤ä¸ªçº¿ç¨ï¼æ¯ä¸ªçº¿ç¨å¤çä¸ä¸ªè¯·æ±ï¼
# 讲ä¸ä¸ioå¤è·¯å¤ç¨
IOå¤è·¯å¤ç¨æ¯ä¸ç§IOå¾å¤çæ¹å¼ï¼æçæ¯å¤ç¨ä¸ä¸ªçº¿ç¨ï¼å¤çå¤ä¸ªsocketä¸çäºä»¶ãè½å¤èµæºå¤ç¨ï¼é²æ¢å建è¿å¤çº¿ç¨å¯¼è´çä¸ä¸æåæ¢çå¼éã

# selectãpollãepoll çåºå«æ¯ä»ä¹ï¼
æä»¬çæç select/poll/epoll å æ ¸æä¾ç»ç¨æ·æçå¤è·¯å¤ç¨ç³»ç»è°ç¨ï¼è¿ç¨å¯ä»¥éè¿ä¸ä¸ªç³»ç»è°ç¨å½æ°ä»å æ ¸ä¸è·åå¤ä¸ªäºä»¶ã
select/poll/epoll æ¯å¦ä½è·åç½ç»äºä»¶çå¢ï¼å¨è·åäºä»¶æ¶ï¼å æææè¿æ¥ï¼æä»¶æè¿°ç¬¦ï¼ä¼ ç»å æ ¸ï¼åç±å æ ¸è¿å产çäºäºä»¶çè¿æ¥ï¼ç¶åå¨ç¨æ·æä¸åå¤çè¿äºè¿æ¥å¯¹åºç请æ±å³å¯ã
select/poll/epoll è¿æ¯ä¸ä¸ªå¤è·¯å¤ç¨æ¥å£ï¼é½è½å®ç° C10K åï¼æ¥ä¸æ¥ï¼æä»¬åå«è¯´è¯´å®ä»¬ã
select/poll
select å®ç°å¤è·¯å¤ç¨çæ¹å¼æ¯ï¼å°å·²è¿æ¥ç Socket 齿¾å°ä¸ä¸ªæä»¶æè¿°ç¬¦éåï¼ç¶åè°ç¨ select 彿°å°æä»¶æè¿°ç¬¦éåæ·è´å°å æ ¸éï¼è®©å æ ¸æ¥æ£æ¥æ¯å¦æç½ç»äºä»¶äº§çï¼æ£æ¥çæ¹å¼å¾ç²æ´ï¼å°±æ¯éè¿éåæä»¶æè¿°ç¬¦éåçæ¹å¼ï¼å½æ£æ¥å°æäºä»¶äº§çåï¼å°æ¤ Socket æ 记为å¯è¯»æå¯åï¼ æ¥çåææ´ä¸ªæä»¶æè¿°ç¬¦éåæ·è´åç¨æ·æéï¼ç¶åç¨æ·æè¿éè¦åéè¿éåçæ¹æ³æ¾å°å¯è¯»æå¯åç Socketï¼ç¶ååå¯¹å ¶å¤çã
æä»¥ï¼å¯¹äº select è¿ç§æ¹å¼ï¼éè¦è¿è¡ 2 次ãéåãæä»¶æè¿°ç¬¦éåï¼ä¸æ¬¡æ¯å¨å æ ¸æéï¼ä¸ä¸ªæ¬¡æ¯å¨ç¨æ·æé ï¼èä¸è¿ä¼åç 2 æ¬¡ãæ·è´ãæä»¶æè¿°ç¬¦éåï¼å ä»ç¨æ·ç©ºé´ä¼ å ¥å æ ¸ç©ºé´ï¼ç±å æ ¸ä¿®æ¹åï¼åä¼ åºå°ç¨æ·ç©ºé´ä¸ã
select 使ç¨åºå®é¿åº¦ç BitsMapï¼è¡¨ç¤ºæä»¶æè¿°ç¬¦éåï¼èä¸ææ¯æçæä»¶æè¿°ç¬¦çä¸ªæ°æ¯æéå¶çï¼å¨ Linux ç³»ç»ä¸ï¼ç±å æ ¸ä¸ç FD_SETSIZE éå¶ï¼ é»è®¤æå¤§å¼ä¸º 1024ï¼åªè½çå¬ 0~1023 çæä»¶æè¿°ç¬¦ã
poll ä¸åç¨ BitsMap æ¥åå¨æå ³æ³¨çæä»¶æè¿°ç¬¦ï¼åè代ä¹ç¨å¨ææ°ç»ï¼ä»¥é¾è¡¨å½¢å¼æ¥ç»ç»ï¼çªç ´äº select çæä»¶æè¿°ç¬¦ä¸ªæ°éå¶ï¼å½ç¶è¿ä¼åå°ç³»ç»æä»¶æè¿°ç¬¦éå¶ã
使¯ poll å select 并没æå¤ªå¤§çæ¬è´¨åºå«ï¼é½æ¯ä½¿ç¨ã线æ§ç»æãåå¨è¿ç¨å ³æ³¨ç Socket éåï¼å æ¤é½éè¦éåæä»¶æè¿°ç¬¦é忥æ¾å°å¯è¯»æå¯åç Socketï¼æ¶é´å¤æåº¦ä¸º O(n)ï¼èä¸ä¹éè¦å¨ç¨æ·æä¸å æ ¸æä¹é´æ·è´æä»¶æè¿°ç¬¦éåï¼è¿ç§æ¹å¼éç并忰䏿¥ï¼æ§è½çæèä¼åææ°çº§å¢é¿ã
epoll
å å¤ä¹ ä¸ epoll çç¨æ³ãå¦ä¸ç代ç ä¸ï¼å ç¨epoll_create å建ä¸ä¸ª epol l对象 epfdï¼åéè¿ epoll_ctl å°éè¦çè§ç socket æ·»å å°epfdä¸ï¼æåè°ç¨ epoll_wait çå¾ æ°æ®ã
int s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, ...);
listen(s, ...)
int epfd = epoll_create(...);
epoll_ctl(epfd, ...); //å°ææéè¦çå¬çsocketæ·»å å°epfdä¸
while(1) {
int n = epoll_wait(...);
for(æ¥æ¶å°æ°æ®çsocket){
//å¤ç
}
}
epoll éè¿ä¸¤ä¸ªæ¹é¢ï¼å¾å¥½è§£å³äº select/poll çé®é¢ã
第ä¸ç¹ï¼epoll å¨å æ ¸é使ç¨çº¢é»æ æ¥è·è¸ªè¿ç¨ææå¾ æ£æµçæä»¶æè¿°åï¼æéè¦çæ§ç socket éè¿ epoll_ctl() 彿°å å ¥å æ ¸ä¸ççº¢é»æ éï¼çº¢é»æ æ¯ä¸ªé«æçæ°æ®ç»æï¼å¢å æ¹ä¸è¬æ¶é´å¤æåº¦æ¯ O(logn)ãè select/poll å æ ¸é没æç±»ä¼¼ epoll çº¢é»æ è¿ç§ä¿åææå¾ æ£æµç socket çæ°æ®ç»æï¼æä»¥ select/poll æ¯æ¬¡æä½æ¶é½ä¼ å ¥æ´ä¸ª socket éåç»å æ ¸ï¼è epoll å 为å¨å æ ¸ç»´æ¤äºçº¢é»æ ï¼å¯ä»¥ä¿åææå¾ æ£æµç socket ï¼æä»¥åªéè¦ä¼ å ¥ä¸ä¸ªå¾ æ£æµç socketï¼åå°äºå æ ¸åç¨æ·ç©ºé´å¤§éçæ°æ®æ·è´åå ååé ã
第äºç¹ï¼ epoll 使ç¨äºä»¶é©±å¨çæºå¶ï¼å æ ¸éç»´æ¤äºä¸ä¸ªé¾è¡¨æ¥è®°å½å°±ç»ªäºä»¶ï¼å½æä¸ª socket æäºä»¶åçæ¶ï¼éè¿åè°å½æ°å æ ¸ä¼å°å ¶å å ¥å°è¿ä¸ªå°±ç»ªäºä»¶å表ä¸ï¼å½ç¨æ·è°ç¨ epoll_wait() 彿°æ¶ï¼åªä¼è¿åæäºä»¶åççæä»¶æè¿°ç¬¦ç个æ°ï¼ä¸éè¦å select/poll 飿 ·è½®è¯¢æ«ææ´ä¸ª socket éåï¼å¤§å¤§æé«äºæ£æµçæçã
ä»ä¸å¾ä½ å¯ä»¥çå° epoll ç¸å ³çæ¥å£ä½ç¨ï¼

epoll çæ¹å¼å³ä½¿çå¬ç Socket æ°éè¶å¤çæ¶åï¼æçä¸ä¼å¤§å¹ 度éä½ï¼è½å¤åæ¶çå¬ç Socket çæ°ç®ä¹é常çå¤äºï¼ä¸é就为系ç»å®ä¹çè¿ç¨æå¼çæå¤§æä»¶æè¿°ç¬¦ä¸ªæ°ãå èï¼epoll è¢«ç§°ä¸ºè§£å³ C10K é®é¢çå©å¨ã
# epoll ç è¾¹ç¼è§¦ååæ°´å¹³è§¦åæä»ä¹åºå«ï¼
epoll æ¯æä¸¤ç§äºä»¶è§¦å模å¼ï¼å嫿¯è¾¹ç¼è§¦åï¼edge-triggeredï¼ETï¼å水平触åï¼level-triggeredï¼LTï¼ã
è¿ä¸¤ä¸ªæ¯è¯è¿æºæ½è±¡çï¼å ¶å®å®ä»¬çåºå«è¿æ¯å¾å¥½çè§£çã
- 使ç¨è¾¹ç¼è§¦åæ¨¡å¼æ¶ï¼å½è¢«çæ§ç Socket æè¿°ç¬¦ä¸æå¯è¯»äºä»¶åçæ¶ï¼æå¡å¨ç«¯åªä¼ä» epoll_wait ä¸èé䏿¬¡ï¼å³ä½¿è¿ç¨æ²¡æè°ç¨ read 彿°ä»å æ ¸è¯»åæ°æ®ï¼ä¹ä¾ç¶åªèé䏿¬¡ï¼å æ¤æä»¬ç¨åºè¦ä¿è¯ä¸æ¬¡æ§å°å æ ¸ç¼å²åºçæ°æ®è¯»åå®ï¼
- ä½¿ç¨æ°´å¹³è§¦åæ¨¡å¼æ¶ï¼å½è¢«çæ§ç Socket 䏿å¯è¯»äºä»¶åçæ¶ï¼æå¡å¨ç«¯ä¸æå°ä» epoll_wait ä¸èéï¼ç´å°å æ ¸ç¼å²åºæ°æ®è¢« read 彿°è¯»å®æç»æï¼ç®çæ¯åè¯æä»¬ææ°æ®éè¦è¯»åï¼
举个ä¾åï¼ä½ çå¿«é被æ¾å°äºä¸ä¸ªå¿«éç®±éï¼å¦æå¿«éç®±åªä¼éè¿çä¿¡éç¥ä½ 䏿¬¡ï¼å³ä½¿ä½ ä¸ç´æ²¡æå»åï¼å®ä¹ä¸ä¼ååéç¬¬äºæ¡çä¿¡æéä½ ï¼è¿ä¸ªæ¹å¼å°±æ¯è¾¹ç¼è§¦åï¼å¦æå¿«éç®±åç°ä½ çå¿«éæ²¡æè¢«ååºï¼å®å°±ä¼ä¸åå°åçä¿¡éç¥ä½ ï¼ç´å°ä½ ååºäºå¿«éï¼å®ææ¶åï¼è¿ä¸ªå°±æ¯æ°´å¹³è§¦åçæ¹å¼ã
è¿å°±æ¯ä¸¤è çåºå«ï¼æ°´å¹³è§¦åçæææ¯åªè¦æ»¡è¶³äºä»¶çæ¡ä»¶ï¼æ¯å¦å æ ¸ä¸ææ°æ®éè¦è¯»ï¼å°±ä¸ç´ä¸æå°æè¿ä¸ªäºä»¶ä¼ éç»ç¨æ·ï¼èè¾¹ç¼è§¦åçæææ¯åªæç¬¬ä¸æ¬¡æ»¡è¶³æ¡ä»¶çæ¶åæè§¦åï¼ä¹åå°±ä¸ä¼åä¼ éåæ ·çäºä»¶äºã
å¦æä½¿ç¨æ°´å¹³è§¦å模å¼ï¼å½å æ ¸éç¥æä»¶æè¿°ç¬¦å¯è¯»åæ¶ï¼æ¥ä¸æ¥è¿å¯ä»¥ç»§ç»å»æ£æµå®çç¶æï¼ç宿¯å¦ä¾ç¶å¯è¯»æå¯åãæä»¥å¨æ¶å°éç¥åï¼æ²¡å¿ è¦ä¸æ¬¡æ§è¡å°½å¯è½å¤ç读åæä½ã
å¦æä½¿ç¨è¾¹ç¼è§¦å模å¼ï¼I/O äºä»¶åçæ¶åªä¼éç¥ä¸æ¬¡ï¼è䏿们ä¸ç¥éå°åºè½è¯»åå¤å°æ°æ®ï¼æä»¥å¨æ¶å°éç¥ååºå°½å¯è½å°è¯»åæ°æ®ï¼ä»¥å é失读åçæºä¼ãå æ¤ï¼æä»¬ä¼å¾ªç¯ä»æä»¶æè¿°ç¬¦è¯»åæ°æ®ï¼é£ä¹å¦ææä»¶æè¿°ç¬¦æ¯é»å¡çï¼æ²¡ææ°æ®å¯è¯»åæ¶ï¼è¿ç¨ä¼é»å¡å¨è¯»å彿°é£éï¼ç¨åºå°±æ²¡åæ³ç»§ç»å¾ä¸æ§è¡ãæä»¥ï¼è¾¹ç¼è§¦å模å¼ä¸è¬åéé»å¡ I/O æé 使ç¨ï¼ç¨åºä¼ä¸ç´æ§è¡ I/O æä½ï¼ç´å°ç³»ç»è°ç¨ï¼å¦ read å writeï¼è¿åé误ï¼é误类å为 EAGAIN æ EWOULDBLOCKã
ä¸è¬æ¥è¯´ï¼è¾¹ç¼è§¦åçæçæ¯æ°´å¹³è§¦åçæçè¦é«ï¼å 为边ç¼è§¦åå¯ä»¥åå° epoll_wait çç³»ç»è°ç¨æ¬¡æ°ï¼ç³»ç»è°ç¨ä¹æ¯æä¸å®çå¼éççï¼æ¯ç«ä¹åå¨ä¸ä¸æç忢ã
# redisï¼nginxï¼netty æ¯ä¾èµä»ä¹åçè¿ä¹é«æ§è½ï¼
ä¸»è¦æ¯ä¾èµReactor 模å¼å®ç°äºé«æ§è½ç½ç»æ¨¡å¼ï¼è¿ä¸ªæ¯å¨i/oå¤è·¯å¤ç¨æ¥å£åºç¡ä¸å®ç°çäºç½ç»æ¨¡åãReactor ç¿»è¯è¿æ¥çæææ¯ãååºå ãï¼è¿éçååºæçæ¯ã对äºä»¶ååºãï¼ä¹å°±æ¯æ¥äºä¸ä¸ªäºä»¶ï¼Reactor å°±æç¸å¯¹åºçååº/ååºã
Reactor 模å¼ä¸»è¦ç± Reactor åå¤çèµæºæ± è¿ä¸¤ä¸ªæ ¸å¿é¨åç»æï¼å®ä¿©è´è´£çäºæ å¦ä¸ï¼
- Reactor è´è´£çå¬åååäºä»¶ï¼äºä»¶ç±»åå å«è¿æ¥äºä»¶ã读åäºä»¶ï¼
- å¤çèµæºæ± è´è´£å¤çäºä»¶ï¼å¦ read -> ä¸å¡é»è¾ -> sendï¼
Reactor æ¨¡å¼æ¯çµæ´»å¤åçï¼å¯ä»¥åºå¯¹ä¸åçä¸å¡åºæ¯ï¼çµæ´»å¨äºï¼
- Reactor çæ°éå¯ä»¥åªæä¸ä¸ªï¼ä¹å¯ä»¥æå¤ä¸ªï¼
- å¤çèµæºæ± å¯ä»¥æ¯å个è¿ç¨ / 线ç¨ï¼ä¹å¯ä»¥æ¯å¤ä¸ªè¿ç¨ /线ç¨ï¼
Redis
Redis 6.0 ä¹å使ç¨ç Reactor 模åå°±æ¯å Reactor åè¿ç¨æ¨¡å¼ãå Reactor åè¿ç¨çæ¹æ¡å ä¸ºå ¨é¨å·¥ä½é½å¨åä¸ä¸ªè¿ç¨å å®æï¼æä»¥å®ç°èµ·æ¥æ¯è¾ç®åï¼ä¸éè¦èèè¿ç¨é´éä¿¡ï¼ä¹ä¸ç¨æ å¿å¤è¿ç¨ç«äºã

使¯ï¼è¿ç§æ¹æ¡åå¨ 2 个缺ç¹ï¼
- 第ä¸ä¸ªç¼ºç¹ï¼å ä¸ºåªæä¸ä¸ªè¿ç¨ï¼æ æ³å åå©ç¨ 夿 ¸ CPU çæ§è½ï¼
- 第äºä¸ªç¼ºç¹ï¼Handler 对象å¨ä¸å¡å¤çæ¶ï¼æ´ä¸ªè¿ç¨æ¯æ æ³å¤çå ¶ä»è¿æ¥çäºä»¶çï¼å¦æä¸å¡å¤çèæ¶æ¯è¾é¿ï¼é£ä¹å°±é æååºçå»¶è¿ï¼
æä»¥ï¼å Reactor åè¿ç¨çæ¹æ¡ä¸éç¨è®¡ç®æºå¯éåçåºæ¯ï¼åªéç¨äºä¸å¡å¤çé常快éçåºæ¯ã
Redis æ¯ç± C è¯è¨å®ç°çï¼å¨ Redis 6.0 çæ¬ä¹åéç¨çæ£æ¯ãå Reactor åè¿ç¨ãçæ¹æ¡ï¼å 为 Redis ä¸å¡å¤çä¸»è¦æ¯å¨å åä¸å®æï¼æä½çé度æ¯å¾å¿«çï¼æ§è½ç¶é¢ä¸å¨ CPU ä¸ï¼æä»¥ Redis 对äºå½ä»¤çå¤çæ¯åè¿ç¨çæ¹æ¡ã
Netty
Netty æ¯éç¨äºå¤ Reactor å¤çº¿ç¨æ¹æ¡ï¼å¦ä¸å¾ï¼

å¤ Reactor å¤çº¿ç¨çæ¹æ¡ä¼å¿ï¼
- 主线ç¨åå线ç¨åå·¥æç¡®ï¼ä¸»çº¿ç¨åªè´è´£æ¥æ¶æ°è¿æ¥ï¼å线ç¨è´è´£å®æåç»çä¸å¡å¤çã
- 主线ç¨åå线ç¨ç交äºå¾ç®åï¼ä¸»çº¿ç¨åªéè¦ææ°è¿æ¥ä¼ ç»å线ç¨ï¼åçº¿ç¨æ é¡»è¿åæ°æ®ï¼ç´æ¥å°±å¯ä»¥å¨å线ç¨å°å¤çç»æåéç»å®¢æ·ç«¯ã
nginx
nginx æ¯å¤ Reactor å¤è¿ç¨æ¹æ¡ï¼ä¸è¿æ¹æ¡ä¸æ åçå¤ Reactor å¤è¿ç¨æäºå·®å¼ã

å ·ä½å·®å¼è¡¨ç°å¨ä¸»è¿ç¨ä¸ä» ä» ç¨æ¥åå§å socketï¼å¹¶æ²¡æå建 mainReactor æ¥ accept è¿æ¥ï¼èæ¯ç±åè¿ç¨ç Reactor æ¥ accept è¿æ¥ï¼éè¿éæ¥æ§å¶ä¸æ¬¡åªæä¸ä¸ªåè¿ç¨è¿è¡ acceptï¼é²æ¢åºç°æç¾¤ç°è±¡ï¼ï¼åè¿ç¨ accept æ°è¿æ¥åå°±æ¾å°èªå·±ç Reactor è¿è¡å¤çï¼ä¸ä¼ååé ç»å ¶ä»åè¿ç¨ã
# é¶æ·è´æ¯ä»ä¹ï¼
ä¼ ç» IO ç工使¹å¼ï¼ä»ç¡¬çè¯»åæ°æ®ï¼ç¶ååéè¿ç½å¡åå¤åéï¼æä»¬éè¦è¿è¡ 4 ä¸ä¸æåæ¢ï¼å 4 æ¬¡æ°æ®æ·è´ï¼å ¶ä¸ 2 æ¬¡æ°æ®æ·è´åçå¨å åéçç¼å²åºå对åºç硬件设å¤ä¹é´ï¼è¿ä¸ªæ¯ç± DMA 宿ï¼å¦å¤ 2 次ååçå¨å æ ¸æåç¨æ·æä¹é´ï¼è¿ä¸ªæ°æ®æ¬ç§»å·¥ä½æ¯ç± CPU 宿çã

ä¸ºäºæé«æä»¶ä¼ è¾çæ§è½ï¼äºæ¯å°±åºç°äºé¶æ·è´ææ¯ï¼å®éè¿ä¸æ¬¡ç³»ç»è°ç¨ï¼sendfile æ¹æ³ï¼åå¹¶äºç£ç读åä¸ç½ç»åé两个æä½ï¼éä½äºä¸ä¸æåæ¢æ¬¡æ°ãå¦å¤ï¼æ·è´æ°æ®é½æ¯åçå¨å æ ¸ä¸çï¼å¤©ç¶å°±éä½äºæ°æ®æ·è´ç次æ°ã

é¶æ·è´ææ¯çæä»¶ä¼ è¾æ¹å¼ç¸æ¯ä¼ ç»æä»¶ä¼ è¾çæ¹å¼ï¼åå°äº 2 次ä¸ä¸æåæ¢åæ°æ®æ·è´æ¬¡æ°ï¼åªéè¦ 2 次ä¸ä¸æåæ¢åæ°æ®æ·è´æ¬¡æ°ï¼å°±å¯ä»¥å®ææä»¶çä¼ è¾ï¼èä¸ 2 æ¬¡çæ°æ®æ·è´è¿ç¨ï¼é½ä¸éè¦éè¿ CPUï¼2 æ¬¡é½æ¯ç± DMA æ¥æ¬è¿ã
æ»ä½æ¥çï¼é¶æ·è´ææ¯å¯ä»¥ææä»¶ä¼ è¾çæ§è½æé«è³å°ä¸å以ä¸ã
ææ°çå¾è§£æç« é½å¨å ¬ä¼å·é¦åï¼å«å¿è®°å ³æ³¨å¦ï¼ï¼å¦æä½ æ³å å ¥ç¾äººææ¯äº¤æµç¾¤ï¼æ«ç 䏿¹äºç»´ç åå¤ãå 群ãã

