IO機(jī)制vs下半部機(jī)制vs并發(fā)控制機(jī)制_第1頁
IO機(jī)制vs下半部機(jī)制vs并發(fā)控制機(jī)制_第2頁
IO機(jī)制vs下半部機(jī)制vs并發(fā)控制機(jī)制_第3頁
IO機(jī)制vs下半部機(jī)制vs并發(fā)控制機(jī)制_第4頁
IO機(jī)制vs下半部機(jī)制vs并發(fā)控制機(jī)制_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

IO機(jī)制vs下半部機(jī)制vs并發(fā)控制機(jī)制Jet.chenJet.chen.g@目錄預(yù)備知識(shí)三種機(jī)制的比較下半部機(jī)制并發(fā)控制機(jī)制匯總驅(qū)動(dòng)IO機(jī)制匯總FAQ預(yù)備知識(shí)1.三種線程:內(nèi)核線程、輕量級(jí)進(jìn)程、用戶線程內(nèi)核線程:kthread_create()輕量級(jí)進(jìn)程:clone()用戶線程:Pthread_create()2.一種進(jìn)程:用戶進(jìn)程linux普通應(yīng)用:API:fork/vfork/clone/Linux中,每個(gè)XX都有一個(gè)task_struct,所以線程和進(jìn)程可以使用同一調(diào)度器調(diào)度。因?yàn)長inux中進(jìn)程的概念已經(jīng)被抽象成了計(jì)算狀態(tài)加資源的集合,這些資源在進(jìn)程間可以共享。

為何要區(qū)分?使用資源和同步效率,調(diào)度開銷等都不一樣。知識(shí)預(yù)備-進(jìn)程上下文和中斷上下文概念描述什么時(shí)候發(fā)生進(jìn)程上下文主要是異常處理程序和內(nèi)核線程。內(nèi)核之所以進(jìn)入進(jìn)程上下文是因?yàn)檫M(jìn)程自身的一些工作需要在內(nèi)核中做。例如,系統(tǒng)調(diào)用是為當(dāng)前進(jìn)程服務(wù)的,異常通常是處理進(jìn)程導(dǎo)致的錯(cuò)誤狀態(tài)等。所以在進(jìn)程上下文中引用current是有意義的。進(jìn)程調(diào)度;系統(tǒng)調(diào)用;中斷上下文是因?yàn)橹袛嘈盘?hào)而導(dǎo)致的中斷處理或軟中斷。而中斷信號(hào)的發(fā)生是隨機(jī)的,中斷處理程序及軟中斷并不能事先預(yù)測(cè)發(fā)生中斷時(shí)當(dāng)前運(yùn)行的是哪個(gè)進(jìn)程,所以在中斷上下文中引用current是可以的,但沒有意義。事實(shí)上,對(duì)于A進(jìn)程希望等待的中斷信號(hào),可能在B進(jìn)程執(zhí)行期間發(fā)生。例如,A進(jìn)程啟動(dòng)寫磁盤操作,A進(jìn)程睡眠后現(xiàn)在時(shí)B進(jìn)程在運(yùn)行,當(dāng)磁盤寫完后磁盤中斷信號(hào)打斷的是B進(jìn)程,在中斷處理時(shí)會(huì)喚醒A進(jìn)程。

發(fā)生中斷;

為什么在中斷上下文中不能休眠?原因在于中斷上下文不是一個(gè)進(jìn)程上下文,其沒有一個(gè)專門用來描述CPU寄存器等信息的數(shù)據(jù)結(jié)構(gòu),所以無法被調(diào)度器調(diào)度。如果將中斷上下文也設(shè)計(jì)成進(jìn)程上下文,那么調(diào)度器就可以對(duì)其進(jìn)行調(diào)度,如果在開中斷的情況下,其自然就可以睡眠了。但是,如果這樣設(shè)計(jì),那么中斷處理的效率將會(huì)降低。中斷(硬中斷、軟中斷)處理都是些耗時(shí)不是很長,對(duì)實(shí)時(shí)性要求很高,執(zhí)行頻度較高的應(yīng)用,所以,如果采用一個(gè)專門的后臺(tái)daemon對(duì)其處理,顯然并不合適。三種機(jī)制的比較機(jī)制描述種類實(shí)現(xiàn)下半部機(jī)制

