1.å¦ä½è·å¾ä¼å
级å¨Linuxç¯å¢ç¼ç¨ä¸ï¼
2.RTlinuxRTLinux的主要功能
3.linux内核数据结构之kfifo
4.linux操作系统文件类型有哪几种,有什么区别?
5.kfifo(linux kernel 无锁队列)
å¦ä½è·å¾ä¼å 级å¨Linuxç¯å¢ç¼ç¨ä¸ï¼
ä»ä¹æ¯å®æ¶ç³»ç»ï¼POSIX .bä½äºè¿æ ·çå®ä¹ï¼æç³»ç»è½å¤å¨éå®çååºæ¶é´å æä¾æéæ°´å¹³çæå¡ãèä¸ä¸ªç±Donald Gilliesæåºçæ´å 为大家æ¥åçå®ä¹æ¯ï¼ä¸ä¸ªå®æ¶ç³»ç»æ¯æ计ç®çæ£ç¡®æ§ä¸ä» åå³äºç¨åºçé»è¾æ£ç¡®æ§ï¼ä¹åå³äºç»æ产ççæ¶é´ï¼å¦æç³»ç»çæ¶é´çº¦ææ¡ä»¶å¾ä¸å°æ»¡è¶³ï¼å°ä¼åçç³»ç»åºéã
å®æ¶ç³»ç»æ ¹æ®å ¶å¯¹äºå®æ¶æ§è¦æ±çä¸åï¼å¯ä»¥å为软å®æ¶å硬å®æ¶ä¸¤ç§ç±»åã硬å®æ¶ç³»ç»æç³»ç»è¦æç¡®ä¿çæåæ åµä¸çæå¡æ¶é´ï¼å³å¯¹äºäºä»¶çååºæ¶é´çæªæ¢æéæ¯æ 论å¦ä½é½å¿ é¡»å¾å°æ»¡è¶³ãæ¯å¦èªå¤©ä¸çå®å®é£è¹çæ§å¶çå°±æ¯ç°å®ä¸è¿æ ·çç³»ç»ãå ¶ä»çæææå®æ¶ç¹æ§çç³»ç»é½å¯ä»¥ç§°ä¹ä¸ºè½¯å®æ¶ç³»ç»ãå¦ææç¡®å°æ¥è¯´ï¼è½¯å®æ¶ç³»ç»å°±æ¯é£äºä»ç»è®¡çè§åº¦æ¥è¯´ï¼ä¸ä¸ªä»»å¡ï¼å¨ä¸é¢ç论述ä¸ï¼æ们å°å¯¹ä»»å¡åè¿ç¨ä¸ä½åºåï¼è½å¤å¾å°æç¡®ä¿çå¤çæ¶é´ï¼å°è¾¾ç³»ç»çäºä»¶ä¹è½å¤å¨æªæ¢æéå°æ¥ä¹åå¾å°å¤çï¼ä½è¿åæªæ¢æé并ä¸ä¼å¸¦æ¥è´å½çé误ï¼åå®æ¶å¤åªä½ç³»ç»å°±æ¯ä¸ç§è½¯å®æ¶ç³»ç»ã
ä¸ä¸ªè®¡ç®æºç³»ç»ä¸ºäºæä¾å¯¹äºå®æ¶æ§çæ¯æï¼å®çæä½ç³»ç»å¿ 须对äºCPUåå ¶ä»èµæºè¿è¡ææçè°åº¦å管çãå¨å¤ä»»å¡å®æ¶ç³»ç»ä¸ï¼èµæºçè°åº¦å管çæ´å å¤æãæ¬æä¸é¢å°å ä»åç±»çè§åº¦å¯¹åç§å®æ¶ä»»å¡è°åº¦ç®æ³è¿è¡è®¨è®ºï¼ç¶åç 究æ®éç Linuxæä½ç³»ç»çè¿ç¨è°åº¦ä»¥ååç§å®æ¶Linuxç³»ç»ä¸ºäºæ¯æå®æ¶ç¹æ§å¯¹æ®éLinuxç³»ç»æåçæ¹è¿ãæååæäºå°Linuxæä½ç³»ç»åºç¨äºå®æ¶é¢åä¸æ¶æåºç°çä¸äºé®é¢ï¼å¹¶æ»ç»äºåç§å®æ¶Linuxæ¯å¦ä½è§£å³è¿äºé®é¢çã
1. å®æ¶CPUè°åº¦ç®æ³åç±»
åç§å®æ¶æä½ç³»ç»çå®æ¶è°åº¦ç®æ³å¯ä»¥å为å¦ä¸ä¸ç§ç±»å«[Wang][Gopalan]ï¼åºäºä¼å 级çè°åº¦ç®æ³ï¼Priority-driven scheduling-PDï¼ãåºäºCPU使ç¨æ¯ä¾çå ±äº«å¼çè°åº¦ç®æ³ï¼Share-driven scheduling-SDï¼ã以ååºäºæ¶é´çè¿ç¨è°åº¦ç®æ³ï¼Time-driven scheduling-TDï¼ï¼ä¸é¢å¯¹è¿ä¸ç§è°åº¦ç®æ³éä¸è¿è¡ä»ç»ã
1.1. åºäºä¼å 级çè°åº¦ç®æ³
åºäºä¼å 级çè°åº¦ç®æ³ç»æ¯ä¸ªè¿ç¨åé ä¸ä¸ªä¼å 级ï¼å¨æ¯æ¬¡è¿ç¨è°åº¦æ¶ï¼è°åº¦å¨æ»æ¯è°åº¦é£ä¸ªå ·ææé«ä¼å 级çä»»å¡æ¥æ§è¡ãæ ¹æ®ä¸åçä¼å 级åé æ¹æ³ï¼åºäºä¼å 级çè°åº¦ç®æ³å¯ä»¥å为å¦ä¸ä¸¤ç§ç±»å[Krishna][Wang]ï¼
éæä¼å 级è°åº¦ç®æ³ï¼
è¿ç§è°åº¦ç®æ³ç»é£äºç³»ç»ä¸å¾å°è¿è¡çææè¿ç¨é½éæå°åé ä¸ä¸ªä¼å 级ãéæä¼å 级çåé å¯ä»¥æ ¹æ®åºç¨çå±æ§æ¥è¿è¡ï¼æ¯å¦ä»»å¡çå¨æï¼ç¨æ·ä¼å 级ï¼æè å ¶å®çé¢å ç¡®å®ççç¥ãRMï¼Rate-Monotonicï¼è°åº¦ç®æ³æ¯ä¸ç§å ¸åçéæä¼å 级è°åº¦ç®æ³ï¼å®æ ¹æ®ä»»å¡çæ§è¡å¨æçé¿çæ¥å³å®è°åº¦ä¼å 级ï¼é£äºå ·æå°çæ§è¡å¨æçä»»å¡å ·æè¾é«çä¼å 级ã
å¨æä¼å 级è°åº¦ç®æ³ï¼
è¿ç§è°åº¦ç®æ³æ ¹æ®ä»»å¡çèµæºéæ±æ¥å¨æå°åé ä»»å¡çä¼å 级ï¼å ¶ç®çå°±æ¯å¨èµæºåé åè°åº¦æ¶ææ´å¤§ççµæ´»æ§ãéå®æ¶ç³»ç»ä¸å°±æå¾å¤è¿ç§è°åº¦ç®æ³ï¼æ¯å¦çä½ä¸ä¼å çè°åº¦ç®æ³ãå¨å®æ¶è°åº¦ç®æ³ä¸ï¼ EDFç®æ³æ¯ä½¿ç¨æå¤çä¸ç§å¨æä¼å 级è°åº¦ç®æ³ï¼è¯¥ç®æ³ç»å°±ç»ªéåä¸çå个任å¡æ ¹æ®å®ä»¬çæªæ¢æéï¼Deadlineï¼æ¥åé ä¼å 级ï¼å ·ææè¿çæªæ¢æéçä»»å¡å ·ææé«çä¼å 级ã
1.2. åºäºæ¯ä¾å ±äº«è°åº¦ç®æ³
è½ç¶åºäºä¼å 级çè°åº¦ç®æ³ç®åèææï¼ä½è¿ç§è°åº¦ç®æ³æä¾çæ¯ä¸ç§ç¡¬å®æ¶çè°åº¦ï¼å¨å¾å¤æ åµä¸å¹¶ä¸éå使ç¨è¿ç§è°åº¦ç®æ³ï¼æ¯å¦è±¡å®æ¶å¤åªä½ä¼è®®ç³»ç»è¿æ ·ç软å®æ¶åºç¨ã对äºè¿ç§è½¯å®æ¶åºç¨ï¼ä½¿ç¨ä¸ç§æ¯ä¾å ±äº«å¼çèµæºè°åº¦ç®æ³ï¼SDç®æ³ï¼æ´ä¸ºéåã
æ¯ä¾å ±äº«è°åº¦ç®æ³æåºäºCPU使ç¨æ¯ä¾çå ±äº«å¼çè°åº¦ç®æ³ï¼å ¶åºæ¬ææ³å°±æ¯æç §ä¸å®çæéï¼æ¯ä¾ï¼å¯¹ä¸ç»éè¦è°åº¦çä»»å¡è¿è¡è°åº¦ï¼è®©å®ä»¬çæ§è¡æ¶é´ä¸å®ä»¬çæéå®å ¨ææ£æ¯ã
æ们å¯ä»¥éè¿ä¸¤ç§æ¹æ³æ¥å®ç°æ¯ä¾å ±äº«è°åº¦ç®æ³[Nieh]ï¼ç¬¬ä¸ç§æ¹æ³æ¯è°èå个就绪è¿ç¨åºç°å¨è°åº¦éåéé¦çé¢çï¼å¹¶è°åº¦éé¦çè¿ç¨æ§è¡ï¼ç¬¬äºç§åæ³å°±æ¯é次è°åº¦å°±ç»ªéåä¸çå个è¿ç¨æå ¥è¿è¡ï¼ä½æ ¹æ®åé çæéè°èåé 个æ¯ä¸ªè¿ç¨çè¿è¡æ¶é´çã
æ¯ä¾å ±äº«è°åº¦ç®æ³å¯ä»¥å为以ä¸å 个类å«ï¼è½®è½¬æ³ãå ¬å¹³å ±äº«ãå ¬å¹³éåã彩票è°åº¦æ³ï¼Lotteryï¼çã
æ¯ä¾å ±äº«è°åº¦ç®æ³çä¸ä¸ªé®é¢å°±æ¯å®æ²¡æå®ä¹ä»»ä½ä¼å 级çæ¦å¿µï¼ææçä»»å¡é½æ ¹æ®å®ä»¬ç³è¯·çæ¯ä¾å ±äº«CPUèµæºï¼å½ç³»ç»å¤äºè¿è½½ç¶ææ¶ï¼ææçä»»å¡çæ§è¡é½ä¼ææ¯ä¾å°åæ ¢ãæ以为äºä¿è¯ç³»ç»ä¸å®æ¶è¿ç¨è½å¤è·å¾ä¸å®çCPUå¤çæ¶é´ï¼ä¸è¬éç¨ä¸ç§å¨æè°èè¿ç¨æéçæ¹æ³ã
1.3. åºäºæ¶é´çè¿ç¨è°åº¦ç®æ³
对äºé£äºå ·æ稳å®ãå·²ç¥è¾å ¥çç®åç³»ç»ï¼å¯ä»¥ä½¿ç¨æ¶é´é©±å¨ï¼Time-driven:TDï¼çè°åº¦ç®æ³ï¼å®è½å¤ä¸ºæ°æ®å¤çæä¾å¾å¥½çé¢æµæ§ãè¿ç§è°åº¦ç®æ³æ¬è´¨ä¸æ¯ä¸ç§è®¾è®¡æ¶å°±ç¡®å®ä¸æ¥ç离线çéæè°åº¦æ¹æ³ãå¨ç³»ç»ç设计é¶æ®µï¼å¨æ确系ç»ä¸ææçå¤çæ åµä¸ï¼å¯¹äºå个任å¡çå¼å§ãåæ¢ã以åç»ææ¶é´çå°±äºå ååºæç¡®çå®æå设计ãè¿ç§è°åº¦ç®æ³éåäºé£äºå¾å°çåµå ¥å¼ç³»ç»ãèªæ§ç³»ç»ãä¼ æå¨çåºç¨ç¯å¢ã
è¿ç§è°åº¦ç®æ³çä¼ç¹æ¯ä»»å¡çæ§è¡æå¾å¥½çå¯é¢æµæ§ï¼ä½æ大ç缺ç¹æ¯ç¼ºä¹çµæ´»æ§ï¼å¹¶ä¸ä¼åºç°æä»»å¡éè¦è¢«æ§è¡èCPUå´ä¿æ空é²çæ åµã
2. éç¨Linuxç³»ç»ä¸çCPUè°åº¦
éç¨Linuxç³»ç»æ¯æå®æ¶åéå®æ¶ä¸¤ç§è¿ç¨ï¼å®æ¶è¿ç¨ç¸å¯¹äºæ®éè¿ç¨å ·æç»å¯¹çä¼å 级ã对åºå°ï¼å®æ¶è¿ç¨éç¨SCHED_FIFOæè SCHED_RRè°åº¦çç¥ï¼æ®éçè¿ç¨éç¨SCHED_OTHERè°åº¦çç¥ã
å¨è°åº¦ç®æ³çå®ç°ä¸ï¼Linuxä¸çæ¯ä¸ªä»»å¡æå个ä¸è°åº¦ç¸å ³çåæ°ï¼å®ä»¬æ¯rt_priorityãpolicyãpriorityï¼niceï¼ãcounterãè°åº¦ç¨åºæ ¹æ®è¿å个åæ°è¿è¡è¿ç¨è°åº¦ã
å¨SCHED_OTHER è°åº¦çç¥ä¸ï¼è°åº¦å¨æ»æ¯éæ©é£ä¸ªpriority+counterå¼æ大çè¿ç¨æ¥è°åº¦æ§è¡ãä»é»è¾ä¸åæï¼SCHED_OTHERè°åº¦çç¥åå¨çè°åº¦å¨æï¼epochï¼ï¼å¨æ¯ä¸ä¸ªè°åº¦å¨æä¸ï¼ä¸ä¸ªè¿ç¨çpriorityåcounterå¼ç大å°å½±åäºå½åæ¶å»åºè¯¥è°åº¦åªä¸ä¸ªè¿ç¨æ¥æ§è¡ï¼å ¶ä¸ priorityæ¯ä¸ä¸ªåºå®ä¸åçå¼ï¼å¨è¿ç¨å建æ¶å°±å·²ç»ç¡®å®ï¼å®ä»£è¡¨äºè¯¥è¿ç¨çä¼å 级ï¼ä¹ä»£è¡¨è¿è¯¥è¿ç¨å¨æ¯ä¸ä¸ªè°åº¦å¨æä¸è½å¤å¾å°çæ¶é´ççå¤å°ï¼ counteræ¯ä¸ä¸ªå¨æååçå¼ï¼å®åæ äºä¸ä¸ªè¿ç¨å¨å½åçè°åº¦å¨æä¸è¿å©ä¸çæ¶é´çãå¨æ¯ä¸ä¸ªè°åº¦å¨æçå¼å§ï¼priorityçå¼è¢«èµç» counterï¼ç¶åæ¯æ¬¡è¯¥è¿ç¨è¢«è°åº¦æ§è¡æ¶ï¼counterå¼é½åå°ãå½counterå¼ä¸ºé¶æ¶ï¼è¯¥è¿ç¨ç¨å®èªå·±å¨æ¬è°åº¦å¨æä¸çæ¶é´çï¼ä¸ååä¸æ¬è°åº¦å¨æçè¿ç¨è°åº¦ãå½ææè¿ç¨çæ¶é´çé½ç¨å®æ¶ï¼ä¸ä¸ªè°åº¦å¨æç»æï¼ç¶åå¨èå¤å§ãå¦å¤å¯ä»¥çåºLinuxç³»ç»ä¸çè°åº¦å¨æä¸æ¯éæçï¼å®æ¯ä¸ä¸ªå¨æååçéï¼æ¯å¦å¤äºå¯è¿è¡ç¶æçè¿ç¨çå¤å°åå®ä»¬priorityå¼é½å¯ä»¥å½±åä¸ä¸ªepochçé¿çãå¼å¾æ³¨æçä¸ç¹æ¯ï¼å¨2.4以ä¸çå æ ¸ä¸ï¼ priority被niceæå代ï¼ä½äºè ä½ç¨ç±»ä¼¼ã
å¯è§SCHED_OTHERè°åº¦çç¥æ¬è´¨ä¸æ¯ä¸ç§æ¯ä¾å ±äº«çè°åº¦çç¥ï¼å®çè¿ç§è®¾è®¡æ¹æ³è½å¤ä¿è¯è¿ç¨è°åº¦æ¶çå ¬å¹³æ§--ä¸ä¸ªä½ä¼å 级çè¿ç¨å¨æ¯ä¸ä¸ªepochä¸ä¹ä¼å¾å°èªå·±åºå¾çé£äºCPUæ§è¡æ¶é´ï¼å¦å¤å®ä¹æä¾äºä¸åè¿ç¨çä¼å 级åºåï¼å ·æé«priorityå¼çè¿ç¨è½å¤è·å¾æ´å¤çæ§è¡æ¶é´ã
对äºå®æ¶è¿ç¨æ¥è¯´ï¼å®ä»¬ä½¿ç¨çæ¯åºäºå®æ¶ä¼å 级rt_priorityçä¼å 级è°åº¦çç¥ï¼ä½æ ¹æ®ä¸åçè°åº¦çç¥ï¼åä¸å®æ¶ä¼å 级çè¿ç¨ä¹é´çè°åº¦æ¹æ³ææä¸åï¼
SCHED_FIFOï¼ä¸åçè¿ç¨æ ¹æ®éæä¼å 级è¿è¡æéï¼ç¶åå¨åä¸ä¼å 级çéåä¸ï¼è°å åå¤å¥½è¿è¡å°±å è°åº¦è°ï¼å¹¶ä¸æ£å¨è¿è¡çè¿ç¨ä¸ä¼è¢«ç»æ¢ç´å°ä»¥ä¸æ åµåçï¼1.被ææ´é«ä¼å 级çè¿ç¨æ强å CPUï¼2.èªå·±å 为èµæºè¯·æ±èé»å¡ï¼3.èªå·±ä¸»å¨æ¾å¼CPUï¼è°ç¨sched_yieldï¼ï¼
SCHED_RRï¼è¿ç§è°åº¦çç¥è·ä¸é¢çSCHED_FIFOä¸æ¨¡ä¸æ ·ï¼é¤äºå®ç»æ¯ä¸ªè¿ç¨åé ä¸ä¸ªæ¶é´çï¼æ¶é´çå°äºæ£å¨æ§è¡çè¿ç¨å°±æ¾å¼æ§è¡ï¼æ¶é´ççé¿åº¦å¯ä»¥éè¿sched_rr_get_intervalè°ç¨å¾å°ï¼
ç±äºLinuxç³»ç»æ¬èº«æ¯ä¸ä¸ªé¢åæ¡é¢çç³»ç»ï¼æ以å°å®åºç¨äºå®æ¶åºç¨ä¸æ¶åå¨å¦ä¸çä¸äºé®é¢ï¼
Linuxç³»ç»ä¸çè°åº¦åä½ä¸ºmsï¼æ以å®ä¸è½å¤æä¾ç²¾ç¡®çå®æ¶ï¼
å½ä¸ä¸ªè¿ç¨è°ç¨ç³»ç»è°ç¨è¿å ¥å æ ¸æè¿è¡æ¶ï¼å®æ¯ä¸å¯è¢«æ¢å çï¼
Linuxå æ ¸å®ç°ä¸ä½¿ç¨äºå¤§éçå°ä¸ææä½ä¼é æä¸æç丢失ï¼
ç±äºä½¿ç¨èæå åææ¯ï¼å½åç页åºéæ¶ï¼éè¦ä»ç¡¬çä¸è¯»å交æ¢æ°æ®ï¼ä½ç¡¬ç读åç±äºåå¨ä½ç½®çéæºæ§ä¼å¯¼è´éæºç读åæ¶é´ï¼è¿å¨æäºæ åµä¸ä¼å½±åä¸äºå®æ¶ä»»å¡çæªæ¢æéï¼
è½ç¶Linuxè¿ç¨è°åº¦ä¹æ¯æå®æ¶ä¼å 级ï¼ä½ç¼ºä¹ææçå®æ¶ä»»å¡çè°åº¦æºå¶åè°åº¦ç®æ³ï¼å®çç½ç»åç³»ç»çåè®®å¤çåå ¶å®è®¾å¤çä¸æå¤çé½æ²¡æä¸å®å¯¹åºçè¿ç¨çè°åº¦å ³èèµ·æ¥ï¼å¹¶ä¸å®ä»¬èªèº«ä¹æ²¡ææç¡®çè°åº¦æºå¶ï¼
3. åç§å®æ¶Linuxç³»ç»
3.1. RT-LinuxåRTAI
RT -Linuxæ¯æ°å¢¨è¥¿å¥ç§æ大å¦ï¼New Mexico Institute of Technologyï¼çç 究ææ[RTLinuxWeb][Barabanov]ãå®çåºæ¬ææ³æ¯ï¼ä¸ºäºå¨Linuxç³»ç»ä¸æä¾å¯¹äºç¡¬å®æ¶çæ¯æï¼å®å®ç°äºä¸ä¸ªå¾®å æ ¸çå°çå®æ¶æä½ç³»ç»ï¼æ们ä¹ç§°ä¹ä¸ºRT-Linuxçå®æ¶åç³»ç»ï¼ï¼èå°æ®éLinuxç³»ç»ä½ä¸ºä¸ä¸ªè¯¥æä½ç³»ç»ä¸çä¸ä¸ªä½ä¼å 级çä»»å¡æ¥è¿è¡ãå¦å¤æ®éLinuxç³»ç»ä¸çä»»å¡å¯ä»¥éè¿FIFOåå®æ¶ä»»å¡è¿è¡éä¿¡ãRT-Linuxçæ¡æ¶å¦å¾ 1æ示ï¼
å¾ 1 RT-Linuxç»æ
RT -Linuxçå ³é®ææ¯æ¯éè¿è½¯ä»¶æ¥æ¨¡æ硬件çä¸ææ§å¶å¨ãå½Linuxç³»ç»è¦å°éCPUçä¸ææ¶æ¶ï¼RT-Linuxä¸çå®æ¶åç³»ç»ä¼æªåå°è¿ä¸ªè¯·æ±ï¼æå®è®°å½ä¸æ¥ï¼èå®é ä¸å¹¶ä¸çæ£å°é硬件ä¸æï¼è¿æ ·å°±é¿å äºç±äºå°ä¸ææé æçç³»ç»å¨ä¸æ®µæ¶é´æ²¡æååºçæ åµï¼ä»èæé«äºå®æ¶æ§ãå½æ硬件ä¸æå°æ¥æ¶ï¼ RT-Linuxæªå该ä¸æï¼å¹¶å¤ææ¯å¦æå®æ¶åç³»ç»ä¸çä¸æä¾ç¨æ¥å¤çè¿æ¯ä¼ éç»æ®éçLinuxå æ ¸è¿è¡å¤çãå¦å¤ï¼æ®éLinuxç³»ç»ä¸çæå°å®æ¶ç²¾åº¦ç±ç³»ç»ä¸çå®æ¶æ¶éçé¢çå³å®ï¼ä¸è¬Linuxç³»ç»å°è¯¥æ¶é设置为æ¯ç§æ¥ä¸ªæ¶éä¸æï¼æ以Linuxç³»ç»ä¸ä¸è¬çå®æ¶ç²¾åº¦ä¸º msï¼å³æ¶éå¨ææ¯msï¼èRT-Linuxéè¿å°ç³»ç»çå®æ¶æ¶é设置为å次触åç¶æï¼å¯ä»¥æä¾åå 个微ç§çº§çè°åº¦ç²åº¦ã
RT-Linuxå®æ¶åç³»ç»ä¸çä»»å¡è°åº¦å¯ä»¥éç¨RMãEDFçä¼å 级驱å¨çç®æ³ï¼ä¹å¯ä»¥éç¨å ¶ä»è°åº¦ç®æ³ã
RT -Linux对äºé£äºå¨éè´è·ä¸å·¥ä½çä¸æç³»ç»æ¥è¯´ï¼ç¡®å®æ¯ä¸ä¸ªä¸éçéæ©ï¼ä½ä»ä» ä» æä¾äºå¯¹äºCPUèµæºçè°åº¦ï¼å¹¶ä¸å®æ¶ç³»ç»åæ®éLinuxç³»ç»å ³ç³»ä¸æ¯ååå¯åï¼è¿æ ·çè¯ï¼å¼å人åä¸è½å åå©ç¨Linuxç³»ç»ä¸å·²ç»å®ç°çåè½ï¼å¦åè®®æ çãæ以RT-Linuxéåä¸å·¥ä¸æ§å¶çå®æ¶ä»»å¡åè½ç®åï¼å¹¶ä¸æ硬å®æ¶è¦æ±çç¯å¢ä¸ï¼ä½å¦æè¦åºç¨ä¸å¤åªä½å¤çä¸è¿éè¦å大éçå·¥ä½ã
æ大å©çRTAI( Real-Time Application Interface )æºäºRT-Linuxï¼å®å¨è®¾è®¡ææ³ä¸åRT-Linuxå®å ¨ç¸åãå®å½å设计ç®çæ¯ä¸ºäºè§£å³RT-Linuxé¾äºå¨ä¸åLinuxçæ¬ä¹é´é¾äºç§»æ¤çé®é¢ï¼ä¸ºæ¤ï¼RTAIå¨ Linux ä¸å®ä¹äºä¸ä¸ªå®æ¶ç¡¬ä»¶æ½è±¡å±ï¼å®æ¶ä»»å¡éè¿è¿ä¸ªæ½è±¡å±æä¾çæ¥å£åLinuxç³»ç»è¿è¡äº¤äºï¼è¿æ ·å¨ç»Linuxå æ ¸ä¸å¢å å®æ¶æ¯ææ¶å¯ä»¥å°½å¯è½å°å°ä¿®æ¹ Linuxçå æ ¸æºä»£ç ã
3.2. Kurt-Linux
Kurt -Linuxç±Kansas大å¦å¼åï¼å®å¯ä»¥æä¾å¾®ç§çº§çå®æ¶ç²¾åº¦[KurtWeb] [Srinivasan]ãä¸åäºRT-Linuxåç¬å®ç°ä¸ä¸ªå®æ¶å æ ¸çåæ³ï¼Kurt -Linuxæ¯å¨éç¨Linuxç³»ç»çåºç¡ä¸å®ç°çï¼å®ä¹æ¯ç¬¬ä¸ä¸ªå¯ä»¥ä½¿ç¨æ®éLinuxç³»ç»è°ç¨çåºäºLinuxçå®æ¶ç³»ç»ã
Kurt-Linuxå°ç³»ç»å为ä¸ç§ç¶æï¼æ£å¸¸æãå®æ¶æåæ··åæï¼å¨æ£å¸¸ææ¶å®éç¨æ®éçLinuxçè°åº¦çç¥ï¼å¨å®æ¶æåªè¿è¡å®æ¶ä»»å¡ï¼å¨æ··åæå®æ¶åéå®æ¶ä»»å¡é½å¯ä»¥æ§è¡ï¼å®æ¶æå¯ä»¥ç¨äºå¯¹äºå®æ¶æ§è¦æ±æ¯è¾ä¸¥æ ¼çæ åµã
为äºæé«Linuxç³»ç»çå®æ¶ç¹æ§ï¼å¿ é¡»æé«ç³»ç»ææ¯æçæ¶é精度ãä½å¦æä» ä» ç®åå°æé«æ¶éé¢çï¼ä¼å¼èµ·è°åº¦è´è½½çå¢å ï¼ä»è严ééä½ç³»ç»çæ§è½ã为äºè§£å³è¿ä¸ªçç¾ï¼ Kurt-Linuxéç¨UTIMEæ使ç¨çæé«Linuxç³»ç»ä¸çæ¶é精度çæ¹æ³[UTIMEWeb]ï¼å®å°æ¶éè¯ç设置为å次触åç¶æï¼One shot modeï¼ï¼å³æ¯æ¬¡ç»æ¶éè¯ç设置ä¸ä¸ªè¶ æ¶æ¶é´ï¼ç¶åå°è¯¥è¶ æ¶äºä»¶åçæ¶å¨æ¶éä¸æå¤çç¨åºä¸åæ¬¡æ ¹æ®éè¦ç»æ¶éè¯ç设置ä¸ä¸ªè¶ æ¶æ¶é´ãå®çåºæ¬ææ³æ¯ä¸ä¸ªç²¾ç¡®çå®æ¶æå³çæ们éè¦æ¶éä¸æå¨æ们éè¦çä¸ä¸ªæ¯è¾ç²¾ç¡®çæ¶é´åçï¼ä½å¹¶éä¸å®éè¦ç³»ç»æ¶éé¢çè¾¾å°æ¤ç²¾åº¦ãå®å©ç¨CPUçæ¶é计æ°å¨TSC (Time Stamp Counter)æ¥æä¾ç²¾åº¦å¯è¾¾CPU主é¢çæ¶é´ç²¾åº¦ã
对äºå®æ¶ä»»å¡çè°åº¦ï¼Kurt-Linuxéç¨åºäºæ¶é´ï¼TDï¼çéæçå®æ¶CPUè°åº¦ç®æ³ãå®æ¶ä»»å¡å¨è®¾è®¡é¶æ®µå°±éè¦æç¡®å°è¯´æå®ä»¬å®æ¶äºä»¶è¦åççæ¶é´ãè¿ç§è°åº¦ç®æ³å¯¹äºé£äºå¾ªç¯æ§è¡çä»»å¡è½å¤åå¾è¾å¥½çè°åº¦ææã
Kurt -Linuxç¸å¯¹äºRT-Linuxçä¸ä¸ªä¼ç¹å°±æ¯å¯ä»¥ä½¿ç¨Linuxç³»ç»èªèº«çç³»ç»è°ç¨ï¼å®æ¬æ¥è¢«è®¾è®¡ç¨äºæä¾å¯¹ç¡¬å®æ¶çæ¯æï¼ä½ç±äºå®å¨å®ç°ä¸åªæ¯ç®åçå°Linuxè°åº¦å¨ç¨ä¸ä¸ªç®åçæ¶é´é©±å¨çè°åº¦å¨æå代ï¼æ以å®çå®æ¶è¿ç¨çè°åº¦å¾å®¹æåå°å ¶å®éå®æ¶ä»»å¡çå½±åï¼ä»èå¨æçæ åµä¸ä¼åçå®æ¶ä»»å¡çæªæ¢æéä¸è½æ»¡è¶³çæ åµï¼æ以ä¹è¢«ç§°ä½ä¸¥æ ¼å®æ¶ç³»ç»ï¼Firm Real-timeï¼ãç®ååºäºKurt-Linuxçåºç¨æï¼ARTSï¼ATM Reference Traffic Systemï¼ãå¤åªä½ææ¾è½¯ä»¶çãå¦å¤Kurt-Linuxæéç¨çè¿ç§æ¹æ³éè¦é¢ç¹å°å¯¹æ¶éè¯çè¿è¡ç¼ç¨è®¾ç½®ã
3.3. RED-Linux
RED -Linuxæ¯å å·å¤§å¦Irvineåæ ¡å¼åçå®æ¶Linuxç³»ç»[REDWeb][ Wang]ï¼å®å°å¯¹å®æ¶è°åº¦çæ¯æåLinuxå¾å¥½å°å®ç°å¨åä¸ä¸ªæä½ç³»ç»å æ ¸ä¸ãå®åæ¶æ¯æä¸ç§ç±»åçè°åº¦ç®æ³ï¼å³ï¼Time-Drivenã Priority-DirvenãShare-Drivenã
为äºæé«ç³»ç»çè°åº¦ç²åº¦ï¼RED-Linuxä»RT-Linuxé£å¿åé´äºè½¯ä»¶æ¨¡æä¸æ管çå¨çæºå¶ï¼å¹¶ä¸æé«äºæ¶éä¸æé¢çãå½æ硬件ä¸æå°æ¥æ¶ï¼RED-Linuxçä¸æ模æç¨åºä» ä» æ¯ç®åå°å°å°æ¥çä¸ææ¾å°ä¸ä¸ªéåä¸è¿è¡æéï¼å¹¶ä¸æ§è¡çæ£çä¸æå¤çç¨åºã
å¦å¤ä¸ºäºè§£å³Linuxè¿ç¨å¨å æ ¸æä¸è½è¢«æ¢å çé®é¢ï¼ RED-Linuxå¨Linuxå æ ¸çå¾å¤å½æ°ä¸æå ¥äºæ¢å ç¹åè¯ï¼ä½¿å¾è¿ç¨å¨å æ ¸ææ¶ï¼ä¹å¯ä»¥å¨ä¸å®ç¨åº¦ä¸è¢«æ¢å ãéè¿è¿ç§æ¹æ³æé«äºå æ ¸çå®æ¶ç¹æ§ã
RED-Linuxç设计ç®æ å°±æ¯æä¾ä¸ä¸ªå¯ä»¥æ¯æåç§è°åº¦ç®æ³çéç¨çè°åº¦æ¡æ¶ï¼è¯¥ç³»ç»ç»æ¯ä¸ªä»»å¡å¢å äºå¦ä¸å 项å±æ§ï¼å¹¶å°å®ä»¬ä½ä¸ºè¿ç¨è°åº¦çä¾æ®ï¼
Priorityï¼ä½ä¸çä¼å 级ï¼
Start-Timeï¼ä½ä¸çå¼å§æ¶é´ï¼
Finish-Timeï¼ä½ä¸çç»ææ¶é´ï¼
Budgetï¼ä½ä¸å¨è¿è¡æé´æè¦ä½¿ç¨çèµæºçå¤å°ï¼
éè¿è°æ´è¿äºå±æ§çåå¼åè°åº¦ç¨åºæç §ä»ä¹æ ·çä¼å 顺åºæ¥ä½¿ç¨è¿äºå±æ§å¼ï¼å ä¹å¯ä»¥å®ç°ææçè°åº¦ç®æ³ãè¿æ ·çè¯ï¼å¯ä»¥å°ä¸ç§ä¸åçè°åº¦ç®æ³æ ç¼ãç»ä¸å°ç»åå°äºä¸èµ·ã
å¦å¤,å¢IDCç½ä¸æ许å¤äº§åå¢è´,便å®æå£ç¢
RTlinuxRTLinux的主要功能
RTLinux提供了一整套对硬实时进程的支持函数集。以下是对在嵌入式系统中的实现的阐述: a. 中断仿真 在中断控制硬件与LINUX核心之间放置一个软件仿真层。具体做法是在LINUX源码中出现cli、sti和iret的所有地方都用仿真宏:S_CLI、S_STI和S_IRET来替换。硬件中断被仿真器截获。开单平台源码当需要关中断时,就将仿真器中的一个变量置0。若有中断发生,仿真器就检查变量。如果是1(LINUX已开中断),立即调用LINUX的中断处理程序;否则,LINUX中断被禁止。所有挂起中断的处理程序会在LINUX重新开中断时被执行。这种仿真方式可以称之为"软中断"。 b. 实时任务 实时任务是在一个由核心控制的调度程序的调度下执行的用户定义的程序。最初,实时任务设计为ELF格式的目标文件。然而,这种方案的最大缺点是性能差。原因在于,的缓存是虚拟的,每当页表目录的基址寄存器改变时,TLB会失效。控制软件源码实时任务的上下文转换频繁,导致TLB失效严重,系统性能下降。另外,的保护级别变换耗时,尤其是陷入更高级别时需要个循环,而其它指令一般少于个循环。解决办法是使用可加载模组技术,所有的实时任务都同处于一个地址空间-内核地址空间,这不仅避免了频繁的TLB失效,同时消除了变换保护级别的消耗,而且任务转换变得容易。 c. 进程调度 实时系统的进程调度的主要任务是满足实时任务在时间上的要求。调度算法种类很多,没有一个策略适用于所有情况,因此采用哪种算法取决于具体应用。RT-LINUX采用的方法是允许用户编写自己的调度程序,并可以编译成模组的形式。这样可以方便地试验不同的策略和算法对于某一特定应用的适合性,从中选出最优。RT-LINUX自带的调度程序是基于优先数的抢占式调度程序,将LINUX当作具有最低优先数的实时任务。因此,展示站源码LINUX只在实时系统无任何实时任务时才运行。在从LINUX切换到实时任务时,系统记下软中断的状态并禁止软中断。在切换回来时,再恢复软中断的状态。 d. 时钟 调度程序需要精确的时钟才能准确操作。调度通常在特定的时刻进行任务切换。时钟的偏差会引起预定调度的偏差,导致产生被称为任务发布抖动的现象。这是一种应该尽量避免的不良现象。RT-LINUX的解决办法是,将IBM PC兼容机中的时钟芯片Intel 设置为中断开启终端计数模式。在这种模式下,精度可以达到1毫秒。这样在降低中断处理的影响的同时,获得了较高的时钟精度。 e. IPC 由于标准LINUX核心可以被实时任务在任意时刻抢占,实时任务无法安全地调用LINUX的程序。但是总要有一个信息交换的机制。在RT-LINUX中所用的信息交换方式是RT-FIFO(实时队列)。它与UNIX的管道非常相似,都是一个无结构的数据流。通过RT-FIFO,会员系统 源码LINUX的进程之间,实时进程之间,以及LINUX的核心与实时进程之间可以交换信息。对于一个普通的进程来说,RT-FIFO就是一个特殊的字符文件。这些文件必须自建:# for i in 0 1 2 3; do mknod /dev/rtf$i c $i; done扩展资料
RTLinux(AReal-Time Linux,亦称作实时Linux)是Linux中的一种实时操作系统。它由新墨西哥矿业及科技学院的V. Yodaiken开发。目前,RTLinux有一个由社区支持的免费版本,称为RTLinux Free,以及一个来自FSMLabs的商业版本,称作RTLinux Pro。linux内核数据结构之kfifo
Linux内核中的kfifo是一个精简且巧妙设计的环形队列,常用于解决生产者和消费者模型中的数据缓冲问题,确保数据处理的高效性。本文将探讨kfifo的数据结构、实现方法以及在并发环境下的使用。
在项目开发中,环形缓冲区(ring buffer)作为缓存机制,通过Linux内核的kfifo实现,能够有效降低CPU与内存或磁盘之间的交互压力。kfifo利用FIFO特性,通过队列形式处理数据,android 源码 汉化避免了进程间的频繁等待。维基百科提供详细的实现方法,包括判断队列状态的技巧。
内核的kfifo设计独具匠心,其数据结构简洁,包含in和out两个无符号变量。put和get操作通过自旋锁保证并发安全,当in或out达到最大值时,通过溢出机制实现循环使用。代码中,如put和get的memcpy调用处理边界情况,展示了缓冲区的动态变化过程。
为了更好地理解kfifo,可以参考Linux内核源码学习资源,同时,作者还分享了一个学习交流群,其中包含了丰富的学习资料。通过编写测试程序,我们可以模拟生产者和消费者场景,验证kfifo在并发环境下的性能和稳定性。
总结,kfifo是Linux内核中实用的环形队列,通过理解和应用,我们可以优化生产者消费者模型的性能,并在实际项目中有效利用它。
linux操作系统文件类型有哪几种,有什么区别?
Linux文件类型常见的有:普通文件、目录文件、字符设备文件和块设备文件、符号链接文件等,现在我们进行一个简要的说明。
1. 普通文件
我们用 ls -lh 来查看某个文件的属性,可以看到有类似-rwxrwxrwx,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。这类文件的删除方式是用rm 命令。
2. 目录文件
当我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。
3. 字符设备或块设备文件
区块(block)设备文件 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦。 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备。你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]。
字符(character)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等。这些设备的特色就是一次性读取的,不能够截断输出。 举例来说,你不可能让鼠标跳到另一个画面,而是滑动到另一个地方。第一个属性为 [ c ]。
4. 数据接口文件(sockets):
数据接口文件(或者:套接口文件),这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了。
5. 符号链接文件:
当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s 源文件名 新文件名创建的。这和Windows操作系统中的快捷方式有点相似。
kfifo(linux kernel 无锁队列)
队列作为常见数据结构,其主要特点是先进先出(FIFO)。FIFO用于缓冲通信速度不匹配场景,例如生产者快速生成数据,消费者则难以及时处理。在通信接口驱动中,数据被暂存于队列中,驱动程序可以立即返回接收新数据或等待,而解析程序仅需从队列中获取数据。FIFO也可解决“多生产者-单消费者”问题。
kfifo是Linux内核中实现队列功能的一种无锁环形队列。无锁意味着在单生产者单消费者场景下无需加锁操作。它通过使用in和out两个变量作为入队和出队索引来实现无锁操作,避免了在多个生产者或消费者场景下的加锁需求。通过将in/out与fifo的空间大小减一进行“与”操作,kfifo实现了比取余操作更快的队列循环。这意味着当in和out超过队列大小时,它们会继续向前加,而不是简单地减去队列大小后重新开始。
kfifo实现“无锁”特性仅针对“单生产者-单消费者”场景。对于“多生产者”或“多消费者”情况,需对入队或出队操作进行加锁以避免数据竞争。
使用kfifo有两种方式:动态申请和静态定义。动态申请包括包含头文件、定义结构体、申请内存、执行入队和出队操作,最后释放内存。静态定义则在定义fifo变量时使用宏,操作函数更加简洁,无需内存管理步骤。
kfifo结构体包含用于管理队列的变量,如in、out、mask等。内存申请过程确保了用mask大小掩码与in/out索引进行“与”操作,实现队列循环,避免了取余运算的开销。使用kfifo_alloc动态申请内存时,最终分配的内存空间是向上取2的次方,以支持mask大小掩码操作。这可能导致使用者在不了解规则的情况下踩坑,例如,申请字节内存时实际上分配了字节,可能导致数据错位。
入队操作涉及确定内存地址、拷贝数据并确保内存屏障以避免乱序异常。整个过程高效且简洁。对于更深入的了解,可查阅kfifo的源码。