僅就顯存來說的話,后者好。
所謂的顯存共享內(nèi)存,就是說顯卡本身不帶多大的顯存,要用的時候跟內(nèi)存借。
共享內(nèi)存指在多處理器的計算機系統(tǒng)中,可以被不同中央處理器(CPU)訪問的大容量內(nèi)存。由于多個CPU需要快速訪問存儲器,這樣就要對存儲器進行緩存(Cache)。任何一個緩存的數(shù)據(jù)被更新后,由于其他處理器也可能要存取,共享內(nèi)存就需要立即更新,否則不同的處理器可能用到不同的數(shù)據(jù)。共享內(nèi)存(sharedmemory)是Unix下的多進程之間的通信方法,這種方法通常用于一個程序的多進程間通信,實際上多個程序間也可以通過共享內(nèi)存來傳遞信息。
共享內(nèi)存的創(chuàng)建
共享內(nèi)存是存在于內(nèi)核級別的一種資源,在shell中可以使用ipcs命令來查看當前系統(tǒng)IPC中的狀態(tài),在文件系統(tǒng)/proc目錄下有對其描述的相應文件。函數(shù)shmget可以創(chuàng)建或打開一塊共享內(nèi)存區(qū)。函數(shù)原型如下:#includesys/shm.hintshmget(key_tkey,size_tsize,intflag);函數(shù)中參數(shù)key用來變換成一個標識符,而且每一個IPC對象與一個key相對應。當新建一個共享內(nèi)存段時,size參數(shù)為要請求的內(nèi)存長度(以字節(jié)為單位)。注意:內(nèi)核是以頁為單位分配內(nèi)存,當size參數(shù)的值不是系統(tǒng)內(nèi)存頁長的整數(shù)倍時,系統(tǒng)會分配給進程最小的可以滿足size長的頁數(shù),但是最后一頁的剩余部分內(nèi)存是不可用的。當打開一個內(nèi)存段時,參數(shù)size的值為0。參數(shù)flag中的相應權限位初始化ipc_perm結構體中的mode域。同時參數(shù)flag是函數(shù)行為參數(shù),它指定一些當函數(shù)遇到阻塞或其他情況時應做出的反應。shmid_ds結構初始化如表14-4所示。
編輯本段初始化
shmid_ds結構數(shù)據(jù)初值shmid_ds結構數(shù)據(jù)初值
shm_lpid0shm_dtime0
shm_nattach0shm_ctime系統(tǒng)當前值
shm_atime0shm_segsz參數(shù)size
下面實例演示了使用shmget函數(shù)創(chuàng)建一塊共享內(nèi)存。程序中在調用shmget函數(shù)時指定key參數(shù)值為IPC_PRIVATE,這個參數(shù)的意義是創(chuàng)建一個新的共享內(nèi)存區(qū),當創(chuàng)建成功后使用shell命令ipcs來顯示目前系統(tǒng)下共享內(nèi)存的狀態(tài)。命令參數(shù)-m為只顯示共享內(nèi)存的狀態(tài)。(1)在vi編輯器中編輯該程序如下:程序清單14-8create_shm.c使用shmget函數(shù)創(chuàng)建共享內(nèi)存#includesys/types.h#includesys/ipc.h#includesys/shm.h#includestdlib.h#includestdio.h#defineBUFSZ4096intmain(void){intshm_id;/*共享內(nèi)存標識符*/shm_id=shmget(IPC_PRIVATE,BUFSZ,0666);if(shm_id0){/*創(chuàng)建共享內(nèi)存*/perror("shmget");exit(1);}printf("successfullycreatedsegment:%d\n",shm_id);system("ipcs-m");/*調用ipcs命令查看IPC*/exit(0);}(2)在shell中編譯該程序如下:$gcccreate_shm.c–ocreate_shm(3)在shell中運行該程序如下:$./create_shmsuccessfullycreatedsegment:2752516------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x0000000065536root6003932162dest0x000000002654209root666409600x0056a4d52686978root60048810x0056a4d62719747root60013107210x000000002752516root66640960上述程序中使用shmget函數(shù)來創(chuàng)建一段共享內(nèi)存,并在結束前調用了系統(tǒng)shell命令ipcs–m來查看當前系統(tǒng)IPC狀態(tài)。
編輯本段共享內(nèi)存的操作
由于共享內(nèi)存這一特殊的資源類型,使它不同于普通的文件,因此,系統(tǒng)需要為其提供專有的操作函數(shù),而這無疑增加了程序員開發(fā)的難度(需要記憶額外的專有函數(shù))。使用函數(shù)shmctl可以對共享內(nèi)存段進行多種操作,其函數(shù)原型如下:#includesys/shm.hintshmctl(intshm_id,intcmd,structshmid_ds*buf);函數(shù)中參數(shù)shm_id為所要操作的共享內(nèi)存段的標識符,structshmid_ds型指針參數(shù)buf的作用與參數(shù)cmd的值相關,參數(shù)cmd指明了所要進行的操作,其解釋如表14-5所示。
編輯本段cmd參數(shù)詳解
cmd的值意義
IPC_STAT取shm_id所指向內(nèi)存共享段的shmid_ds結構,對參數(shù)buf指向的結構賦值
IPC_SET使用buf指向的結構對sh_mid段的相關結構賦值,只對以下幾個域有作用,shm_perm.uidshm_perm.gid以及shm_perm.mode注意此命令只有具備以下條件的進程才可以請求:1.進程的用戶ID等于shm_perm.cuid或者等于shm_perm.uid2.超級用戶特權進程
IPC_RMID刪除shm_id所指向的共享內(nèi)存段,只有當shmid_ds結構的shm_nattch域為零時,才會真正執(zhí)行刪除命令,否則不會刪除該段注意此命令的請求規(guī)則與IPC_SET命令相同
SHM_LOCK鎖定共享內(nèi)存段在內(nèi)存,此命令只能由超級用戶請求
SHM_UNLOCK對共享內(nèi)存段解鎖,此命令只能由超級用戶請求
使用函數(shù)shmat將一個存在的共享內(nèi)存段連接到本進程空間,其函數(shù)原型如下:#includesys/shm.hvoid*shmat(intshm_id,constvoid*addr,intflag);函數(shù)中參數(shù)shm_id指定要引入的共享內(nèi)存,參數(shù)addr與flag組合說明要引入的地址值,通常只有2種用法,addr為0,表明讓內(nèi)核來決定第1個可以引入的位置。addr非零,并且flag中指定SHM_RND,則此段引入到addr所指向的位置(此操作不推薦使用,因為不會只對一種硬件上運行應用程序,為了程序的通用性推薦使用第1種方法),在flag參數(shù)中可以指定要引入的方式(讀寫方式指定)。%說明:函數(shù)成功執(zhí)行返回值為實際引入的地址,失敗返回–1。shmat函數(shù)成功執(zhí)行會將shm_id段的shmid_ds結構的shm_nattch計數(shù)器的值加1。當對共享內(nèi)存段操作結束時,應調用shmdt函數(shù),作用是將指定的共享內(nèi)存段從當前進程空間中脫離出去。函數(shù)原型如下:#includesys/shm.hintshmdt(void*addr);參數(shù)addr是調用shmat函數(shù)的返回值,函數(shù)執(zhí)行成功返回0,并將該共享內(nèi)存的shmid_ds結構的shm_nattch計數(shù)器減1,失敗返回–1。下面實例演示了操作共享內(nèi)存段的流程。程序的開始部分先檢測用戶是否有輸入,如出錯則打印該命令的使用幫助。接下來從命令行讀取將要引入的共享內(nèi)存ID,使用shmat函數(shù)引入該共享內(nèi)存,并在分離該內(nèi)存之前睡眠3秒以方便查看系統(tǒng)IPC狀態(tài)。(1)在vi編輯器中編輯該程序如下:程序清單14-9opr_shm.c操作共享內(nèi)存段#includesys/types.h#includesys/ipc.h#includesys/shm.h#includestdlib.h#includestdio.hintmain(intargc,char*argv[]){intshm_id;char*shm_buf;if(argc!=2){/*命令行參數(shù)錯誤*/printf("USAGE:atshmidentifier");/*打印幫助消息*/exit(1);}shm_id=atoi(argv[1]);/*得到要引入的共享內(nèi)存段*//*引入共享內(nèi)存段,由內(nèi)核選擇要引入的位置*/if((shm_buf=shmat(shm_id,0,0))(char*)0){perror("shmat");exit(1);}printf("segmentattachedat%p\n",shm_buf);/*輸出導入的位置*/system("ipcs-m");sleep(3);/*休眠*/if((shmdt(shm_buf))0){/*與導入的共享內(nèi)存段分離*/perror("shmdt");exit(1);}printf("segmentdetached\n");system("ipcs-m");/*再次查看系統(tǒng)IPC狀態(tài)*/exit(0);}(2)在shell中編譯該程序如下:$gccopr_shm.c–oopr_shm(3)在shell中運行該程序如下:$./opr_shm2752516segmentattachedat0xb7f29000------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x0000000065536root6003932162dest0x000000002654209root666409600x0056a4d52686978root60048810x0056a4d62719747root60013107210x000000002752516root66640961segmentdetached------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x0000000065536root6003932162dest0x000000002654209root666409600x0056a4d52686978root60048810x0056a4d62719747root60013107210x000000002752516root66640960上述程序中從命令行中讀取所要引入的共享內(nèi)存ID,并使用shmat函數(shù)引入該內(nèi)存到當前的進程空間中。注意在使用shmat函數(shù)時,將參數(shù)addr的值設為0,所表達的意義是由內(nèi)核來決定該共享內(nèi)存在當前進程中的位置。由于在編程的過程中,很少會針對某一個特定的硬件或系統(tǒng)編程,所以由內(nèi)核決定引入位置也就是shmat推薦的使用方式。在導入后使用shell命令ipcs–m來顯示當前的系統(tǒng)IPC的狀態(tài),可以看出輸出信息中nattch字段為該共享內(nèi)存時的引用值,最后使用shmdt函數(shù)分離該共享內(nèi)存并打印系統(tǒng)IPC的狀態(tài)。
編輯本段共享內(nèi)存使用注意事項
共享內(nèi)存相比其他幾種方式有著更方便的數(shù)據(jù)控制能力,數(shù)據(jù)在讀寫過程中會更透明。當成功導入一塊共享內(nèi)存后,它只是相當于一個字符串指針來指向一塊內(nèi)存,在當前進程下用戶可以隨意的訪問。缺點是,數(shù)據(jù)寫入進程或數(shù)據(jù)讀出進程中,需要附加的數(shù)據(jù)結構控制,共享內(nèi)存通信數(shù)據(jù)結構示意如圖14-9所示。
編輯本段結構示意
%說明:圖中兩個進程同時遵循一定的規(guī)則來讀寫該內(nèi)存。同時,在多進程同步或互斥上也需要附加的代碼來輔助共享內(nèi)存機制。在共享內(nèi)存段中都是以字符串的默認結束符為一條信息的結尾。每個進程在讀寫時都遵守這個規(guī)則,就不會破壞數(shù)據(jù)的完整性。
不知道所謂的好不好指的哪一方面。
顯卡的顯存是通過共享內(nèi)存來實現(xiàn),意思就是將部分內(nèi)存劃給顯卡使用,這樣可用內(nèi)存就變小了,理論上肯定影響系統(tǒng)性能。
不過蘋果本本,不是用來大型游戲的,本來就不是以性能見長的,賣點是良好的使用性。
日常應用,內(nèi)存和集成核顯性能足夠使用了。
只有傻瓜才共享內(nèi)存,共享內(nèi)存占用系統(tǒng)內(nèi)存,系統(tǒng)得卡死!筆記本如果有獨立顯存當然還是獨立的好!
沒必要,平時顯卡都不會去占用這些內(nèi)存,還是你在用。一旦顯卡需要占用了,說明這個程序你要運行,系統(tǒng)不可能需要這么大的,只有是你主動點開的一個程序調用這么大的內(nèi)存,你一改,到時候那個程序運行不了,至于嗎?
你平時關注一下,360或者魯大師都有懸浮窗的,4G內(nèi)存一般平時用不到40%,這是后臺程序比較多的時候了。
動態(tài)共享就是動態(tài)的,平時還是空的,給你用的,需要的時候就變成顯卡內(nèi)存了!
不存在好不好的問題,要看使用情況。
一般來說筆記本采用集成芯片共享內(nèi)存的顯示子系統(tǒng)性能都不如獨立芯片獨立顯存的。但也只是說性能上不好而已。你如果是個要求顯示子系統(tǒng)強大的,如要作圖,玩3D游戲,演示等,肯定是以獨立顯示芯片為好。如果你是個天天要用筆記本移動辦公干活的,對電池的使用時間有高要求的,你也不會過分去強調什么顯卡好不好,屏幕亮不亮,那都是高費電的部件,筆記本電池那點電不夠你用的,用個集成芯片可能是個更好的解決方案。
本文分類:科技
瀏覽次數(shù):572次瀏覽
發(fā)布日期:2023-05-01 11:24:14
本文鏈接:http://bikeshoes.com.cn/net/8014c6196c49ba8e432ba0f3bf5b4b57.html