由下到上的

通知機(jī)制;軟中斷,工作隊(duì)列,tasklet,內(nèi)核定時(shí)器等;同步/異步IO機(jī)制

是由上到下(或者驅(qū)動(dòng)程序自發(fā))的

IO通信機(jī)制。分為阻塞IO(異步)與非阻塞IO(同步)

等待隊(duì)列,poll,epoll,Completions機(jī)制等并發(fā)控制機(jī)制提供并發(fā)控制機(jī)制,對(duì)共享資源進(jìn)行保護(hù)。spinlock,mutex,信號(hào)量,中斷屏蔽、順序鎖(seqlock)、RCU(Read-Copy-Update)等在編程中

往往三者互相使用:

比如

hwm_sensor的驅(qū)動(dòng):用到(內(nèi)核定時(shí)器+工作隊(duì)列+mutex取決于

項(xiàng)目設(shè)計(jì)的需要。)Mtklogdump:就用到poll+等待隊(duì)列下半部機(jī)制機(jī)制是否在進(jìn)程上下文是否在中斷上下文可否睡眠是否需要內(nèi)核線程性能CPU的支持特性是否需要調(diào)度應(yīng)用場(chǎng)合軟中斷

yesYesNo可有可無,取決于調(diào)用時(shí)機(jī)高1)一個(gè)類型的軟中斷可以執(zhí)行在多個(gè)CPU;2)并發(fā)運(yùn)行在多個(gè)CPU上(即使同一類型的也可以)。所以軟中斷必須設(shè)計(jì)為可重入的函數(shù)(允許多個(gè)CPU同時(shí)操作),因此也需要使用自旋鎖來保護(hù)其數(shù)據(jù)結(jié)構(gòu)。YES考慮因素:多CPU;不可睡眠,不可阻塞;軟中斷是在編譯期間靜態(tài)分配;系統(tǒng)開銷相對(duì)??;設(shè)計(jì)難度高;適合執(zhí)行頻率高和連續(xù)性執(zhí)行要求高的情況,性能較高;應(yīng)用:目前只有兩個(gè)子系直接使用軟中斷:網(wǎng)絡(luò)和SCSI。

例如在網(wǎng)絡(luò)子系統(tǒng)中,注冊(cè)了如下兩個(gè)softirq及其處理函數(shù):open_softirq(NET_TX_SOFTIRQ,net_tx_action);--注冊(cè)softirqopen_softirq(NET_RX_SOFTIRQ,net_rx_action);--觸發(fā)softirq

taskletyesYESNO可有可無,取決于調(diào)用時(shí)機(jī)中1)一個(gè)類型的tasklet只能執(zhí)行在單個(gè)CPU;不能并行,只能串行執(zhí)行。

2)多個(gè)不同類型的tasklet可以并行在多個(gè)CPU上。

YES考慮因素:?jiǎn)蜟PU;不可睡眠,不可阻塞;動(dòng)態(tài)分配;系統(tǒng)開銷相對(duì)小;設(shè)計(jì)難度??;適合執(zhí)行頻率低,連續(xù)性要求低的情況下;性能中;應(yīng)用:TP,鍵盤,鼠標(biāo)。大部分設(shè)備驅(qū)動(dòng)都使用它。下半部機(jī)制工作隊(duì)列YESNOYESYES低1)每個(gè)工作隊(duì)列(僅限于MT)都會(huì)在每一個(gè)cpu上創(chuàng)建一個(gè)內(nèi)核線程。2)一個(gè)工作隊(duì)列可以在不同CPU上同時(shí)運(yùn)行。YES考慮因素:多CPU;可睡眠,可阻塞;動(dòng)態(tài)創(chuàng)建;系統(tǒng)開銷大;設(shè)計(jì)難度?。贿m合執(zhí)行頻率低,連續(xù)性要求低的情況下;需要考慮使用進(jìn)程上下文的情況(信號(hào),消息,內(nèi)存申請(qǐng)等);性能低;應(yīng)用:LED燈光控制;

