訪問哈希表的裝置和方法【
技術領域:
】[0001]本發(fā)明涉及計算機領域,更為具體地,涉及一種訪問哈希表的裝置和方法。【
背景技術:
】[0002]隨著大數據時代的到來,分布式計算在給我們帶來大量機遇的同時,也帶來了許多挑戰(zhàn)。如何獲取海量的數據信息,如何從海量的數據信息中挖掘出有更價值的信息,如何構建高效、穩(wěn)定的大數據處理平臺和分布式計算平臺都是亟待解決的問題。[0003]無論是傳統的數據庫系統,還是新興的大數據處理平臺,它們中的許多都是基于鍵-值(key-value)對的數據模型構建的,其中,鍵也稱關鍵字。例如,各種關系型數據庫系統,HadoopMapreduce、HadoopDryad等分布式處理平臺,MemcachecURedis等內存計算系統均是采用鍵-值的數學模型而構建的。哈希表(hashtable)是存儲鍵-值對的一種很重要的數據結構。哈希表一般建立在內存中,對哈希表的大量操作意味著處理器的大量的訪存操作。而對內存的訪問恰是制約處理器性能的瓶頸,從而可知,對哈希表的操作是這一類平臺上的應用的瓶頸。[0004]現有技術中,中央處理器(CPU,CentralProcessingUnit)-般包括LI緩存和L2緩存,而哈希數據與其他類型的數據共用這些通用緩存,這樣會經常出現通用緩存中的哈希數據被其他類型的數據替換掉的現象,使得通用緩存中的哈希數據的命中率低,此時CPU不得不再次進行訪存操作,重新從內存中讀取被替換掉的哈希數據,導致系統效率低下。【
發(fā)明內容】[0005]本發(fā)明實施例提供一種訪問哈希表的裝置和方法,以提高哈希表訪問的效率。[0006]第一方面,提供一種訪問哈希表的裝置,所述裝置包括:獲取模塊,用于獲取訪問請求,所述訪問請求包括關鍵字;第一確定模塊,用于根據所述獲取模塊獲取的所述關鍵字,確定目標哈希地址;第二確定模塊,用于根據所述第一確定模塊確定的所述目標哈希地址,確定哈希表緩存中是否存在命中的哈希表項,所述哈希表緩存位于通用的處理器中,且所述哈希表緩存專門用于緩存內存中的哈希表的至少部分哈希表項,其中,所述哈希表緩存的每個緩存行用于緩存所述哈希表的一個哈希表項;第一訪問模塊,用于當所述第二確定模塊確定所述哈希表緩存中存在命中的哈希表項時,訪問所述哈希表緩存中命中的哈希表項。[0007]結合第一方面,在第一方面的一種實現方式中,所述哈希表緩存包括主哈希表緩存和公共沖突緩存,所述公共沖突緩存用于存放所述至少部分哈希表項中的沖突表項,所述第二確定模塊具體用于:根據所述目標哈希地址,確定所述主哈希表緩存中是否存在命中的哈希表項;和/或根據所述目標哈希地址,確定所述公共沖突緩存中是否存在命中的哈希表項。[0008]結合第一方面或其上述實現方式的任一種,在第一方面的另一種實現方式中,所述主哈希表緩存包括N路緩存,所述N路緩存之間組相連,其中所述N路緩存中的每個緩存行的tag字段包括:第一字段和第二字段,所述每個緩存行的第一字段為所述每個緩存行存儲的哈希表項對應的哈希地址的高位字段,所述每個緩存行的第二字段為所述每個緩存行存儲的哈希表項對應的關鍵字,所述第二確定模塊具體用于:以所述目標哈希地址的低位字段為索引,從所述N路緩存中的每路緩存中選出對應的緩存行,得到N個緩存行;將所述N個緩存行中的每個緩存行的第一字段與所述目標哈希地址的高位字段進行比較;當所述N個緩存行中的每個緩存行的第一字段與所述目標哈希地址的高位字段均不相同時,確定所述主哈希表緩存中不存在命中的哈希表項;當所述N個緩存行中存在第一字段與所述目標哈希地址的高位字段相同的目標緩存行時,比較所述目標緩存行的第二字段與所述訪問請求包括的關鍵字是否相同;當所述目標緩存行的第二字段與所述訪問請求包括的關鍵字相同時,確定所述主哈希表緩存中存在命中的哈希表項;當所述目標緩存行的第二字段與所述訪問請求包括的關鍵字不相同時,確定所述主哈希表緩存中不存在命中的哈希表項。[0009]結合第一方面或其上述實現方式的任一種,在第一方面的另一種實現方式中,所述公共沖突緩存包括全相連結構,所述公共沖突緩存的緩存行的目標tag字段包括第三字段和第四字段,所述第三字段為所述公共沖突緩存的緩存行存儲的哈希表項對應的哈希地址,所述第四字段為所述公共沖突緩存的緩存行存儲的哈希表項對應的關鍵字,所述第二確定模塊具體用于:比較所述目標哈希地址與所述公共沖突緩存中的每個緩存行的tag字段;當所述公共沖突緩存中各緩存行的tag字段與所述目標哈希地址均不相同時,確定所述公共沖突緩存中不存在命中的哈希表項;當所述公共沖突緩存中存在tag字段與所述目標哈希地址相同的目標緩存行時,比較所述目標緩存行的第四字段與所述訪問請求包括的關鍵字;當所述目標緩存行的第四字段與所述訪問請求包括的關鍵字相同時,確定所述公共沖突緩存中存在命中的哈希表項;當所述目標緩存行的第四字段與所述訪問請求包括的關鍵字不相同時,確定所述公共沖突哈希緩存中不存在命中的哈希表項。[0010]結合第一方面或其上述實現方式的任一種,在第一方面的另一種實現方式中,所述訪問請求包括寫請求,所述訪問請求中還包括待寫入的數據,所述第一訪問模塊具體用于:當所述哈希表緩存中存在命中的哈希表項時,將所述待寫入的數據寫入所述哈希表緩存中的命中的哈希表項所在緩存行的data字段。[0011]結合第一方面或其上述實現方式的任一種,在第一方面的另一種實現方式中,所述訪問請求包括讀請求,所述第一訪問模塊具體用于:當所述哈希表緩存中存在命中的哈希表項時,讀取所述哈希表緩存中的命中的哈希表項所在緩存行的data字段的內容。[0012]結合第一方面或其上述實現方式的任一種,在第一方面的另一種實現方式中,還包括:第二訪問模塊,用于當所述第二確定模塊確定所述哈希表緩存中不存在命中的哈希表項時,根據所述目標哈希地址訪問所述內存中的哈希表項。[0013]結合第一方面或其上述實現方式的任一種,在第一方面的另一種實現方式中,所述第二訪問模塊具體用于:當所述哈希表緩存中不存在命中的哈希表項時,將當前正在執(zhí)行的訪問請求的下一條指令的地址寫入地址寄存器,并跳轉至用于訪問內存的指令所在的地址,其中,所述地址寄存器位于所述處理器中,用于存儲所述處理器執(zhí)行的指令的地址;根據所述訪問內存的指令,訪問所述內存;所述第二訪問模塊還用于:當所述內存訪問完畢之后,跳轉回所述地址寄存器中記錄的所述下一條指令的地址,并執(zhí)行所述下一條指令。[0014]第二方面,提供一種訪問哈希表的方法,所述方法包括:獲取訪問請求,所述訪問請求包括關鍵字;根據所述關鍵字,確定目標哈希地址;根據所述目標哈希地址,確定所述哈希表緩存中是否存在命中的哈希表項,所述哈希表緩存位于通用的處理器中,且所述哈希表緩存專門用于緩存內存中的哈希表的至少部分哈希表項,其中,所述哈希表緩存的每個緩存行用于緩存所述哈希表的一個哈希表項;當所述哈希表緩存中存在命中的哈希表項時,訪問所述哈希表緩存中命中的哈希表項。[0015]結合第二方面,在第二方面的一種實現方式中,所述哈希表緩存包括主哈希表緩存和公共沖突緩存,所述公共沖突緩存用于存放所述至少部分哈希表項中的沖突表項,所述根據所述目標哈希地址,確定所述哈希表緩存中是否存在命中的哈希表項,包括:根據所述目標哈希地址,確定所述主哈希表緩存中是否存在命中的哈希表項;和/或根據所述目標哈希地址,確定所述公共沖突緩存中是否存在命中的哈希表項。[0016]結合第二方面或其上述實現方式的任一種,在第二方面的另一種實現方式中,所述主哈希表緩存包括N路緩存,所述N路緩存之間組相連,其中所述N路緩存中的每個緩存行的tag字段包括:第一字段和第二字段,所述每個緩存行的第一字段為所述每個緩存行存儲的哈希表項對應的哈希地址的高位字段,所述每個緩存行的第二字段為所述每個緩存行存儲的哈希表項對應的關鍵字,所述根據所述目標哈希地址,確定所述主哈希表緩存中是否存在命中的哈希表項,包括:以所述目標哈希地址的低位字段為索引,從所述N路緩存中的每路緩存中選出對應的緩存行,得到N個緩存行;將所述N個緩存行中的每個緩存行的第一字段與所述目標哈希地址的高位字段進行比較;當所述N個緩存行中的每個緩存行的第一字段與所述目標哈希地址的高位字段均不相同時,確定所述主哈希表緩存中不存在命中的哈希表項;當所述N個緩存行中存在第一字段與所述目標哈希地址的高位字段相同的目標緩存行時,比較所述目標緩存行的第二字段與所述訪問請求包括的關鍵字是否相同;當所述目標緩存行的第二字段與所述訪問請求包括的關鍵字相同時,確定所述主哈希表緩存中存在命中的哈希表項;當所述目標緩存行的第二字段與所述訪問請求包括的關鍵字不相同時,確定所述主哈希表緩存中不存在命中的哈希表項。[0017]結合第二方面或其上述實現方式的任一種,在第二方面的另一種實現方式中,所述公共沖突緩存包括全相連結構,所述公共沖突緩存的緩存行的tag字段包括第三字段和第四字段,所述第三字段為所述公共沖突緩存的緩存行存儲的哈希表項對應的哈希地址,所述第四字段為所述公共沖突緩存的緩存行存儲的哈希表項對應的關鍵字,所述根據所述目標哈希地址,確定所述公共沖突緩存中是否存在命中的哈希表項,包括:比較所述目標哈希地址與所述公共沖突緩存中的每個緩存行的tag字段;當所述公共沖突緩存中各緩存行的tag字段與所述目標哈希地址均不相同時,確定所述公共沖突緩存中不存在命中的哈希表項;當所述公共沖突緩存中存在tag字段與所述目標哈希地址相同的目標緩存行時,比較所述目標緩存行的第四字段與所述訪問請求包括的關鍵當前第1頁1 2 3 4 5