javascript當中options的用法
阿新 • • 發佈:2021-12-10
一、實體記憶體和虛擬記憶體
1、虛擬記憶體
- 每個程式都有4G虛擬記憶體,相當於空頭支票
- 只有真正要用的時候,才會在實體記憶體中給你分配一塊實體記憶體
- 4kb頁式管理,一頁是4kb大小(物理頁)
2、虛擬記憶體地址劃分
3、實體記憶體
- 記憶體條的大小(不一定能百分百識別全部大小,近似) + 虛擬記憶體(硬碟)
- 32位系統最多可以識別實體記憶體為64G,但由於作業系統的限制,比如XP,只能識別4G(Windows 2003伺服器版本 可以識別4G以上)
二、私有記憶體申請和釋放
1、申請
#include "stdafx.h" int main(int argc , char* arvc[]) { LPVOID p = VirtualAlloc( NULL, // 要分配的記憶體區域的地址(一般為NULL) 1000*2, // 分配物理頁的大小(按物理頁的整數倍分,10進位制4096,16進位制1000) MEM_COMMIT, // 分配的型別(MEM_RESERVE,佔用虛擬地址,不需要實體記憶體,MEM_COMMIT,佔用虛擬地址,也需要使用物理頁) PAGE_READWRITE // 該記憶體的初始保護屬性(讀寫) ); return ; }
2、釋放
#include "stdafx.h" int main(int argc , char* arvc[]) { LPVOID p = VirtualAlloc( NULL, // 要分配的記憶體區域的地址(一般為NULL) 1000*2, // 分配物理頁的大小(按物理頁的整數倍分,10進位制4096,16進位制1000) MEM_COMMIT, // 分配的型別(MEM_RESERVE,佔用虛擬地址,不需要實體記憶體,MEM_COMMIT,佔用虛擬地址,也需要使用物理頁) PAGE_READWRITE // 該記憶體的初始保護屬性(讀寫) ); VirtualFree( p, // 區域地址 0x1000*2, // 物理頁的大小,位元組 MEM_DECOMMIT // 型別(MEM_DECOMMIT,虛擬地址保留,不保留物理頁,MEM_RELEASE ,虛擬地址不保留,物理頁也不保留) ); return ; }
3、malloc是從已經分配好的一塊記憶體中挖出一塊給自己用,本質上分配記憶體的不是它
三、共享記憶體申請和釋放
A程序:
#include "stdafx.h" #include "windows.h" #define MapFileName "ZZZ" #define BUFSIZE 0x1000 HANDLE g_hMapFile; LPTSTR g_lpBuff; int main(int argc, char* argv[]) { //核心物件,建立物理頁 g_hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 為INVALID_HANDLE_VALUE時,不與檔案關聯 NULL, // 安全描述符 PAGE_READWRITE, // 保護模式(讀寫的許可權) 0, // 32位通常為空 BUFSIZ, // 物理頁的大小 MapFileName // 指定檔案對映物件的名字 ); //將物理頁與線性地址進行對映,g_lpBuff就是虛擬記憶體地址 g_lpBuff = (LPTSTR)MapViewOfFile( g_hMapFile, //控制代碼 FILE_MAP_ALL_ACCESS, //虛擬記憶體讀寫許可權 0, //32位用不上 0, //從哪開始對映 BUFSIZ //物理頁多大它就多大 ); DWORD eror = GetLastError(); *(PDWORD)g_lpBuff = 0x12345678;//往虛擬記憶體地址存值 printf("%p",g_lpBuff); getchar(); //關閉對映,物理頁的計數器只會減一 UnmapViewOfFile(g_lpBuff); //關閉控制代碼 CloseHandle(g_hMapFile); getchar(); return 0; }
B程序:
#include "stdafx.h"
#include "windows.h"
#define MapFileName "ZZZ"
#define BUFSIZE 0x1000
HANDLE g_hMapFile;
LPTSTR g_lpBuff;
int main(int argc, char* argv[])
{
g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,MapFileName);
//將物理頁與線性地址進行對映,g_lpBuff就是虛擬記憶體地址
g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);
printf("程序B:%x",*(PDWORD)g_lpBuff);
//關閉對映
UnmapViewOfFile(g_lpBuff);
//關閉控制代碼
CloseHandle(g_hMapFile);
getchar();
return 0;
}