內(nèi)核定時(shí)器noyesNOno較低同

軟中斷,實(shí)際上是一個(gè)軟中斷種類:TIMER_SOFTIRQ

yes考慮因素:需要在某段時(shí)間內(nèi)執(zhí)行的情況下使用;只執(zhí)行一次;應(yīng)用:軟件定時(shí)器在設(shè)備驅(qū)動(dòng)程序中被大量應(yīng)用以檢測(cè)設(shè)備的狀態(tài)。

觸屏中斷檢測(cè)防抖動(dòng)功能;init_timer()Add_timer();Mod_timer();….

并發(fā)控制機(jī)制匯總From網(wǎng)絡(luò)并發(fā)控制機(jī)制匯總補(bǔ)充:1.順序鎖(seqlock),RCU,也稱為

多核情況下,linux的無鎖編程算法)2.各種鎖,互斥量的實(shí)現(xiàn)基礎(chǔ)都是依靠原子操作完成。

semaphore又是在spinlock基礎(chǔ)上實(shí)現(xiàn)。3.Mutex比較semaphoreLinux驅(qū)動(dòng)IO機(jī)制匯總序列概念描述通知方式"實(shí)現(xiàn)方式應(yīng)用層次應(yīng)用實(shí)例1阻塞:是指進(jìn)程在執(zhí)行設(shè)備操作時(shí),若不能獲得資源,則掛起進(jìn)程直到滿足可操作的條件后再進(jìn)行操作。注意:被掛起的進(jìn)程會(huì)進(jìn)入休眠狀態(tài),它將被從調(diào)度器的運(yùn)行隊(duì)列移走??梢杂善渌绦騺韱拘驯蛔枞年?duì)列。Wait_event(&waiter)等待隊(duì)列內(nèi)核充電線程內(nèi);lcd刷屏;…..2異步通知:由設(shè)備通知進(jìn)程可以訪問,實(shí)現(xiàn)異步的IO。有點(diǎn)類似阻塞IO。適當(dāng)?shù)臅r(shí)候驅(qū)動(dòng)程序調(diào)用kill_fasync()函數(shù),使用信號(hào)SIGIO通知應(yīng)用程序,設(shè)備準(zhǔn)備就緒,可以執(zhí)行IO操作了。file_operations結(jié)構(gòu)體中實(shí)現(xiàn):Fasync_struct結(jié)構(gòu)體內(nèi)核+應(yīng)用配合ccci;Audiodriver;3非阻塞IO:當(dāng)進(jìn)程在不能進(jìn)行設(shè)備操作時(shí),并不掛起,它或者放棄,或者不停的查詢,直到可以進(jìn)行操作為止。應(yīng)用自己決定什么時(shí)候放棄;POLL,Epoll,select,內(nèi)核+應(yīng)用層;應(yīng)用層;Mtklog;Logdump應(yīng)用;4異步IO(AIO):也叫做異步I/O(AIO),用戶程序可以通過向內(nèi)核發(fā)出I/O請(qǐng)求命令,不用等帶I/O事件真正發(fā)生,可以繼續(xù)做另外的事情,等I/O操作完成,通知方式:內(nèi)核會(huì)通過函數(shù)回調(diào)或者信號(hào)機(jī)制通知用戶進(jìn)程。這樣很大程度提高了系統(tǒng)吞吐量。

