一種硬盤讀取方法及裝置的制造方法
【技術領域】
[0001]本發明涉及電子信息技術領域,特別涉及一種硬盤讀取方法及裝置。
【背景技術】
[0002]應用程序通過操作系統(如Linux和Windows等)提供的通用讀操作系統調用,讀取硬盤數據。
[0003]通用SCSI (Small Computer System Interface,小型計算機系統接口)驅動層經由更底層的設備驅動和硬盤打交道,從硬盤獲取數據。
[0004]在系統調用層和通用SCSI驅動層之間以及通用SCSI驅動層和硬盤之間還有其他操作系統中間層,與系統調用層和通用SCSI驅動層一起構成操作系統完整的硬盤1(Input/Output,輸入/輸出)處理邏輯。這些中間層與本發明專利無關,可簡單視為在系統調用層和通用SCSI驅動層之間傳遞1請求和數據,在此不作累述。
[0005]當讀操作遇到硬盤壞塊,通用SCSI驅動層得到讀操作失敗的結果后,會對硬盤執行重置操作,然后再重新執行讀操作。在Linux操作系統中,對硬盤的重置操作重復嘗試次數由內核常量SD_MAX_RETRIES定義,缺省值為5。
[0006]通用SCSI驅動層反復重試SD_MAX_RETRIES次后,失敗的結果最終傳遞到系統調用層。系統調用層得到失敗的結果后,會認為“可能是暫時的故障”,并重新嘗試再執行一次讀操作。
[0007]通用SCSI驅動層收到重試的第二次讀操作命令后,再次讀硬盤,得到失敗的結果后,又重復嘗試SD_MAX_RETRIES次。
[0008]這樣“讀”系統調用執行過程,遇到硬盤壞塊,總共會導致12次的SCSI驅動讀硬盤操作失敗,以及12次的重置硬盤操作。硬盤壞塊讀操作需耗時I秒多才返回失敗結果,重置硬盤耗時不少于1.5秒。12次的重試操作總共耗時超過40秒。
[0009]在視頻監控領域,應用程序需要及時把每時每刻都在不斷產生的監控視頻數據保存到存儲設備(如硬盤)。讀操作阻塞40多秒,會導致在這段時間內產生的監控視頻數據無法及時寫入硬盤,積壓在用戶空間的緩存中,并最終被更新的監控視頻數據覆蓋,造成嚴重的監控錄像丟失事故。
【發明內容】
[0010]本發明提供了一種硬盤讀取方法及裝置,旨在解決讀硬盤操作遇到硬盤壞塊時硬盤長時間不可訪問的問題。
[0011]一方面,本發明提供了一種硬盤讀取方法,所述方法包括:
[0012]判斷硬盤中的待讀取內容是否讀取至操作系統緩沖區中的目標緩存頁;
[0013]若所述硬盤中的待讀取內容讀取至所述操作系統緩沖區中的目標緩存頁,則設置頁狀態參數為第一布爾值;
[0014]判斷所述目標緩存頁的內容是否與所述硬盤中待讀取內容一致;
[0015]若所述目標緩存頁的內容與所述硬盤中待讀取內容不一致,則將所述目標緩存頁的最新標示位設置為第二布爾值;
[0016]當頁狀態參數為第一布爾值且所述最新標示位設置為第二布爾值時,返回讀取硬盤失敗?目息。
[0017]第二方面,本發明提供了一種硬盤讀取裝置,所述裝置包括:
[0018]第一判斷模塊,用于判斷硬盤中的待讀取內容是否讀取至操作系統緩沖區中的目標緩存頁;
[0019]第一設置模塊,用于若所述硬盤中的待讀取內容讀取至所述操作系統緩沖區中的目標緩存頁,則設置頁狀態參數為第一布爾值;
[0020]第二判斷模塊,用于判斷所述目標緩存頁的內容是否與所述硬盤中待讀取內容一致;
[0021]第二設置模塊,用于若所述目標緩存頁的內容與所述硬盤中待讀取內容不一致,則將所述目標緩存頁的最新標示位設置為第二布爾值;
[0022]返回模塊,用于當頁狀態參數為第一布爾值且所述最新標示位設置為第二布爾值時,返回讀取硬盤失敗信息。
[0023]在本發明中,由于首先判斷硬盤中的待讀取內容是否讀取至操作系統緩沖區中的目標緩存頁,若是,則設置頁狀態參數為第一布爾值,再判斷目標緩存頁的內容是否與硬盤中待讀取內容一致,若目標緩存頁的內容與硬盤中待讀取內容不一致,則將目標緩存頁的最新標示位設置為第二布爾值,最后當頁狀態參數為第一布爾值且最新標示位設置為第二布爾值時,返回讀取硬盤失敗信息,因此,縮短了硬盤壞塊故障處理流程,提高了存在壞塊的硬盤的可用性。
【附圖說明】
[0024]為了更清楚地說明本發明實施例中的技術方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
[0025]圖1為本發明實施例一提供的硬盤讀取方法一種流程圖;
[0026]圖2為本發明實施例一提供的硬盤讀取方法另一種流程圖;
[0027]圖3為本發明實施例二提供的硬盤讀取裝置一種結構示意圖;
[0028]圖4為本發明實施例二提供的硬盤讀取裝置另一種結構示意圖。
【具體實施方式】
[0029]為使本發明的目的、技術方案和優點更加清楚,下面將結合附圖對本發明實施方式作進一步地詳細描述。
[0030]實施例一:
[0031]本發明實施例一提供了一種硬盤讀取方法,參見圖1,硬盤讀取方法包括以下步驟:
[0032]101.判斷硬盤中的待讀取內容是否讀取至操作系統緩沖區中的目標緩存頁。判斷硬盤中的待讀取內容是否讀取至操作系統緩沖區中的目標緩存頁具體為:判斷目標緩存頁的預讀標識位是否被置位。
[0033]102.若硬盤中的待讀取內容讀取至操作系統緩沖區中的目標緩存頁,則設置頁狀態參數為第一布爾值。
[0034]103.判斷目標緩存頁的內容是否與硬盤中待讀取內容一致。判斷目標緩存頁的內容是否與硬盤中待讀取內容一致具體為:判斷目標緩存頁的最新標示位是否被置位。
[0035]104.若目標緩存頁的內容與硬盤中待讀取內容不一致,則將目標緩存頁的最新標示位設置為第二布爾值。
[0036]105.當頁狀態參數為第一布爾值且最新標示位設置為第二布爾值時,返回讀取硬盤失敗?目息。
[0037]可選的,如圖2所示,在步驟105之前還包括步驟104-2和步驟104_3。
[0038]104-2.對目標緩存頁進行加鎖。
[0039]104-3.判斷目標緩存頁的地址與硬盤中的待讀取內容的地址是否存在映射關系。
[0040]步驟104-2和步驟104-3用于防止和確認該目標緩存頁是否被其它視頻監控線程更新,如沒有被其他視頻監控線程更新,則返回讀取硬盤失敗信息。
[0041]可選的,如圖2所示,在步驟105之后還包括步驟105-2。
[0042]105-2.對目標緩存頁進行解鎖。
[0043]可選的,如圖2所示,在步驟101之前還包括步驟100-1和步驟100_2。
[0044]100-1.將通用SCSI驅動層的重讀硬盤參數設置為O。本步驟用于設置通用SCSI驅動層讀取硬盤失敗時不再重讀硬盤。
[0045]100-2.設置頁狀態參數為第三布爾值,第三布爾值與第一布爾值不相同。本步驟用于初始化頁狀態參數。
[0046]例如,當系統為Linux操作系統時,修改內核常量SD_MAX_RETRIES值為O,添加設置頁狀態參數PAGE_CACHED,初始化為FALSE,判斷硬盤中的待讀取內容是否讀取至操作系統緩沖區中的目標緩存頁,即判斷目標緩存頁的預讀標識位(PageReadahead)是否被置位,若被置位,則