




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、高級系統(tǒng)程序設(shè)計重慶科技學(xué)院高級系統(tǒng)程序設(shè)計大作業(yè)專業(yè)班級: 學(xué) 號: 姓 名: 成 績: 摘 要在windows api中,有自己獨特的i/o操作,與c/c+中的i/o操作有何種區(qū)別;并且windows中的內(nèi)核對象是怎樣定義的,具體是怎樣操作。windows有自己的內(nèi)存架構(gòu),根據(jù)特定的要求有不同的管理內(nèi)存方法,其中堆適合大量的小對象,然而內(nèi)存映射文件適合大文件,各自具有不同的特性。關(guān)鍵字:i/o 內(nèi)核對象 堆 內(nèi)存映射文件目 錄公共部分11.1請綜合比較c/c+中i/o的使用方法與本課程程序?qū)嵺`中所采用的i/o方法各自的特點,并請舉例分析說明?11.1.1 c/c+ i/o11.1.2win
2、dows i/o21.1.3總體區(qū)別31.2基本請結(jié)合具體的例子解釋什么是內(nèi)核對象,對內(nèi)核對象的操作與之前學(xué)習(xí)的對指針的操作方法有什么本質(zhì)的區(qū)別?31.2.1windows中的內(nèi)核對象31.2.2內(nèi)核對象與指針的區(qū)別4選題部分52.1windows內(nèi)存管理構(gòu)架52.2內(nèi)存映射文件52.2.1怎樣使用內(nèi)存映射文件52.2.2內(nèi)存映射文件的使用特點62.3堆92.3.1使用堆92.3.2堆的使用特點103.總結(jié)12參考文獻13致謝1415公共部分1.1請綜合比較c/c+中i/o的使用方法與本課程程序?qū)嵺`中所采用的i/o方法各自的特點,并請舉例分析說明?1.1.1 c/c+ i/o1)用標(biāo)準(zhǔn)庫,通過
3、調(diào)用函數(shù)實現(xiàn)標(biāo)準(zhǔn)輸入,輸出c/c+的輸入/輸出由標(biāo)準(zhǔn)庫提供。標(biāo)準(zhǔn)庫定義了一族類型,支持對文件和控制窗口等設(shè)備的讀寫。而且在c+中還新定義了i/o流,在c語言中,標(biāo)準(zhǔn)庫stdio.h提供了兩個控制臺格式化輸入、 輸出函數(shù)printf( ) 和 scanf(), 這兩個函數(shù)可以在標(biāo)準(zhǔn)輸入輸出設(shè)備上以各種不同的格式讀寫數(shù)據(jù)。 printf()函數(shù)用來向標(biāo)準(zhǔn)輸出設(shè)備(屏幕)寫數(shù)據(jù),具體格式為printf("<格式化字符串>", <參量表>); scanf(
4、) 函數(shù)用來從標(biāo)準(zhǔn)輸入 ,具體格式為:scanf("<格式化字符串>", <地址表>); 例如:輸入:printf(”hahahahahan”);輸出:scanf(“%d”,&a);在c+中,i/o流是一系列寫到屏幕上或從鍵盤上讀出的字節(jié)序列。將i/o流定義為類,執(zhí)行標(biāo)準(zhǔn)的輸入輸出操作時,一般使用i/o流cin作為輸入,cout作為輸出。在ios.h、iostream.h、istream.h、ostream.h以及streamb.h中可以找到i/o流的定義。iostream.h中定義了如下四個對象:ci
5、n鍵盤輸入(stdin)、cout屏幕輸出(stdout)、cerr標(biāo)準(zhǔn)錯誤設(shè)備輸出(stderr)、clog標(biāo)準(zhǔn)錯誤緩沖輸出(stderr)。例如:cin>>name;cout<<”helllo world!”;cerr<<”error!”;clog<<”error log!”2)用標(biāo)準(zhǔn)庫,進行文件的讀寫操作在c語言中,打開文件的操作通過標(biāo)準(zhǔn)庫函數(shù)fopen 完成,它返回一個file指針值,賦給一個file類型的指針變量,通過指針對文件進行操作;fopen的函數(shù)原型,file *fopen(const char *filename,const
6、char *mode);關(guān)閉文件通過fclose完成,其原型為 int fclose(file *stream);例如:以讀的方式打開文件fnamefile *fp;fp=fopen(fname,”r”);fclose(fp);對于對文件的輸入輸出,分為字符的輸入輸出、格式化輸入輸出、行式輸入輸出。在c+中,提供了對磁盤文件進行讀寫,并且使用一個與輸入文件相關(guān)的變量來代替cin,使用一個與輸出文件相關(guān)的變量來代替cout。進行文件操作必須包含頭文件分stream。也就是定義一個ifstream類型變量來讀文件,定義一個ofstream類型變量來寫文件,操作完后關(guān)閉文件。例如:c+中要打開一個文
7、件ifstream infile;ofstream outfile;infile.open(“file”);/打開文件outfile.open(“file”);infile.close();/關(guān)閉文件outfile.close();1.1.2windows i/o在windows中,把文件和所有其他的輸入輸出設(shè)備的操作都統(tǒng)一由createfile等系列函數(shù)完成,也就是老師說的將將其他輸入輸出設(shè)備當(dāng)做文件來處理。這個createfile()函數(shù)返回了一個文件內(nèi)核對象句柄,這里說的文件不是狹義上的磁盤文件,也包括一些設(shè)備,比如郵槽,命名管道和匿名管道等等, 這些函數(shù),會創(chuàng)建一個i/o內(nèi)核對象,并取
8、得該對象的句柄值,然后我們可以調(diào)用與具體設(shè)備相關(guān)的函數(shù),并傳入得到的設(shè)備內(nèi)核對象句柄,來和設(shè)備進行通信。和其他內(nèi)核對象一樣,可以調(diào)用函數(shù)closehandle來關(guān)閉createfile創(chuàng)建的i/o內(nèi)核對象。例如:在郵槽通信中,每個服務(wù)器使用createmailslot創(chuàng)建郵槽句柄,服務(wù)器就要使用readfile調(diào)用等待接收寫的郵槽信息。并且只的客戶應(yīng)該使用createfile打開郵槽并使用writefile寫入消息。對文件的基本操作有四個函數(shù)createfile() writefile() readfile() closefile()對文件的打開以及關(guān)閉文件打開: handle createf
9、ile( lpctstr lpfilename, / 文件名 dword dwdesiredaccess, / 訪問模式 dword dwsharemode, / 共享模式 lpsecurity_attributes lpsecurityattributes, / 安全屬性 dword dwcreationdisposition, / how to createdword dwflagsandattributes, / 文件屬性 handle htemplatefile / 模板文件句柄 );文件關(guān)閉:bool closehandle(handle hobject)例如:打開一個haha命名可
10、讀可寫不可共享已存在的文件,handle hfile;hfile=(haha,generic_read|generic_write,0,null,open_existing,0,null);closehandle(hfile);文件的讀寫操作bool readfile ( handle hfile, /文件的句柄 lpvoid lpbuffer, /用于接收數(shù)據(jù)的緩沖區(qū) dword nnumberofbytetoread, /允許接收的最大字節(jié)數(shù)lp
11、dword lpnumberofbyteread/實際讀入字節(jié)的數(shù)量 lpoverlapped lpoverlapped, /一個overlapped結(jié)構(gòu)的指針 )bool writefile ( handle hfile, /文件的句柄 lpcvoid lpbuffer, /用于寫入數(shù)據(jù)的緩沖區(qū) dword nnumberofbytestowrite, /允許寫入的最大字
12、節(jié)數(shù)lpdword lpnumberofbytewritten/實際寫入的字節(jié)數(shù)量 lpoverlapped lpoverlapped, /一個overlapped結(jié)構(gòu)的指針 )在windows中,共有兩種i/o機制,一種是同步i/o另一種是異步i/o。同步i/o是線程執(zhí)行一個輸入輸出函數(shù)時,輸入輸出工作執(zhí)行完畢后,函數(shù)返回繼續(xù)執(zhí)行以后的代碼。異步i/o是線程執(zhí)行一個輸入輸出函數(shù)時,函數(shù)不等待讀/寫操作完成便立即返回,線程可先去執(zhí)行下文,執(zhí)行下文時可查詢剛剛發(fā)起的讀/寫操作是否完成。同步i/o將會阻塞線程的執(zhí)行, 異步i/o是更加高效的。在異步i/o的使
13、用,有三種方法,多線程i/o、重疊i/o以及帶有完成例程的重疊i/o多線程i/o:一個或一組進程中的每個線程執(zhí)行同步i/o,但其他線程可以繼續(xù)執(zhí)行重疊i/o:線程在發(fā)出讀、寫或其他i/o操作命令之后繼續(xù)執(zhí)行。當(dāng)線程需要i/o結(jié)果才能繼續(xù)執(zhí)行,它要么等待文件句柄,要么等待在readfile或writefile重疊結(jié)構(gòu)中指定的一個事件。帶有完成例程的重疊i/o:系統(tǒng)在i/o操作完成時調(diào)用線程內(nèi)一個特定的完成例成回調(diào)函數(shù)1.1.3總體區(qū)別 在c/c+中,有關(guān)輸入輸出的操作,都有通過庫函數(shù);然而在windows系統(tǒng)編程中,把文件和所有其他的輸入輸出設(shè)備的操作都統(tǒng)一由createfile等系列函數(shù)完成,
14、也就是老師說的將將其他輸入輸出設(shè)備當(dāng)做文件來處理。并且可以采用異步i/o提高效率。1.2基本請結(jié)合具體的例子解釋什么是內(nèi)核對象,對內(nèi)核對象的操作與之前學(xué)習(xí)的對指針的操作方法有什么本質(zhì)的區(qū)別?1.2.1windows中的內(nèi)核對象windows中許多系統(tǒng)資源是以內(nèi)核對象來表示的,像進程、線程、文件等等這樣的對象,內(nèi)核對象是系統(tǒng)地址空間中的一個內(nèi)存塊,由系統(tǒng)創(chuàng)建并維護。內(nèi)核對象為內(nèi)核所擁有,可以通過句柄來標(biāo)識,應(yīng)用。而且最關(guān)鍵的是內(nèi)核對象必須由windows api函數(shù)來操作.例如:在windows中對文件對象的操作,實現(xiàn)對文件的復(fù)制。其中要對文件對象進行操作,就必須調(diào)用文件的基本操作的四個函數(shù)cr
15、eatefile() writefile() readfile() closefile()通過文件句柄進行操作。定義兩個文件句柄,一個用于將要被復(fù)制的文件,一個用于復(fù)制后的文件handle hin, hout;打開一個已經(jīng)存在以字符串a(chǎn)rgy1命名的只讀文件,并可以讓其他進程進行并發(fā)讀訪問;hin = createfile (argv1, generic_read, file_share_read, null,open_existing, file_attribute_normal, null);創(chuàng)建一個以字符串a(chǎn)rgy2命名的只寫文件,不能共享;hout = createfile (argv
16、2, generic_write, 0, null,create_always, file_attribute_normal, null);進行文件復(fù)制while (readfile (hin, buffer, buf_size, &nin, null) && nin > 0) writefile (hout, buffer, nin, &nout, null);關(guān)閉文件句柄closehandle (hin); closehandle (hout);1.2.2內(nèi)核對象與指針的區(qū)別實例中,文件對象是windows中的內(nèi)核對象,我們只能調(diào)用windows提供的
17、api函數(shù)進行文件操作,事實上我們也只能通過文件句柄進行操作,除此之外沒有其它的辦法。但是在c/c+中,將對象的地址作為數(shù)據(jù),也就是指針值,用于保存地址的變量就是指針。也就是通過指針訪問內(nèi)存,進行內(nèi)存中數(shù)據(jù)的修改。我們只要知道了內(nèi)存地址,就可以通過指針對該內(nèi)存進行修改。然而windows中的內(nèi)核對象,我們只能通過api函數(shù),得到句柄進行相關(guān)的操作而且windows中為了對象的安全,支持廣泛的安全模型,能夠防止對諸如文件、進程等對象的未經(jīng)授權(quán)的訪問,其中幾乎所有可共享的對象都可以得到保護。例如:windows中,在創(chuàng)建文件時,第四個參數(shù),lpsecurity_attributes lpsecur
18、ityattributes,就是說明了對象的安全屬性。所以,指針與內(nèi)核對象的本質(zhì)區(qū)別就是,指針可以對內(nèi)存進行任意的修改,而且指針可以我們根據(jù)自己的需要進行定義。內(nèi)核對象只能通過句柄對相關(guān)的地方進行操作,而且有嚴(yán)格的對象安全屬性,只能根據(jù)需要調(diào)用api函數(shù),不能自己定義!選題部分題目一:綜合比較windows內(nèi)存管理中內(nèi)存映射文件和堆2鐘方法各自的特點,寫出你的詳細(xì)分析結(jié)論并請編程舉例說明,必須在大作業(yè)中給出你的每個程序的設(shè)計思考過程和關(guān)鍵程序代碼段,完整的源程序可在附錄中給出。 2.1windows內(nèi)存管理構(gòu)架 windows程序c庫:malloc,free mmf api (內(nèi)存映射文件)
19、堆api 虛擬內(nèi)存api 帶有虛擬內(nèi)存管理器的windows內(nèi)核物理內(nèi)存磁盤和文件系統(tǒng)2.2內(nèi)存映射文件內(nèi)存映射文件的物理存儲器來自磁盤上已有的文件,而不是來自系統(tǒng)的頁面交換文件,一旦把文件映射到地址空間,我們就可以對他進行訪問,就好像將整個文件已經(jīng)載入內(nèi)存一樣。2.2.1怎樣使用內(nèi)存映射文件1)打開文件2)如果是新文件,那么要使用createfilemapping,要么先使用setfilepointerex,然后使用setendoffile來設(shè)置長度。3) 使用createfilemapping或openfilemapping來映射文件4) 使用mapviewofile創(chuàng)建一個或多個視圖5)
20、 通過內(nèi)存引用來訪問文件6)完成后,關(guān)閉有關(guān)句柄涉及的有關(guān)函數(shù):創(chuàng)建一個帶有句柄的文件映射對象handle createfilemapping(handle hfile, /物理文件句柄lpsecurity_attributes lpsa, /安全設(shè)置dword dwprotect, /保護設(shè)置dword dwmaximumsizehigh, /高位文件大小dword dwmaximumsizelow, /低位文件大小lpctstr lpmapname /共享內(nèi)存名稱);打開現(xiàn)有的文件映射:handle openfilemapping(dword dwdesiredaccess,/訪問權(quán)限bo
21、ol binherithandle,/ 返回的句柄是否能由當(dāng)前進程啟動的新進程繼承l(wèi)pctstr lpmaname/共享內(nèi)存名稱)將對象映射到地址空間lpvoid mapviewoffile( handle hmapobject,/ 文件映射對象的句柄 dword dwaccess, /訪問權(quán)限 dword dwoffsethigh,/ 文件中映射起點的高32位地址dword dwoffsetlow,/文件中映射起點的低32位地址 size_t cbmap/以字節(jié)為單位的映射區(qū)域尺寸值);關(guān)閉映射句柄bool unmapviewof
22、file(lpvoid lpbaseaddress)2.2.2內(nèi)存映射文件的使用特點1)系統(tǒng)使用內(nèi)存映射文件,以便加載和執(zhí)行.exe和dll文件。大大節(jié)省頁文件空間和應(yīng)用程序啟動運行所需的時間。當(dāng)一個程序在調(diào)用createprocess的時候,系統(tǒng)首先就會先確定創(chuàng)建進程時所指定的可執(zhí)行文件的位置,如果找不到創(chuàng)建進程就會失敗;找到了可執(zhí)行文件的位置,系統(tǒng)就會創(chuàng)建一個新的進程內(nèi)核對象,并為他創(chuàng)建一個私有的地址空間。而且系統(tǒng)會預(yù)定一塊足夠大的地址空間來容納可執(zhí)行文件并且系統(tǒng)會對地址空間區(qū)域進行標(biāo)注說明該區(qū)域來自磁盤上的可執(zhí)行文件,也就是將可執(zhí)行文件映射到虛擬地址空間,這樣就可以節(jié)省頁文件空間。當(dāng)系統(tǒng)
23、把可執(zhí)行文件映射到進程的地址空間后,就會訪問可執(zhí)行文件中一個段,這個段列出了一些dll文件,他們包含了可執(zhí)行文件的需要調(diào)用的函數(shù)。同樣系統(tǒng)會把用到的dll也映射到一塊足夠大的地址空間并標(biāo)注。把所有的可執(zhí)行文件和dll文件都映射到進程的地址空間后,系統(tǒng)就會開始執(zhí)行可執(zhí)行文件的啟動代碼。由于采取的文件映射,時間較短,就不用一段一段的將指令讀入內(nèi)存,所以也就節(jié)省了程序的啟動運行時間。2)開發(fā)人員使用內(nèi)存映射文件來訪問磁盤上的數(shù)據(jù)文件。這樣可以避免直接對文件執(zhí)行i/o操作和對文件內(nèi)容進行緩存,并且可以進行大文件操作。由于使用內(nèi)存映射文件,是將來自磁盤上已有的文件映射到地址空間,所以肯定就可以避免直接對
24、文件執(zhí)行i/o操作和對文件內(nèi)容進行緩存。例如:將一個文件映射到虛擬內(nèi)存空間handle hfile = invalid_handle_value, hmap = null;lpvoid pfile = null;hfile = createfile (tempfile, generic_read| generic_write, 0, null, open_existing, 0, null);/打開文件hmap = createfilemapping (hfile, null, page_readwrite, 0, 0, null);/創(chuàng)建一個內(nèi)核文件映射對象pfile = mapviewof
25、file (hmap, file_map_all_access, 0, 0, 0);/將文件映射到進程的虛擬地址空間unmapviewoffile (pfile)/釋放視圖;closehandle (hmap);/關(guān)閉文件映射句柄closehandle (hfile);/關(guān)閉文件句柄在win32 api中,提供有支持文件處理的函數(shù) (如createfile()、writefile()、readfile()等).。一般來說,以上這些函數(shù)可以滿足大多數(shù)場合的要求,但是對于某些超過幾個g大文件,再以通常的文件處理方法進行處理顯然是行不通的,因為不能一次將文件映像全部映射進來。對于這種情況只能依次將大
26、文件的各個部分映射到進程中的一個較小的地址空間例如:使用內(nèi)存映射文件進行大文件的操作,由于不能一次性將文件全部映射到地址空間,所以就只能將文件一部分一部分的映射到地址空間,其中最關(guān)鍵的是要分別將每一部分映射到地址空間后,要關(guān)閉視圖,而且要確定文件偏移的大小,循環(huán)映射,直到文件全部映射完成(本程序源于wndows核心編程第五版)/創(chuàng)建文件handle hfile = createfile(“haha”, generic_read | generic_write, 0, null,&
27、#160;open_existing, file_attribute_normal, null); /創(chuàng)建文件映射 handle hfilemap = createfilemapping(hfile, null, page_readwrite, 0, 0, null); / 得到系統(tǒng)分配粒度 system_info sysinfo; getsysteminfo(&sysi
28、nfo); dword dwgran = sysinfo.dwallocationgranularity; / 得到文件尺寸 dword dwfilesizehigh; _int64 qwfilesize = getfilesize(hfile, &dwfilesizehigh); qwfilesize |= (_int64)dwfilesizehigh) &
29、lt;< 32); / 關(guān)閉文件對象 closehandle(hfile); / 偏移地址 _int64 qwfileoffset = 0; / 塊大小 dword dwblockbytes = 1000 * dwgran; if (qwfilesize < 1000
30、160;* dwgran) dwblockbytes = (dword)qwfilesize; while (qwfileoffset > 0) / 映射視圖 lpbyte lpbmapaddress = (lpbyte)mapviewoffile(hfilemap,file_map_all_ac
31、cess, (dword)(qwfileoffset >> 32), (dword)(qwfileoffset & 0xffffffff), dwblockbytes); / 對映射的視圖進行訪問 for(dword i = 0; i < dwblockbytes; i+)
32、; byte temp = *(lpbmapaddress + i); / 撤消文件映像 unmapviewoffile(lpbmapaddress); / 修正參數(shù) qwfileoffset += dwblockbytes;
33、60; qwfilesize -= dwblockbytes; / 關(guān)閉文件映射對象句柄 closehandle(hfilemap);3)可以使用內(nèi)存映射文件,使同一臺計算機上運行的多個進程能夠相互之間共享數(shù)據(jù)共享內(nèi)存主要是通過映射機制實現(xiàn)的。windows下進程的地址空間是相互隔離的,但在物理上卻是重疊的。所謂的重疊是指同一塊內(nèi)存區(qū)域可能被多個進程同時使用。當(dāng)調(diào)用createfilemapping創(chuàng)建命名的內(nèi)存映射文件對象時,windows即在物理內(nèi)
34、存中申請了一塊指定大小的內(nèi)存區(qū)域,返回文件映射對象的新句柄hmap。為了能夠訪問這塊區(qū)域必須調(diào)mapviewofifile函數(shù),促使windows將此內(nèi)存空間映射到進程的地址空間中。當(dāng)在其他進程中訪問這塊區(qū)域時,則必須使用openfilemapping函數(shù)來取得對象句柄hmap,并調(diào)用mapviewoffile函數(shù)得到此內(nèi)存空間的一個映射。這樣一來,系統(tǒng)就把同一塊內(nèi)存區(qū)域映射到了不同進程的地址空間中,從而達到共享內(nèi)存的目的。例如:用c寫一個程序,使用內(nèi)存映射文件進行簡單的數(shù)據(jù)共享。首先,將字符串利用內(nèi)存映射文件映射到地址空間char name = "sure" / 內(nèi)存映射
35、對象的名稱 char data = "abcdefghijk" / 共享內(nèi)存中的數(shù)據(jù) lpvoid pbuffer; / 共享內(nèi)存指針 handle hmap=createfilemapping( invalid_handle_value,nupage_readwrite,0, strlen(data),name); / 映射對象的一個視圖,得到指向共享內(nèi)存的指針,設(shè)置里面的數(shù)據(jù) pbuffer = mapviewoffile(hmap, file_map_all_access, 0, 0, 0); strcpy(char*)pbuffer, data); printf(&
36、quot; 寫入共享內(nèi)存數(shù)據(jù):%sn", (char*)pbuffer); 然后,打開現(xiàn)有的文件映射使用openfilemapping函數(shù)來取得對象句柄hin,并調(diào)用mapviewoffile函數(shù)得到此內(nèi)存空間的一個映射 handle hin=openfilemapping(file_map_all_access, 0, name); if(hin != null) / 打開成功,映射對象的一個視圖,得到指向共享內(nèi)存的指針,顯示出里面的數(shù)據(jù) pbuffer =mapviewoffile(hin, file_map_all_access, 0, 0, 0); printf("
37、 讀出共享內(nèi)存數(shù)據(jù):%sn", (char*)pbuffer); 2.3堆windows在堆中維護著內(nèi)存池,進程可以包含許多堆,我們從堆中分配內(nèi)存。而且堆是windows對象,但不是內(nèi)核對象,在分配內(nèi)存時需要堆句柄。 堆是進程創(chuàng)建時在進程空間建立的區(qū)域,由堆管理器來管理。一個進程可以有很多個堆。進程有一個默認(rèn)堆,可以動態(tài)的擴大。當(dāng)程序需要管理很多小對象時,適合用堆。2.3.1使用堆一、使用堆常用的函數(shù):1、 獲得進程默認(rèn)堆句柄handle getprocessheap(void)返回:本進程的堆句柄,失敗返回null2、 創(chuàng)建堆handle heapcreate( dword flo
38、ptions,/創(chuàng)建堆的選項 dword dwinitialsize,/初始大小 dword dwmaximumsize/最大尺寸)3、從堆中分配內(nèi)存塊 heapalloclpvoidheapalloc(handle hheap;/分配內(nèi)存的堆句柄dword dwflags;/分配控制的選項size_t dwbytes/分配內(nèi)存塊的大小) 4、 改變內(nèi)存塊的大小 heaprealloclpvoid heaprealloc(handle hheap;/修改堆的句柄dword dwflags;/控制選項lpvoid lpmem;/指定重新分配的內(nèi)存塊size_t dwbytes/新塊的大小); 5
39、、釋放內(nèi)存塊 heapfree bool heapfree(handle hheap;/釋放堆的句柄dword dwflags;/控制選項lpvoid lpmem;/指定釋放的內(nèi)存塊);6、得到堆的尺寸heapsize size_t heapsize(handle hheap,/堆句柄dword dwflags,/唯一可能的值是heap_no_serializelpcvoid lpmem/指定的內(nèi)存塊)7、 撤銷堆 heapdestroybool heapdestroy(handle hheap);2.3.2堆的使用特點1、用來分配許多較小的數(shù)據(jù)塊,可不考慮分配粒度和頁面邊界。在堆管理中,有堆
40、管理器來替它管理,不需管理具體的事情如頁面邊界和分配粒度等問題。堆成功創(chuàng)建以后, 整個堆的構(gòu)造如圖2所示, 堆是以堆管理結(jié)構(gòu)開始的,圖中的初始區(qū)域是參數(shù) dwinitialsize指定的。暫時未用的保留區(qū)域(預(yù)備區(qū)域), 它和初始區(qū)域的總和由參數(shù)dwmaximumsize指定。 初始區(qū)域管理結(jié)構(gòu) 預(yù)備區(qū)域 圖2 堆的結(jié)構(gòu)保留區(qū)域中的多數(shù)頁面并沒有提交到物理存儲器。 隨著從堆中越來越多地進行內(nèi)存分配, 堆管理器逐漸把更多的物理存儲器提交給堆。堆的物理存儲器從系統(tǒng)頁文件中分配, 在釋放時有專門的堆管理器負(fù)責(zé)對已占用物理存儲器的回收。 應(yīng)用程序可以使用系統(tǒng)提供的一系列函數(shù)來創(chuàng)建自己的堆并對堆中的內(nèi)存
41、進行管理, 主要包括堆內(nèi)存塊的分配和堆內(nèi)存塊的釋放, 以及堆內(nèi)存塊的枚舉、 計算內(nèi)存塊的大小等等。堆用來分配較小的數(shù)據(jù)塊,也就是說,適合管理大量的小對象。比如,用來管理鏈表和二叉樹。例如:使用堆,實現(xiàn)二叉排序數(shù),實現(xiàn)動態(tài)分配內(nèi)存在程序中使用兩個堆,在二叉樹的每個結(jié)點中,包含了左指針、右指針、一個鍵以及一個指向數(shù)據(jù)堆中的數(shù)據(jù)記錄指針。定義如下:typedef struct _treenode struct _treenode *left, *right;/ 左指針、右指針tchar keykey_size;/ 鍵lptstr pdata;/ 指向數(shù)據(jù)堆中的數(shù)據(jù)記錄指針 treenode, *lptnode, *lpptnode;其中,鍵保存在結(jié)點堆(node heap)中,節(jié)點堆的定義如下:hnode=heapcreate(heap_generate_exceptions|heap_no_serialize,node_heap_isize, 0);數(shù)據(jù)堆(data heap)定義如下;hdata=heapcreate(heap_gene
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024浙江松陽縣國盛人力資源有限公司招聘機修工化驗員農(nóng)污運維人員26人筆試參考題庫附帶答案詳解
- 兩人養(yǎng)殖合同范本
- 全案代購合同范本
- 農(nóng)民魚塘養(yǎng)殖合同范本
- 借工程資質(zhì)合同范本
- 業(yè)務(wù)明細(xì)合同范本
- 勞務(wù)合同范本工地工人
- 2025年景德鎮(zhèn)陶瓷項目規(guī)劃申請報告模范
- 基金清算報告范文
- 粵教版 信息技術(shù) 必修 3.1.1常見文本類型教學(xué)設(shè)計
- 鐵路局中間站管理手冊
- 監(jiān)理日志表(標(biāo)準(zhǔn)模版)
- H3C-CAS虛擬化平臺詳細(xì)介紹
- 小學(xué)生韻母in、ing常見漢字與區(qū)分練習(xí)
- 藥房品種類別及數(shù)量清單
- 初中物理人教版八年級下冊 第1節(jié)牛頓第一定律 課件
- 網(wǎng)站培訓(xùn)內(nèi)容trswcm65表單選件用戶手冊
- 連續(xù)平壓熱壓機 三篇 俞敏等
- 打印版-圓與二次函數(shù)綜合題精練(帶答案)
- 各種閥門CAD圖
- 工程結(jié)算書標(biāo)準(zhǔn)
評論
0/150
提交評論