1)Vs非阻塞IO:非阻塞IO中,如果設(shè)備資源不可用,則驅(qū)動(dòng)程序返回EAGAIN,應(yīng)用程序需要在適當(dāng)?shù)臅r(shí)候進(jìn)行重試,直到資源可用,IO請(qǐng)求成功執(zhí)行。而使用異步IO時(shí),如果設(shè)備資源不可用,IO請(qǐng)求會(huì)排隊(duì)等待處理,驅(qū)動(dòng)程序返回EIOCBQUEUED,應(yīng)用程序不需要進(jìn)行重試。

2)VS異步通知共同點(diǎn):這兩種機(jī)制都有這樣一共通點(diǎn):都可以在驅(qū)動(dòng)層使用信號(hào)來通知應(yīng)用層的程序做相應(yīng)的I/O操作。在AIO中,可以使用信號(hào)和回調(diào)函數(shù)是實(shí)現(xiàn)內(nèi)核空間對(duì)用戶空間應(yīng)用程序通知的兩種機(jī)制。

差異點(diǎn):與異步通知相比較,異步通知強(qiáng)調(diào)的是設(shè)備就緒后,驅(qū)動(dòng)程序主動(dòng)通知應(yīng)用程序。強(qiáng)調(diào)的是應(yīng)用程序處于被動(dòng)的一面。AIO強(qiáng)調(diào)的多次操作后查詢結(jié)果。概念本身有交疊的地方??梢允褂眯盘?hào)和回調(diào)函數(shù)是實(shí)現(xiàn)內(nèi)核空間對(duì)用戶空間應(yīng)用程序通知file_operations結(jié)構(gòu)體中實(shí)現(xiàn):

aio_read()aio_write()等等

