linux內核的一些知識點(中)

系統調用

內核爲用戶進程提供的交互接口,能夠爲用戶進程提供受限制地訪問硬件設備、申請操做系統資源以及建立進程和進程通訊等能力。linux中的每一個系統調用都對應一個系統調用號,調用號用於指明具體哪一個系統調用。linux

  • 系統調用既爲應用程序提供了請求接口,又保證了系統的安全和穩定。用戶空間的程序不能直接訪問內核代碼,內核代碼駐留在受保護的內存地址中,用戶進程沒法訪問這塊內存。
  • 系統調用在用戶進程和硬件設備之間增長一層,屏蔽了硬件的複雜操做,從而讓應用層的使用更加便捷。

應用編程接口API

實際上應用程序通常會使用用戶空間實現的應用編程接口來間接調用系統調用,API能夠經過一個或若干個系統調用來實現一個接口,並且能屏蔽不一樣操做系統的差別,爲應用程序提供相同的接口,好比經常使用的C庫。此外,POSIX標註給出了API和系統調用之間的關係,不一樣的操做系統提供與POSIX兼容的庫就能讓應用程序實現統一的接口。算法

對硬件的管理

操做系統內核的核心任務包括對計算機擴展的硬件進行管理,好比硬盤、鍵盤、鼠標及其餘擴展硬件。內核必需要可以與它們互相通訊,但通訊過程有個很關鍵的問題須要關注,就是速度問題。CPU的速度很是快,但向硬件發起一個請求並接到其響應的速度是至關慢的,如何有效讓它們協同工做是硬件管理的核心問題,由於這個問題極可能會嚴重影響總體性能。編程

有兩種實現方:輪詢機制和中斷機制。輪詢機制是讓內核按期對硬件設備進行查詢,看是否須要處理,若是須要則處理,這種狀況可能會讓內核作不少無用功。中斷機制則反過來,讓硬件主動來發送信號,當硬件有事件發生時則向內核發出信號,而後內核再介入處理。內核通常也是使用中斷機制來管理硬件。緩存

關於中斷

中斷機制讓硬件能發通知給CPU,中斷本質是一個特殊的電信號,處理器接收到中斷後會立刻告知內核。好比點擊下鼠標時鼠標控制器就會發送一箇中斷通知,處理器一旦檢測到中斷信號便中斷本身當前的工做轉而處理中斷,而後通知操做系統鼠標產生了中斷,內核得知鼠標被按下了,而後內核負責處理事件。安全

不一樣設備的中斷不一樣,經過一個惟一的數字做爲標識,也就是鼠標、鍵盤、硬盤的中斷值都不一樣,操做系統對不一樣的中斷進行處理。中斷值也稱中斷請求線(IRQ),每一個IRQ都對應一個數值,好比PC上0位時鐘中斷、1位鍵盤中斷。固然,也多是動態分配中斷值。網絡

中斷由硬件打斷操做系統,爲硬件與操做系統提供了通訊機制。數據結構

中斷處理程序

內核在響應每一個特定的中斷時都會執行指定的一個函數,該函數爲中斷處理程序。每一個硬件有一個相應的中斷處理程序,他屬於設備驅動的一部分。在linux中,中斷處理程序是一個C函數,這些C函數按照必定的類型聲明,而後內核就能夠以標準的方式調用。中斷處理程序被內核調用來響應中斷,它們運行在中斷上下文中,在該上下文中執行的代碼不可以阻塞。機器學習

中斷信號隨時可能發生,因此中斷處理程序隨時可能被運行,必須保證它快速被執行,才能快速恢復中斷代碼的執行。理想狀態是中斷能快速被響應,並且中斷處理程序能快速被執行完。但中斷程序要處理的工做每每有不少,好比對於網絡而言,中斷處理程序要將網卡的數據包拷貝獲得內存中,並且還要對其進行處理後才交給合適的協議棧,最終再告知硬件已處理中斷信號。異步

中斷的上半部和下半部

咱們想要快速的中斷響應,同時又想要在中斷處理程序中完成更多的工做,這是一個矛盾體。爲了解決這個問題,中斷處理被分爲上半部和下半部。上半部用於執行有嚴格時限的工做,好比應答硬件。而下半部用於處理可以延後處理的工做。上半部和下半部其實就是一種異步化處理思想,這樣既可以保證響應速度,又可以完成大工做量的處理。分佈式

