一種進程間共享數據的方法、裝置及終端的制作方法
【專利摘要】本申請公開一種進程間共享數據的方法、裝置及終端,本申請將虛擬i/o設備分別映射至第一進程和第二進程的虛擬地址空間中,第一目標地址空間和第二目標地址空間相同;若第一進程需要共享數據,第一進程向操作系統傳輸內存分配請求,操作系統分配內存塊,將內存塊映射到第一目標地址空間,將內存塊的信息和第一目標地址空間的第一地址段與內存塊的映射關系存儲至頁表管理模塊中。第二進程訪問第一地址段中的虛擬地址,觸發操作系統產生訪問異常,指示虛擬i/o設備執行異常處理例程,將內存塊映射至所述第二進程,以便第二進程能夠訪問內存塊。本申請不需要預先分配共享內存,而在需要共享數據時,才由第一進程觸發系統分配內存塊,提高內存的利用效率。
【專利說明】
一種進程間共享數據的方法、裝置及終端
技術領域
[0001]本申請涉及共享內存技術領域,尤其涉及一種進程間共享數據的方法、裝置及終端。
【背景技術】
[0002]現有的操作系統經常需要多個進程并行完成工作,每個進程都無法直接獲取其他進程中的數據,因此通常利用共享內存實現不同進程之間的數據共享。
[0003]在傳統技術中,如果利用共享內存實現不同進程之間的數據共享,需要預先分配多個進程均可訪問的內存,即共享內存,當不同進程間需要共享數據時,由其中一個進程將需要共享的數據存儲至所述共享內存中,其他各個進程可通過訪問所述共享內存,獲取需要共享的數據。其中,分配共享內存的方法通常包括以下步驟:首先,選擇其中一個進程作為第一進程,由第一進程向系統申請一個內存塊,并將該內存塊映射到所述第一進程的虛擬地址空間中;然后,第一進程向其他各個進程發送映射通知,所述映射通知中包含有所述內存塊的地址和大小等信息;其他各個進程通過解析所述映射通知,獲取其中包含的信息,并將該內存塊映射到各個進程的虛擬地址空間中,完成分配。映射指的是,將內存或者設備寄存器等和地址關聯起來的動作。上述將內存塊映射到進程的虛擬地址空間,需要預先由操作系統通過內存控制器為內存塊配置一個虛擬地址,并建立所述內存塊的虛擬地址與該內存塊的物理地址轉換的表項,該表項通常被稱為TLB (Translat1n Look-aside Buffer,轉換后援緩沖器)表項,然后,建立所述內存塊的虛擬地址和進程的虛擬地址之間的關聯,從而完成內存塊到進程的虛擬地址空間的映射。在內存塊映射到進程的虛擬地址空間后,進程可通過所述TLB表項,以及該內存塊的虛擬地址和進程的虛擬地址之間的關聯,確定所述內存塊的物理地址,根據該物理地址實現對所述內存塊的訪問。內存分配完成后,所述內存塊成為共享內存。若其中一個進程向共享內存中存入數據,該進程會向其他各個進程發送共享通知,其他各個進程接收到所述共享通知后,若需要獲取所述數據,則可通過訪問共享內存,獲取所述共享內存中的數據,實現數據在進程間的共享。
[0004]通過上述方法,能夠通過共享內存實現不同進程之間的數據共享。但是,發明人發現,上述實現不同進程間數據共享的方法,共享內存需要預先創建,難以實時調整大小,而創建后的共享內存往往存在過大或過小的問題,不符合進程共享數據的需求,導致內存資源的使用效率低。例如,若預先創建的共享內存過大,會造成共享內存的浪費,甚至導致內存使用緊張;若預先創建的共享內存過小,則不能滿足進程共享數據的需求。
【發明內容】
[0005]本發明實施例提供了一種進程間共享數據的方法、裝置及終端,以一定程度上改善傳統技術中,通過共享內存實現不同進程之間的數據共享時,內存資源的使用效率低的問題。
[0006]為了解決上述技術問題,本發明實施例公開了如下技術方案:
[0007]根據本公開實施例的第一方面,提供一種進程間共享數據的方法,包括:
[0008]在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同;
[0009]將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0010]檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常;
[0011]基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0012]結合第一方面,在第一方面的第一種可能的實現方式中,在所述第二進程獲取所述內存塊中存儲的數據后,還包括:
[0013]將所述內存塊從所述第一目標地址空間中去映射;
[0014]將虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中;
[0015]或者,
[0016]將所述內存塊從所述第二進程的虛擬地址空間中去映射;
[0017]確定將所述內存塊映射至所述第二進程后,所述第二進程的虛擬地址空間中的第二地址段與所述內存塊存在映射關系,將虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。
[0018]結合第一方面,在第一方面的第二種可能的實現方式中,所述指示所述虛擬i/o設備執行異常處理例程之前,還包括:
[0019]判斷所述第二進程是否具備所述內存塊的訪問權限;
[0020]基于所述第二進程具備所述內存塊的訪問權限的判斷結果,再執行指示所述虛擬i/o設備執行異常處理例程的操作。
[0021]根據本公開實施例的第二方面,提供一種進程間共享數據的方法,應用于由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,所述進程間共享數據的方法包括:
[0022]接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0023]獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息;
[0024]根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0025]根據本公開實施例的第三方面,提供一種進程間共享數據的裝置,包括:
[0026]虛擬i/o設備映射模塊,用于在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同;
[0027]內存塊映射模塊,用于將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0028]訪問異常檢測模塊,用于檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常;
[0029]指示模塊,用于基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0030]結合第三方面,在第三方面的第一種可能的實現方式中,所述進程間共享數據的裝置還包括:
[0031]第一去映射模塊,用于將所述內存塊從所述第一目標地址空間中去映射;
[0032]第一映射模塊,用于將虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中;
[0033]或者,
[0034]第二去映射模塊,用于將所述內存塊從所述第二進程的虛擬地址空間中去映射;
[0035]第二映射模塊,用于確定將所述內存塊映射至所述第二進程后,所述第二進程的虛擬地址空間中的第二地址段與所述內存塊存在映射關系,將虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。
[0036]結合第三方面,在第三方面的第二種可能的實現方式中,所述進程間共享數據的裝置還包括:
[0037]判斷模塊,用于指示所述虛擬i/o設備執行異常處理例程之前,判斷所述第二進程是否具備所述內存塊的訪問權限;
[0038]所述指示模塊還用于,基于所述第二進程具備所述內存塊的訪問權限的判斷結果,再執行指示所述虛擬i/o設備執行異常處理例程的操作。
[0039]根據本公開實施例的第四方面,提供一種進程間共享數據的裝置,其特征在于,應用于由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,所述進程間共享數據的裝置包括:
[0040]指示接收模塊,用于接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0041]內存塊信息獲取模塊,用于獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息;
[0042]第二進程映射模塊,用于根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0043]根據本公開實施例的第五方面,提供一種終端,包括:處理器、存儲器和總線,其中,
[0044]所述處理器通過總線,與所述存儲器相連接;
[0045]所述存儲器,用于存儲進程間共享數據的方法的程序代碼;
[0046]所述處理器,用于獲取所述存儲器中存儲的程序代碼,并根據所述程序代碼執行以下操作:
[0047]在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同;
[0048]將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0049]檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常;
[0050]基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0051]根據本公開實施例的第六方面,提供一種終端,包括:處理器、存儲器和總線,其中,
[0052]所述處理器通過總線,與所述存儲器相連接;
[0053]所述存儲器,用于存儲進程間共享數據的方法的程序代碼;
[0054]所述處理器,用于獲取所述存儲器中存儲的程序代碼,并根據所述程序代碼執行以下操作:
[0055]生成由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,
[0056]所述虛擬i/o設備接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0057]所述虛擬i/o設備獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息;
[0058]所述虛擬i/o設備根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0059]本申請公開一種進程間共享數據的方法、裝置及終端,本申請中,預先由操作系統創建虛擬i/o設備,并且將虛擬i/o設備分別映射至第一進程的虛擬地址空間和第二進程的虛擬地址空間中,并且所述虛擬i/o設備占用的第一目標地址空間和第二目標地址空間相同。當第一進程需要共享數據時,所述第一進程向所述操作系統傳輸內存分配請求,所述操作系統根據所述內存分配請求分配內存塊,并將所述內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中。若第二進程需要獲取所述內存塊中存儲的數據,所述第二進程會訪問所述第一地址段中的虛擬地址,觸發所述操作系統產生訪問異常。若所述操作系統產生訪問異常,會指示所述虛擬i/o設備執行異常處理例程,從而將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據,該內存塊即成為共享內存。
[0060]本申請公開方案,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發操作系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
【附圖說明】
[0061]為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動性的前提下,還可以根據這些附圖獲得其它的附圖。
[0062]圖1為本發明公開的一種進程間共享數據的方法的實施例流程圖;
[0063]圖2為本發明公開的一種進程間共享數據的方法中,進程將虛擬i/o設備映射至自身的地址空間后,進程的虛擬地址空間的示意圖;
[0064]圖3為本發明公開的一種進程間共享數據的方法中,在將內存塊映射到第一進程的虛擬i/o設備占用的地址空間后,第一進程的虛擬地址空間的示意圖;
[0065]圖4為本發明公開的一種進程間共享數據的方法中,在第二進程中映射內存塊后,第一進程的虛擬地址空間和第二進程的虛擬地址空間的示意圖;
[0066]圖5為本發明公開的一種進程間共享數據的方法中,第一進程和第二進程對內存塊去映射后,第一進程和第二進程的地址空間的示意圖;
[0067]圖6為本發明公開的又一種進程間共享數據的方法的實施例流程圖;
[0068]圖7為本發明公開的一種進程間共享數據的裝置的結構示意圖;
[0069]圖8為本發明公開的又一種進程間共享數據的裝置的結構示意圖;
[0070]圖9為本發明公開的一種終端的結構示意圖;
[0071]圖10為本發明公開的又一種終端的結構示意圖。
【具體實施方式】
[0072]本申請實施例提供一種進程間共享數據的方法、裝置及終端,以一定程度上改善傳統技術中,通過共享內存實現不同進程之間的數據共享時,內存資源的使用效率低的問題。
[0073]為了使本領域的技術人員更好地理解本發明實施例中的技術方案,并使本發明實施例的上述目的、特征和優點能夠更加明顯易懂,下面結合附圖對本發明實施例中技術方案作進一步詳細的說明。
[0074]本申請公開一種進程間共享數據的方法,應用該方法的操作系統中的CPU讀取多個應用程序的程序代碼,生成多個進程,其中,所述程序代碼存儲在存儲器中,并且,至少有兩個進程之間有共享數據的需求。本申請中,為簡明起見,僅以兩個進程(即第一進程和第二進程)為例進行說明。
[0075]操作系統除了能夠生成多個進程,還創建了虛擬i/o設備和頁表管理模塊。其中,所述虛擬i/o設備為一個虛擬的設備驅動模塊,所述頁表管理模塊用于存儲系統分配的各個內存塊的信息等。
[0076]參見圖1所示的工作流程示意圖,本申請公開的進程間共享數據的方法包括:
[0077]步驟S11、在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同。
[0078]虛擬i/o設備為一個虛擬的設備驅動模塊,將虛擬i/o設備映射到進程的虛擬地址空間,指的是將虛擬i/o設備與進程的虛擬地址空間中的一個地址段關聯起來,建立所述虛擬i/o設備與該地址段的映射關系,所述映射關系通常存儲至頁表管理模塊中。其中,所述進程的虛擬地址空間中,與所述虛擬i/o設備存在映射關系的地址段,指的是所述虛擬i/o設備占用的虛擬地址空間。
[0079]參見圖2,圖2為將虛擬i/o設備映射至所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間后,第一進程的虛擬地址空間和第二進程的虛擬地址空間的示意圖。在將所述虛擬i/o設備映射到第一進程的虛擬地址空間和第二進程的虛擬地址空間中時,通常會將所述虛擬i/o設備所占用的虛擬地址空間,設置為所述第一進程和第二進程最大可能使用的共享內存的虛擬地址空間。例如,預先設定所述第一進程最大可能使用IGigabyte的共享內存,則所述第一進程會將虛擬i/o設備映射到IGigabyte的虛擬地址空間中。
[0080]另外,在本申請中,第一目標地址空間和第二目標地址空間相同,指的是所述虛擬i/o設備在第一進程中占用的虛擬地址空間,和所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間相同。例如,虛擬i/o設備與第一進程的虛擬地址空間中(0x00100000,OxOOBOOOOO)這一地址段存在映射關系,則所述虛擬i/o設備在第二進程的虛擬地址空間中占用的地址段也為(0x00100000,OxOOBOOOOO),也就是說,所述虛擬i/o設備與第二進程的虛擬地址空間中(0x00100000,OxOOBOOOOO)這一地址段也存在映射關系。
[0081]步驟S12、將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據。
[0082]當需要共享數據時,第一進程會觸發操作系統,操作系統根據所述第一進程的觸發,為所述第一進程分配內存塊。在將所述內存塊映射到所述第一目標地址空間之后,第一進程則可以向所述內存塊中寫入數據。
[0083]在將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間后,所述第一進程的虛擬地址空間的示意圖如圖3所示,該圖中,假設操作系統為所述第一進程分配的內存塊為第二個內存塊,并且,將所述第二個內存塊映射到所述第一目標地址空間中。
[0084]另外,需要將所述內存塊的信息存儲至操作系統預先創建的頁表管理模塊中。其中,所述內存塊的信息包括:所述內存塊的地址和大小,所述內存塊的地址可以為所述內存塊的起始地址,或者,為所述內存塊的開始地址或結束地址,并且,所述內存塊的地址包括虛擬地址和物理地址兩種類型。
[0085]步驟S13、檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常。
[0086]虛擬i/o設備為一個虛擬的設備驅動模塊,若將虛擬i/o設備映射到進程的虛擬地址空間中,并不會占用實際的內存。若虛擬i/o設備映射的某一進程的虛擬地址空間沒有對應實際的內存頁面,該進程在訪問所述虛擬i/o設備映射的所述虛擬地址空間時,操作系統會產生訪問異常。
[0087]在步驟S12中,將所述內存塊映射至第一目標地址空間中,并且,所述第一目標地址空間中的第一地址段與所述內存塊存在映射關系。所述內存塊中存儲有所述第一進程寫入的數據之后,若第二進程需要共享該數據,則所述第二進程需要訪問所述第一地址段中的虛擬地址。
[0088]其中,所述第二進程可通過多種方式獲取所述第一地址段這一虛擬地址。在其中一種方式中,所述第一進程將需要共享的數據存儲至所述內存塊后,產生通知信息,所述通知信息中包含與所述內存塊存在映射關系的虛擬地址,即第一地址段,并且,所述第一進程直接將所述通知信息傳輸給第二進程,或通過其他進程將所述通知信息轉發給第二進程。所述第二進程接收到所述通知信息后,對所述通知信息進行解析,即可獲取所述第一地址段。
[0089]在另外一種方式中,通過對操作系統的預先操作,為操作系統中分布的各個內存塊設置相應次序,操作系統根據該次序依次為第一進程分配內存塊。例如,在上一次共享數據時,已經為所述第一進程分配了第一內存塊,那么本次在進程間共享數據時,操作系統在所述第一進程的觸發下,會為所述第一進程分配第二內存塊,這種情況下,第二進程能夠根據該次序,確定本次操作分配的是第二內存塊,進而根據預先存儲的映射關系,確定與所述第二內存塊具有映射關系的地址段,即第一地址段。
[0090]當然,所述第二進程還可以通過其他方式確定所述第一地址段,以訪問所述第一地址段在第二進程中占用的虛擬地址空間,本申請對此不作限定。
[0091]第二進程訪問所述第一地址段中的虛擬地址時,由于所述第二進程預先并未將與所述第一地址段具備映射關系的內存塊與實際的物理頁面建立映射,操作系統會產生訪問異常。
[0092]步驟S14、基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0093]第二進程訪問所述第一地址段中的虛擬地址時,操作系統會產生訪問異常,并且產生訪問異常的虛擬地址為所述第一地址段在所述第二進程的虛擬地址空間中占用的虛擬地址。由于在本申請中,第一目標地址空間和第二目標地址空間相同,并且,所述第一地址段在所述第一進程中占用的虛擬地址屬于所述第一目標地址空間,則所述第一地址段在所述第二進程中占用的虛擬地址屬于所述第二目標地址空間,而所述第二目標地址空間為所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間,因此,操作系統會調用虛擬i/o設備的異常處理接口,指示所述虛擬i/o設備執行異常處理例程。
[0094]在操作系統的指示下,所述虛擬i/o設備會執行異常處理例程。通過所述虛擬i/ο設備執行的異常處理例程,能夠將所述內存塊映射至所述第二進程。在映射完成后,所述第二進程能夠訪問所述內存塊,該內存塊即成為共享內存,所述第二進程通過訪問該共享內存,能夠獲取第一進程在所述內存塊中存儲的數據。
[0095]所述虛擬i/o設備執行異常處理例程,將內存塊映射至第二進程的過程,可稱為缺頁中斷,所述虛擬i/o設備執行的操作對所述第二進程的執行流程來說是透明的。在內存塊映射至第二進程之后,所述第一進程的虛擬地址空間和第二進程的虛擬地址空間的示意圖如圖4所示。
[0096]上述步驟Sll至步驟S14公開一種進程間共享數據的方法,該方法中,預先由操作系統創建虛擬i/o設備,并且將虛擬i/o設備分別映射至第一進程的虛擬地址空間和第二進程的虛擬地址空間中,其中所述虛擬i/o設備占用的第一目標地址空間和第二目標地址空間相同。當第一進程需要共享數據時,所述第一進程向所述操作系統傳輸內存分配請求,所述操作系統根據所述內存分配請求分配內存塊,將所述內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中。若第二進程需要獲取所述內存塊中存儲的數據,所述第二進程會訪問所述第一地址段中的虛擬地址,觸發所述操作系統產生訪問異常。若所述操作系統產生訪問異常,會指示所述虛擬i/o設備執行異常處理例程,從而將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據,該內存塊即成為共享內存。
[0097]本申請公開的進程間共享數據的方法,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發操作系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
[0098]進一步的,本申請公開的進程間共享數據的方法還包括:
[0099]在所述第二進程獲取所述內存塊中存儲的數據后,將所述內存塊從所述第一目標地址空間中去映射;
[0100]將虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中。
[0101]若第一進程不再需要訪問所述內存塊,可將所述內存塊從所述第一目標地址空間中去映射。在去映射之前,所述第一目標地址空間中的第一地址段與所述內存塊存在映射關系,而在去映射之后,所述第一地址段與所述內存塊不再存在映射關系,并且,所述第一地址段也未與虛擬i/o設備建立映射,這種情況下,需要將所述虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中。
[0102]或者,在所述第二進程獲取所述內存塊中存儲的數據后,將所述內存塊從所述第二進程的虛擬地址空間中去映射;
[0103]確定將所述內存塊映射至所述第二進程后,所述第二進程的虛擬地址空間中的第二地址段與所述內存塊存在映射關系,將虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。
[0104]若第二進程不再需要訪問所述內存塊,可將所述內存塊從所述第二目標地址空間中去映射。在去映射之前,所述第二目標地址空間中的第二地址段與所述內存塊存在映射關系,而在去映射之后,所述第二地址段與所述內存塊不再存在映射關系,并且,所述第二地址段也未與虛擬i/o設備建立映射,這種情況下,需要將所述虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。
[0105]在第一進程和第二進程不再需要訪問內存塊時,可將所述內存塊從占用的虛擬地址空間中去映射,并將所述虛擬i/o設備映射至去映射前與所述內存塊存在映射關系的地址段所指示的虛擬空間中。在將所述虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間,并且,在將所述虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間后,所述第一進程的虛擬地址空間和第二進程的虛擬地址空間如圖5所示,從而便于下次在進程間共享數據時,由操作系統重新為第一進程分配內存塊,并將重新分配的內存塊映射至第一目標地址空間中。
[0106]另外,在去映射后,該內存塊不再作為共享內存,該內存塊被歸還所述操作系統,所述操作系統可通過該內存塊執行其他操作。
[0107]進一步的,為了提高操作系統的穩定性,操作系統可預先為各個進程分配相應的訪問權限。這種情況下,在指示所述虛擬i/o設備執行異常處理例程之前,本申請公開的進程間共享數據的方法還包括:
[0108]判斷所述第二進程是否具備所述內存塊的訪問權限;
[0109]基于所述第二進程具備所述內存塊的訪問權限的判斷結果,再執行指示所述虛擬i/o設備執行異常處理例程的操作。
[0110]操作系統在分配內存塊后,會存儲所述內存塊的相關信息,所述相關信息中包含有各個進程針對所述內存塊的訪問權限。其中,所述相關信息通常被存儲至所述操作系統預先創建的頁表管理模塊中。在產生訪問異常后,可通過查詢所述相關信息,判斷所述第二進程是否具備所述內存塊的訪問權限。
[0111]若通過判斷結果,確定所述第二進程不具備所述內存塊的訪問權限,則不再指示所述虛擬i/o設備執行異常處理例程。只有在確定所述第二進程具備所述內存塊的訪問權限的情況下,才指示所述虛擬i/o設備執行異常處理例程的操作,從而提高了操作系統的穩定性。
[0112]相應的,本申請還公開了一種進程間共享數據的方法,該方法應用于由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同。其中,創建所述虛擬i/o設備的操作系統中的CPU通過讀取多個應用程序的程序代碼,生成多個進程,所述程序代碼存儲在存儲器中,并且,至少有兩個進程之間有共享數據的需求。本申請中,為簡明起見,僅以兩個進程(即第一進程和第二進程)為例進行說明。
[0113]所述操作系統除了創建虛擬i/o設備以外,還創建了頁表管理模塊。其中,所述虛擬i/o設備為一個虛擬的設備驅動模塊,所述頁表管理模塊用于存儲系統分配的各個內存塊的信息。
[0114]參見圖6所示的工作流程示意圖,所述進程間共享數據的方法包括:
[0115]步驟S21、接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據。
[0116]步驟S22、獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息。
[0117]步驟S23、根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0118]本申請公開的進程間共享數據的方法中,在第一進程和第二進程初始化的過程中,會將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中。設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同。當第一進程需要向第二進程共享數據時,第一進程會觸發操作系統,操作系統根據所述第一進程的觸發,為所述第一進程分配內存塊。然后,將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊用于存儲被所述第一進程寫入的數據。第二進程在需要獲取所述內存塊中存儲的數據時,會訪問所述第一地址段中的虛擬地址,由于所述第二進程預先并未將與所述第一地址段具備映射關系的內存塊與實際的物理頁面建立映射,操作系統會產生訪問異常。
[0119]所述操作系統在產生訪問異常時,產生訪問異常的虛擬地址為所述第一地址段在所述第二進程的虛擬地址空間中占用的虛擬地址。由于在本申請中,第一目標地址空間和第二目標地址空間相同,并且,所述第一地址段在所述第一進程中占用的虛擬地址屬于所述第一目標地址空間,則所述第一地址段在所述第二進程中占用的虛擬地址屬于所述第二目標地址空間,而所述第二目標地址空間為所述虛擬i/o設備再所述第二進程中占用的虛擬地址空間,因此,操作系統會調用虛擬i/o設備的異常處理接口,指示所述虛擬i/o設備執行異常處理例程。
[0120]在操作系統的指示下,所述虛擬i/o設備會執行異常處理例程。所述虛擬i/o設備執行的異常處理例程包括:所述虛擬i/o設備獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息和所述映射關系,獲取所述內存塊的信息;然后,根據所述內存塊的信息,將所述內存塊映射至所述第二進程。
[0121]通過所述虛擬i/o設備執行的異常處理例程,能夠將所述內存塊映射至所述第二進程。在映射完成后,所述第二進程能夠訪問所述內存塊,該內存塊即成為共享內存,所述第二進程通過訪問該共享內存,能夠獲取第一進程在所述內存塊中存儲的數據。
[0122]本申請公開的進程間共享數據的方法,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發操作系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
[0123]相應的,本申請還公開一種進程間共享數據的裝置。參見圖7所示的結構示意圖,所述進程間共享數據的裝置包括:虛擬i/o設備映射模塊101、內存塊映射模塊102、訪問異常檢測模塊103和指示模塊104。
[0124]其中,所述虛擬i/o設備映射模塊101,用于在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/ο設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同;
[0125]所述內存塊映射模塊102,用于將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0126]所述訪問異常檢測模塊103,用于檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常;
[0127]所述指示模塊104,用于基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0128]進一步的,所述進程間共享數據的裝置還包括:
[0129]第一去映射模塊,用于將所述內存塊從所述第一目標地址空間中去映射;
[0130]第一映射模塊,用于將虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中;
[0131]或者,
[0132]第二去映射模塊,用于將所述內存塊從所述第二進程的虛擬地址空間中去映射;
[0133]第二映射模塊,用于確定將所述內存塊映射至所述第二進程后,所述第二進程的虛擬地址空間中的第二地址段與所述內存塊存在映射關系,將虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。
[0134]進一步的,所述進程間共享數據的裝置還包括:
[0135]判斷模塊,用于指示所述虛擬i/o設備執行異常處理例程之前,判斷所述第二進程是否具備所述內存塊的訪問權限;
[0136]所述指示模塊還用于,基于所述第二進程具備所述內存塊的訪問權限的判斷結果,再執行指示所述虛擬i/o設備執行異常處理例程的操作。
[0137]本申請公開的裝置,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
[0138]相應的,本申請還公開一種進程間共享數據的裝置,應用于由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,參見圖8所示的結構示意圖,所述進程間共享數據的裝置包括:指示接收模塊201、內存塊信息獲取模塊202和第二進程映射模塊203。
[0139]其中,所述指示接收模塊201,用于接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;其中,操作系統在將為所述第一進程分配的內存塊映射到第一目標地址空間中時,會建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系。
[0140]所述內存塊信息獲取模塊202,用于獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息;
[0141]所述第二進程映射模塊203,用于根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0142]本申請公開的裝置,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
[0143]本申請還公開一種終端,參見圖9所示的結構示意圖,所述終端包括:處理器11、存儲器12和總線13,其中,
[0144]所述處理器11通過總線13,與所述存儲器12相連接;
[0145]所述存儲器12,用于存儲進程間共享數據的方法的程序代碼;
[0146]所述處理器11,用于獲取所述存儲器12中存儲的程序代碼,并根據所述程序代碼執行以下操作:
[0147]在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同;
[0148]將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0149]檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常;
[0150]基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0151]本申請公開的上述終端中,存在的操作系統中的CPU讀取多個應用程序的程序代碼,生成多個進程,其中,所述程序代碼存儲在存儲器中,并且,至少有兩個進程之間有共享數據的需求。本申請中,為簡明起見,僅以兩個進程(即第一進程和第二進程)為例進行說明。
[0152]操作系統除了能夠生成多個進程,還創建了虛擬i/o設備和頁表管理模塊。其中,所述虛擬i/o設備為一個虛擬的設備驅動模塊,所述頁表管理模塊用于存儲系統分配的各個內存塊的信息。
[0153]本申請公開的終端在進程間共享數據時,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發操作系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
[0154]相應的,本申請還公開一種終端,參見圖10所示的結構示意圖,所述終端包括:處理器21、存儲器22和總線23,其中,
[0155]所述處理器21通過總線23,與所述存儲器22相連接;
[0156]所述存儲器22,用于存儲進程間共享數據的方法的程序代碼;
[0157]所述處理器23,用于獲取所述存儲器22中存儲的程序代碼,并根據所述程序代碼執行以下操作:
[0158]生成由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,
[0159]所述虛擬i/o設備接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據;
[0160]所述虛擬i/o設備獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息;
[0161]所述虛擬i/o設備根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
[0162]本申請公開的上述終端中,存在的操作系統中的CPU讀取多個應用程序的程序代碼,生成多個進程,其中,所述程序代碼存儲在存儲器中,并且,至少有兩個進程之間有共享數據的需求。本申請中,為簡明起見,僅以兩個進程(即第一進程和第二進程)為例進行說明。
[0163]操作系統除了能夠生成多個進程,還創建了虛擬i/o設備和頁表管理模塊。其中,所述虛擬i/o設備為一個虛擬的設備驅動模塊,所述頁表管理模塊用于存儲系統分配的各個內存塊的信息。
[0164]本申請公開的終端在進程間共享數據時,不需要預先分配共享內存,而是在需要共享數據時,才由第一進程觸發操作系統分配內存塊,實現動態分配共享內存,該分配共享內存的方法用時短,便于根據共享數據的需求,實時迅速的調整共享內存的大小,提高內存的利用效率。
[0165]本領域的技術人員可以清楚地了解到本發明實施例中的技術可借助軟件加必需的通用硬件平臺的方式來實現。基于這樣的理解,本發明實施例中的技術方案可以以軟件產品的形式體現出來,該計算機軟件產品可以存儲在存儲介質中,如只讀存儲器(英文:read-only memory,縮寫:R0M)、隨機存取存儲器(英文:random access memory,縮寫:RAM)、磁碟、光盤等,包括若干指令用以使得處理器執行本發明實施例或者實施例的某些部分所述的方法。
[0166]本說明書中的各個實施例均采用遞進的方式描述,各個實施例之間相同相似的部分互相參見即可,每個實施例重點說明的都是與其它實施例的不同之處。尤其,對于系統實施例而言,由于其基本相似于方法實施例,所以描述的比較簡單,相關之處參見方法實施例的部分說明即可。
[0167]應當理解的是,本發明并不局限于上面已經描述并在附圖中示出的精確結構,并且可以在不脫離其范圍進行各種修改和改變。本發明的范圍僅由所附的權利要求來限制。
【主權項】
1.一種進程間共享數據的方法,其特征在于,包括: 在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同; 將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據; 檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常; 基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。2.根據權利要求1所述的方法,其特征在于,在所述第二進程獲取所述內存塊中存儲的數據后,還包括: 將所述內存塊從所述第一目標地址空間中去映射; 將虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中; 或者, 將所述內存塊從所述第二進程的虛擬地址空間中去映射; 確定將所述內存塊映射至所述第二進程后,所述第二進程的虛擬地址空間中的第二地址段與所述內存塊存在映射關系,將虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。3.根據權利要求1所述的方法,其特征在于,所述指示所述虛擬i/o設備執行異常處理例程之前,還包括: 判斷所述第二進程是否具備所述內存塊的訪問權限; 基于所述第二進程具備所述內存塊的訪問權限的判斷結果,再執行指示所述虛擬i/o設備執行異常處理例程的操作。4.一種進程間共享數據的方法,其特征在于,應用于由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,所述進程間共享數據的方法包括: 接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據; 獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息; 根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。5.一種進程間共享數據的裝置,其特征在于,包括: 虛擬i/o設備映射模塊,用于在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同; 內存塊映射模塊,用于將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據; 訪問異常檢測模塊,用于檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常; 指示模塊,用于基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。6.根據權利要求1所述的方法,其特征在于,所述進程間共享數據的裝置還包括: 第一去映射模塊,用于將所述內存塊從所述第一目標地址空間中去映射; 第一映射模塊,用于將虛擬i/o設備映射至所述第一地址段指示的虛擬地址空間中; 或者, 第二去映射模塊,用于將所述內存塊從所述第二進程的虛擬地址空間中去映射;第二映射模塊,用于確定將所述內存塊映射至所述第二進程后,所述第二進程的虛擬地址空間中的第二地址段與所述內存塊存在映射關系,將虛擬i/o設備映射至所述第二地址段指示的虛擬地址空間中。7.根據權利要求5所述的裝置,其特征在于,所述進程間共享數據的裝置還包括: 判斷模塊,用于指示所述虛擬i/o設備執行異常處理例程之前,判斷所述第二進程是否具備所述內存塊的訪問權限; 所述指示模塊還用于,基于所述第二進程具備所述內存塊的訪問權限的判斷結果,再執行指示所述虛擬i/o設備執行異常處理例程的操作。8.—種進程間共享數據的裝置,其特征在于,應用于由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同,所述進程間共享數據的裝置包括: 指示接收模塊,用于接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據; 內存塊信息獲取模塊,用于獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息; 第二進程映射模塊,用于根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。9.一種終端,其特征在于,包括:處理器、存儲器和總線,其中, 所述處理器通過總線,與所述存儲器相連接; 所述存儲器,用于存儲進程間共享數據的方法的程序代碼; 所述處理器,用于獲取所述存儲器中存儲的程序代碼,并根據所述程序代碼執行以下操作: 在第一進程和第二進程初始化的過程中,將操作系統創建的虛擬i/o設備分別映射到所述第一進程的虛擬地址空間和所述第二進程的虛擬地址空間中,其中,所述第一進程和第二進程均運行于所述操作系統中,設定所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,所述第一目標地址空間和所述第二目標地址空間相同; 將所述操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中,建立所述內存塊與所述第一目標地址空間中的第一地址段的映射關系,并將所述內存塊的信息以及所述映射關系存儲至操作系統預先創建的頁表管理模塊中,其中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據; 檢測所述操作系統是否產生訪問異常,其中,所述第二進程訪問所述第一地址段中的虛擬地址時,觸發所述操作系統產生訪問異常; 基于所述操作系統產生訪問異常的檢測結果,指示所述虛擬i/o設備執行異常處理例程,所述異常處理例程包括:獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息,根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。10.一種終端,其特征在于,包括:處理器、存儲器和總線,其中, 所述處理器通過總線,與所述存儲器相連接; 所述存儲器,用于存儲進程間共享數據的方法的程序代碼; 所述處理器,用于獲取所述存儲器中存儲的程序代碼,并根據所述程序代碼執行以下操作: 生成由操作系統創建的虛擬i/o設備,所述虛擬i/o設備被分別映射至所述操作系統中第一進程的虛擬地址空間和第二進程的虛擬地址空間中,所述虛擬i/o設備在所述第一進程中占用的虛擬地址空間為第一目標地址空間,所述虛擬i/o設備在所述第二進程中占用的虛擬地址空間為第二目標地址空間,并且所述第一目標空間地址和第二目標空間地址相同, 所述虛擬i/o設備接收執行異常處理例程的指示,其中,所述指示是將操作系統為所述第一進程分配的內存塊映射到所述第一目標地址空間中后,若所述第二進程訪問第一地址段中的虛擬地址時,觸發操作系統指示虛擬i/o設備向所述虛擬i/o設備發送的;所述內存塊的信息,以及所述內存塊與所述第一目標地址空間中的第一地址段之間的映射關系被存儲至操作系統預先創建的頁表管理模塊中,所述內存塊是所述操作系統根據所述第一進程觸發的內存分配請求分配的,所述內存塊用于存儲所述第一進程需要共享的數據; 所述虛擬i/o設備獲取觸發所述操作系統產生訪問異常時,所述第二進程訪問的所述第一地址段的虛擬地址,并根據所述第一地址段的虛擬地址和所述頁表管理模塊中存儲的所述內存塊的信息以及所述映射關系,獲取所述內存塊的信息; 所述虛擬i/o設備根據所述內存塊的信息,將所述內存塊映射至所述第二進程,以便所述第二進程能夠訪問所述內存塊,獲取所述第一進程在所述內存塊中存儲的數據。
【文檔編號】G06F9/54GK105868028SQ201510037120
【公開日】2016年8月17日
【申請日】2015年1月23日
【發明人】李昶
【申請人】華為技術有限公司