加上GNUC庫支持內(nèi)核+應(yīng)用配合mtk的xlogFAQ1。linux內(nèi)核打印"BUG:schedulingwhileatomic"和"bad:schedulingfromtheidlethread"錯(cuò)誤的時(shí)候,通常是在中斷處理函數(shù)中調(diào)用了可以休眠的函數(shù),如semaphore,mutex,sleep之類的可休眠的函數(shù),而linux內(nèi)核要求在中斷處理的時(shí)候,不允許系統(tǒng)高度,不允許搶占,要等到中斷處理完成才能做其他事情。因此,要充分考慮中斷處理的時(shí)間,一定不能太久Internalerror:Oops-BUG:0[#1]PREEMPTSMPARM原因就是mutextlock時(shí)間太長,導(dǎo)致的。例如:[154.941700]-([154.942751]-(0)[43:kworker/u:1][<c03c8e5c>](aee_wdt_irq_info+0x0/0x154)from[<c03c9070>](aee_wdt_fiq_info+0xc0/0xd0)[154.944090]-(0)[43:kworker/u:1]r9:c08f5fc0r8:00000096r7:00000000r6:00000000r4:00000000[154.945139]-(0)[43:kworker/u:1][<c0653688>](mutex_lock_nested+0x0/0x568)from[<c044d940>](synaptics_rmi4_i2c_read+0x60/0x290)[154.946582]-(0)[43:kworker/u:1][<c044e5bc>](synaptics_rmi4_sensor_wake+0x0/0x98)from[<c044e890>](synaptics_rmi4_resume+0x30/0xe0)[154.949603]-(0)[43:kworker/u:1]r6:00000000r5:c080365cr4:c092af20[154.950390]-(0)[43:kworker/u:1][<c044e860>](synaptics_rmi4_resume+0x0/0xe0)from[<c00b76d8>](late_resume+0x184/0x1b8)[154.951740]-(0)[43:kworker/u:1]r7:0000000br6:c0982198r5:c09ddec0r4:c092af20/u:1][<c00b7554>](late_resume+0x0/0x1b8)from[<c006af38>](process_one_work+0x1bc/0x58c)[154.953969]-(0)[43:kworker/u:1][<c006ad7c>](process_one_work+0x0/0x58c)from[<c006b494>](worker_thread+0x18c/0x3d8)[跟蹤到這里:mutex_lock(&(rmi4_data->rmi4_io_ctrl_mutex));觸發(fā)內(nèi)核異常//oldsize=4096nowchangeto2048

gprDMABuf_va=(u8*)dma_alloc_coherent(NULL,4096,&gprDMABuf_pa,GFP_KERNEL);

if(!gprDMABuf_va){printk("[Error]AllocateDMAI2CBufferfailed!\n");

}發(fā)現(xiàn)這個(gè)rmi4_io_ctrl_mutex的數(shù)值

前后不一致,說明或者傳入有問題,或者取數(shù)據(jù)時(shí)候有問題。首先私有數(shù)據(jù)rmi4_data與dev的綁定:FAQstaticintsynaptics_rmi4_set_input_dev(structsynaptics_rmi4_data*rmi4_data){intretval;inttemp;rmi4_data->input_dev=input_allocate_device();……………..input_set_drvdata(rmi4_data->input_dev,rmi4_data);是一個(gè)input設(shè)備類型}

staticintsynaptics_rmi4_resume(structdevice*dev){intretval;structsynaptics_rmi4_exp_fhandler*exp_fhandler;//structsynaptics_rmi4_data*rmi4_data=dev_get_drvdata(dev);----不能這樣取數(shù)據(jù)修改為://modifedbyjetinhuaqin,fordataerror.exeple:mutexdataerror,willcausesystemdeadlockstructinput_dev*input_raw=to_input_dev(dev);structsynaptics_rmi4_data*rmi4_data=input_get_drvdata(input_raw);4.工作隊(duì)列中能否使用等待隊(duì)列???FAQstaticintsynaptics_rmi4_set_input_dev(structsynaptics_rmi4_data*rmi4_data){intretval;inttemp;rmi4_data->input_dev=input_allocate_device();……………..input_set_drvdata(rmi4_data->input_dev,rmi4_data);是一個(gè)input設(shè)備類型}

staticintsynaptics_rmi4_resume(structdevice*dev){intretval;structsynaptics_rmi4_exp_fhandler*exp_fhandler;//structsynaptics_rmi4_data*rmi4_data=dev_get_drvdata(dev);----不能這樣取數(shù)據(jù)修改為://modifedbyjetinhuaqin,fordataerror.exeple:mutexdataerror,willcausesystemdeadlockstructinput_dev*input_raw=to_input_dev(dev);structsynaptics_rmi4_data*rmi4_data=input_get_drvdata(input_raw);4.工作隊(duì)列中能否使用等待隊(duì)列???FAQstaticvoid

hwmsen_work_func(structwork_struct*work){。。。。。。。。。。。。。#ifdefHQ_SENSORif((isCameraActive==1)&&((idx==ID_MOTION)||(idx==ID_LIGHT)||(idx==ID_PROXIMITY)||(idx==ID_FACE_DETECT))){HWM_ERR("donotreaddatafromsensor(%d)\n",idx);HWM_ERR("cameraisACTIVE,setthethreadintoWAITstatus\n");wait_event_interruptible(hi164_wq,(hi164_wq_flag==KAL_FALSE));//restarthi164toothermode5.軟中斷回調(diào)里面之后加mutexordeley等

會(huì)報(bào)出異常:比如內(nèi)核定時(shí)器里面使用mutex。::軟中斷跑在swapper線程的內(nèi)核??臻g:【c08bf890:c00119c4】]Backtrace:[52.113934](0)[0:swapper/0][<c00119c4>]save_stack_trace_tsk+0x0/0x98[52.113946](0)[0:swapper/0][<c03c7fc4>]aee_get_traces+0x60/0xc0[52.113957](0)[0:swapper/0][<c03c80b8>]aee_kernel_warning_api+0x94/0xe0[52.113970](0)[0:swapper

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論