將中斷處理移到執行緒中

2021-06-18 06:56:21 字數 2035 閱讀 8436

09-07-2013

yang honggang

---------------------------------------

源文:moving interrupts to threads

by jake edge 10-08-2008

---------------------------------------

將中斷處理移到執行緒中

因為在處理乙個中斷時,其他中斷就被阻塞了,所以對硬體中斷的處理是核心延遲的主要**。

為此,rt tree提供了乙個稱為中斷處理函式執行緒化的特性。該特性旨在減少中斷關閉的時間,

將中斷的大部分處理放到核心執行緒中。但是並不是僅僅rt核心對低延遲感興趣,所以中斷執行緒化

也被提議加入主線核心。

中斷執行緒化的好處之一是降低延遲,但是這並不是唯一的好處。最大的好處可能就是它簡化或

避免了中斷處理的"hard"和"soft"之間的鎖,從而降低了複雜度。中斷執行緒化有利於核心的

可除錯特性,它終將導致tasklet從linux核心中刪除。為此,thomas gleixner等提出了一系列

的補丁,並尋求相關建議,來將中斷執行緒化加入主線核心。

傳統的中斷處理中,中斷頂半部("hard" irq)用於響應硬體中斷,中斷底半部("soft" irq)由

頂半部排程用來作進一步的處理。頂半部執行時,要關閉中斷。所以,頂半部要盡可能的小,來

保證系統的響應時間。而中斷執行緒化,進一步減少了頂半部的工作。它的頂半部由乙個"快速檢測函式"

組成。而處理函式僅僅用於確認中斷來自於我們關注的裝置。這樣,它僅僅需要應答硬體中斷和

告知核心需要喚醒對應的中斷處理執行緒。

在rt tree中,幾乎所有的驅動都被轉化為使用核心執行緒處理中斷。gleixner的補丁建議對此改變

可選--由驅動的維護人決定如何做。自動轉化驅動不一定受到所有維護人的歡迎,也有另乙個不足,

正如同gleixner所寫:"當中斷處理函式利用了tasklet/softirq,並簡化了鎖時,中斷執行緒化才有意義。"

驅動要申請乙個執行緒化的中斷處理函式時,要使用:

int request_threaded_irq(unsigned int irq, irq_handler_t handler,

irq_handler_t quick_check_handler,

unsigned long flags, const char* name, void* dev)

該函式本質上和request_irq()相同,只是附加了quick_check_handler。正如同linus torvalds在

本年度的核心峰會上要求的,需要增加乙個新的函式而不是將眾多的驅動修改為使用新的

request_irq()。

quick_check_handler檢查中斷是否來自於我們關注的裝置,返回irq_none表示不是我們關注的裝置產生了中斷。

返回irq_handled標示不需要進一步的處理。返回irq_wake_thread標示喚醒中斷處理執行緒。增加了另乙個

返回碼來簡化向中斷執行緒化轉化。這樣,quick_check_handler就可以在中斷處理被轉化前被開發。

在這種情況下,它會返回irq_needs_handling(而不是irq_wake_thread)。這時會呼叫像傳統的中斷處理中

一樣呼叫原來的處理函式。

request_thread_irq()會為中斷建立乙個執行緒,並將指向該執行緒的指標放在struct irqaction中。

另外,乙個指向struct irqaction的指標也被新增到task_struct中。這樣,處理函式就可以檢查

新到來的中斷的動作標誌。該引用也來防止執行緒引發oops後崩潰。對於該提議的抱怨之一就是「浪費了

非中斷處理執行緒(佔據大部分)的task_struct 結構的4個或者8個位元組」。該結構應該分成兩種,

一種用於核心,另一種用於使用者空間。但是,這是否有必要還不清楚。

andi kleen的擔心更為普遍,中斷執行緒化會導致低質量的**:

"誠實地講,長遠地看,中斷執行緒化將鼓勵低質量的中斷**"。然而,他好像是少數者。

...

Python將本地資料遷移到mysql中

安裝包 pip install pymysql i import numpy as np from pandasql import sqldf from pandas import dataframe import pymysql import pandas as pd from sqlalchem...

WinCE OAL中的中斷處理

這張圖想必很多人都見過,主要這張圖太經典了,所以還是貼出來嘮叨幾句,硬體中斷產生以後,會導致核心isr的執行,然後由oal中的isr來處理相應的中斷,最後導致相對應的ist執行完成真正的中斷處理。所以在wince中,中斷處理由isr和ist共同完成。isr主要完成中斷源的確定,遮蔽該中斷並返回給核心...

linux中system call中斷處理過程

上次我們分析了系統呼叫大致過程,現在我們把這兩個系統呼叫的 放到menuos中,並用gdb跟蹤除錯來看看從system call開始到iret結束之間的整個過程。邊看實驗過程邊分析 首先我們要將系統裡面的menu目錄刪去,然後從github上更新到新版的menu。接著,把我們之前寫好的getpid ...