欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Linux進(jìn)程間通信共享內存

Linux為共享內存提供了四種操作。

  1. 共享內存對象的創(chuàng )建或獲得。與其它兩種IPC機制一樣,進(jìn)程在使用共享內存區域以前,必須通過(guò)系統調用sys_ipc (call值為SHMGET)創(chuàng )建一個(gè)鍵值為key的共享內存對象,或獲得已經(jīng)存在的鍵值為key的某共享內存對象的引用標識符。以后對共享內存對象的訪(fǎng) 問(wèn)都通過(guò)該引用標識符進(jìn)行。對共享內存對象的創(chuàng )建或獲得由函數sys_shmget完成,其定義如下:

  int sys_shmget (key_t key, int size, int shmflg)

  這里key是表示該共享內存對象的鍵值,size是該共享內存區域的大?。ㄒ宰止潪閱挝唬?,shmflg是標志(對該共享內存對象的特殊要求)。

  它所做的工作如下:

  1) 如果key == IPC_PRIVATE,則創(chuàng )建一個(gè)新的共享內存對象。

  * 算出size對應的頁(yè)數,檢查其合法性。

  * 搜索向量表shm_segs,為新創(chuàng )建的共享內存對象找一個(gè)空位置。

  * 申請一塊內存用于建立shmid_kernel數據結構,注意這里申請的內存區域大小不包括真正的共享內存區,實(shí)際上,要等到第一個(gè)進(jìn)程試圖訪(fǎng)問(wèn)它的時(shí)候 才真正創(chuàng )建共享內存區。

  * 根據該共享內存區所占用的頁(yè)數,為其申請一塊空間用于建立頁(yè)表(每頁(yè)4個(gè)字節),將頁(yè)表清0。

  * 填寫(xiě)shmid_kernel數據結構,將其加入到向量表shm_segs中為其找到的空位置。

  * 返回該共享內存對象的引用標識符。

  2) 在向量表shm_segs中查找鍵值為key的共享內存對象,結果有三:

  * 如果沒(méi)有找到,而且在操作標志shmflg中沒(méi)有指明要創(chuàng )建新共享內存,則錯誤返回,否則創(chuàng )建一個(gè)新的共享內存對象。

  * 如果找到了,但該次操作要求必須創(chuàng )建一個(gè)鍵值為key的新對象,那么錯誤返回。

  * 否則,合法性、認證檢查,如有錯,則錯誤返回;否則,返回該內存對象的引用標識符。

  共享內存對象的創(chuàng )建者可以控制對于這塊內存的訪(fǎng)問(wèn)權限和它的key是公開(kāi)還是私有。如果有足夠的權限,它也可以把共享內存鎖定在物理內存中。

  參見(jiàn)include/linux/shm.h

  2. 粘附。在創(chuàng )建或獲得某個(gè)共享內存區域的引用標識符后,還必須將共享內存區域映射(粘附)到進(jìn)程的虛擬地址空間,然后才能使用該共享內存區域。系統調用 sys_ipc(call值為SHMAT)用于共享內存區到進(jìn)程虛擬地址空間的映射,而真正完成粘附動(dòng)作的是函數sys_shmat,其定義如下:

  int sys_shmat (int shmid, char *shmaddr, int shmflg, ulong *raddr)

  其中:shmid是共享內存對象的引用標識符;

  shmaddr該共享內存區域在進(jìn)程的虛擬地址空間對應的虛擬地址;

  shmflg是映射標志;

  raddr是實(shí)際映射的虛擬空間地址。

  該函數所做的工作如下:

  1) 根據shmid找到共享內存對象。

  2) 如果shmaddr為0,即用戶(hù)沒(méi)有指定該共享內存區域在它的虛擬空間中的位置,則由系統在進(jìn)程的虛擬地址空間中為其找一塊區域(從1G開(kāi)始);否則,就 用shmaddr作為映射的虛擬地址。

  3) 檢查虛擬地址的合法性(不能超過(guò)進(jìn)程的最大虛擬空間大小—3G,不能太接近堆棧棧頂)。

  4) 認證檢查。

  5) 申請一塊內存用于建立數據結構vm_area_struct,填寫(xiě)該結構。

  6) 檢查該內存區域,將其加入到進(jìn)程的mm結構和該共享內存對象的vm_area_struct隊列中。

  共享內存的粘附只是創(chuàng )建一個(gè)vm_area_struct數據結構,并將其加入到相應的隊列中,此時(shí)并沒(méi)有創(chuàng )建真正的共享內存頁(yè)。

  當進(jìn)程第一次訪(fǎng)問(wèn)共享虛擬內存的某頁(yè)時(shí),因為所有的共享內存頁(yè)還都沒(méi)有分配,所以會(huì )發(fā)生一個(gè)page fault異常。當Linux處理這個(gè)page fault的時(shí)候,它找到發(fā)生異常的虛擬地址所在的vm_area_struct數據結構。在該數據結構中包含有這類(lèi)共享虛擬內存的一組處理例程,其中的 nopage操作用來(lái)處理虛擬頁(yè)對應的物理頁(yè)不存在的情況。對共享內存,該操作是shm_nopage(定義在ipc/shm.c中)。該操作在描述這個(gè) 共享內存的shmid_kernel數據結構的頁(yè)表shm_pages中查找發(fā)生page fault異常的虛擬地址所對應的頁(yè)表條目,看共享頁(yè)是否存在(頁(yè)表條目為0,表示共享頁(yè)是第一次使用)。如果不存在,它就分配一個(gè)物理頁(yè),并為它創(chuàng )建一 個(gè)頁(yè)表條目。這個(gè)條目不但進(jìn)入當前進(jìn)程的頁(yè)表,同時(shí)也存到shmid_kernel數據結構的頁(yè)表shm_pages中。

  當下一個(gè)進(jìn)程試圖訪(fǎng)問(wèn)這塊內存并得到一個(gè)page fault的時(shí)候,經(jīng)過(guò)同樣的路徑,也會(huì )走到函數shm_nopage。此時(shí),該函數查看shmid_kernel數據結構的頁(yè)表shm_pages時(shí), 發(fā)現共享頁(yè)已經(jīng)存在,它只需把這里的頁(yè)表項填到進(jìn)程頁(yè)表的相應位置即可,而不需要重新創(chuàng )建物理頁(yè)。所以,是第一個(gè)訪(fǎng)問(wèn)共享內存頁(yè)的進(jìn)程使得這一頁(yè)被創(chuàng )建, 而隨后訪(fǎng)問(wèn)它的其它進(jìn)程僅把此頁(yè)加到它們的虛擬地址空間。

  3. 分離。當進(jìn)程不再需要共享虛擬內存的時(shí)候,它們與之分離(detach)。只要仍舊有其它進(jìn)程在使用這塊內存,這種分離就只會(huì )影響當前的進(jìn)程,而不會(huì )影響 其它進(jìn)程。當前進(jìn)程的vm_area_struct數據結構被從shmid_ds中刪除,并被釋放。當前進(jìn)程的頁(yè)表也被更新,共享內存對應的虛擬內存頁(yè)被 標記為無(wú)效。當共享這塊內存的最后一個(gè)進(jìn)程與之分離時(shí),共享內存頁(yè)被釋放,同時(shí),這塊共享內存的shmid_kernel數據結構也被釋放。

  系統調用sys_ipc(call值為SHMDT)用于共享內存區與進(jìn)程虛擬地址空間的分離,而真正完成分離動(dòng)作的是函數sys_shmdt,其定義如 下:

  int sys_shmdt (char *shmaddr)

  其中shmaddr是進(jìn)程要分離的共享頁(yè)的開(kāi)始虛擬地址。

  該函數搜索進(jìn)程的內存結構中的所有vm_area_struct數據結構,找到地址shmaddr對應的一個(gè),調用函數do_munmap將其釋放。

  在函數do_munmap中,將要釋放的vm_area_struct數據結構從進(jìn)程的虛擬內存中摘下,清除它在進(jìn)程頁(yè)表中對應的頁(yè)表項(可能占多個(gè)頁(yè)表 項),調用該共享內存數據結構vm_area_struct的操作例程中的close操作(此處為shm_close)做進(jìn)一步的處理。

  在函數shm_close(定義在ipc/shm.c中)中,找到該共享內存對象在向量表shm_segs中的索引,從而找到該共享內存對象,將該共享內 存在當前進(jìn)程中對應的vm_area_struct數據結構從對象的共享內存區域鏈表(由vm_next_share和vm_pprev_share指針 連接)中摘下。如果目前與該共享內存對象粘附的進(jìn)程數變成了0,則釋放共享內存頁(yè),釋放共享內存頁(yè)表,釋放該對象的shmid_kernel數據結構,將 向量表shm_segs中該共享內存對象所占用的項改為IPC_UNUSED。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Linux進(jìn)程間通信 共享內存 - 新聞中心 - 雷鍍教育
共享內存
進(jìn)程間通信(IPC):共享內存(shared memory)和信號量(semaphore)
linux進(jìn)程間共享內存通信詳解
LINUX共享內存使用常見(jiàn)陷阱與分析
共享內存函數(shmget、shmat、shmdt、shmctl)及其范例
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久