對於網卡來講,它的緩存大小是固定的,一旦網卡接收到數據後內核必須立刻將它們拷貝到內存中,否則將可能致使網卡的緩存爆滿而數據包被丟失。鑑於這種狀況,對於網卡的中斷信號處理應該快速將網卡數據包拷貝到內存中,這就是上半部的工做,快速執行完後立刻結束中斷處理,將處理器交還給中斷前的程序。而耗時的數據包處理操做則放到下半部中,這部分能夠稍後一點再處理,沒有很強的時效性。

每一個設備都有本身的驅動程序,驅動程序能夠經過request_irq()函數來註冊中斷處理程序。

中斷上下文

中斷上下文是指內核在執行一箇中斷處理程序時所處的上下文,在該上下文中不能睡眠,也不能調用某些函數。中斷處理程序時打斷了其它正在執行的代碼,因此它必需要快速簡潔地執行完畢,中斷處理程序有本身的棧。

linux中斷過程

硬件產生了一箇中斷信號,它經過總線將電信號發送給中斷控制器,中斷控制器會將中斷信號發往處理器。處理器會當即中止正在作的事情,而後關閉中斷系統並跳到預約義的位置開始執行代碼,這個預約義的代碼就是由內核設置的中斷處理程序入口。對於每一箇中斷線,處理器都會跳轉到對應一個惟一的入口位置。內核執行do_IRQ()函數對所接收到的中斷進行響應。

系統定時器

內核大量函數都是基於時間驅動的,好比有些函數週期性地執行,這些就須要定時器來支持。系統定時器是一種可編程硬件芯片,它以固定頻率產生中斷,即定時器中斷,它對應的中斷處理程序負責更新系統時間,同時也負責執行週期性任務。定時器和時鐘中斷處理程序是linux內核管理機制的中樞。

定時器是管理內核流逝時間的基礎,使用定時器時設置一個超時時間,而且指定超時發生時執行的函數。當定時器到時時會自動執行該函數,該函數只運行一次。

內核的時間

內核須要在硬件的幫助下才能計算和管理時間,硬件提供了系統定時器給內核來計算流逝的時間,當時鍾中斷髮生時內核的特定中斷處理程序會對其進行處理。定時器以某種頻率自行觸發時間中斷,這個頻率成爲節拍率,連續兩次時間中斷的間隔時間爲節拍。內核經過已知的節拍來計算牆上時間和系統運行時間,牆上時間便是實際時間,系統運行時間爲自系統啓動後開始的時間。內核也爲用戶空間提供了一組獲取實際時間和日期的系統調用。

實時時鐘

實時時鐘(RTC)是用來持久存放系統時間的設備,它能夠靠主板上的微型電池保持系統的計時,因此即便系統關閉了也能保持系統時間的計時。實時時鐘和CMOS集成在一塊兒,實時時鐘與BIOS的保存設置都是經過同一個電池供電。系統啓動時內核讀取實時時鐘來初始化牆上時間,該時間對應的變量爲xtime。

基於時間的內核管理

內核不少工做都依賴於時鐘中斷,好比:

  • 系統運行時間的更新工做。
  • 實際時間的更新工做。
  • 在SMP結構中,均衡調度程序中運行隊列的均衡工做。
  • 判斷當前進程是否使用完了本身的時間片,調度工做。
  • 執行動態定時器。
  • 處理器時間的統計工做。

關於節拍率

系統定時器的節拍率提供給靜態預處理定義,單位爲HZ,內核再asm/param.h文件中定義。x86體系中系統定時器頻率默認值爲100,因此時鐘中斷評論爲100HZ,每秒進行時鐘中斷100次,每10ms產生一次。不一樣的體系結構節拍率可能不一樣。

更高的節拍率能提供時間驅動時間的解析度,同時也提升時間驅動事件的準確度。對於linux來講能提供更高的精度來執行poll()、select()等系統調用,也能提升進程搶佔的準確度。但高節拍率會增長系統負擔,由於會更加頻繁地執行時鐘中斷處理程序,增長了電源的消耗。

jiffies

jiffies是一個全局變量,它用來記錄自系統啓動以來產生的節拍總數。啓動時爲0,而後每次時鐘中斷都會增長改變了的值,每秒增量爲節拍率,即n赫茲。時鐘中斷處理程序工做大體包括:

  • 得到xtime_lock鎖,對jiffies_64和牆上時間xtime進行保護。
  • 應答系統時鐘。
  • 使用牆上時間更新實時時鐘。
  • 累加jiffies_64。
  • 更新當前進程消耗的系統時間和用戶時間。
  • 執行已到期的定時器。
  • 計算平均負載。

專一於人工智能、讀書與感想、聊聊數學、計算機科學、分佈式、機器學習、深度學習、天然語言處理、算法與數據結構、Java深度、Tomcat內核等。

相關文章
相關標籤/搜索