1. 程式人生 > 其它 >javascript當中options的用法

javascript當中options的用法

一、實體記憶體和虛擬記憶體

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;
}