c语言 sysinfo_操作系统:内存分配(C语言 winapi)
//windows 内存分配. windows/visual stdio*/cl xxx.cpp
#include #include#include#include#include#include#include
using namespacestd;
DWORD dwID;
MEMORYSTATUS memInfo;#define C(I, S) CreateSemaphore(NULL, (I), 3, (S))
#define P(S) WaitForSingleObject((S), INFINITE)
#define V(S) ReleaseSemaphore((S), 1, NULL)
#define CT(func, args) CreateThread(NULL, 0, (func), (args), 0, &dwID)
#define PM(num, S) WaitForMultipleObjects((num), (S), true, INFINITE)DWORD WINAPI Tracer(LPVOID lpParam);
HANDLE hThread;
HANDLE s1, s2;
LPVOID lpvBase;//整个大内存基址
LPTSTR lpNxtPage; //下一个页面地址
LPTSTR lpPtr; //字符指针,用于测试访问,赋值
DWORD PageSize; //页面大小
DWORD showSysInfo()
{
SYSTEM_INFO siSysInfo;
GetSystemInfo(&siSysInfo);
cout<< "---------------BEG SYSTEM_INFO---------------" <
cout<< "OEM ID:" << siSysInfo.dwOemId <
cout<< "Number of processors:" << siSysInfo.dwNumberOfProcessors <
cout<< "Page size:" << siSysInfo.dwPageSize <
cout<< "Processor type:" << siSysInfo.dwProcessorType <
cout<< "Minimum application address:" << siSysInfo.lpMinimumApplicationAddress <
cout<< "Maximum application address:" << siSysInfo.lpMaximumApplicationAddress <
cout<< "---------------END SYSTEM_INFO---------------\n\n";returnsiSysInfo.dwPageSize;
}void showMemStatus(const char*s)
{
GlobalMemoryStatus(&memInfo);
cout<
cout<< hex << "dwAvailPhys: 0x" << memInfo.dwAvailPhys << ", dwAvailPageFile: 0x" <
}
DWORD WINAPI Tracer(LPVOID lpParam)
{for(int i = 0; i < 3; ++i) {
P(s2);
showMemStatus("提交页面了并且赋值了");
V(s1);
}return 0;
}
INT PageFaultExceptionFilter(DWORD dwCode)
{
LPVOID lpvResult;
cout<< "访问异常, 错误代码 = 0x" << dwCode << endl <
lpvResult= VirtualAlloc((LPVOID)lpNxtPage, 10000*PageSize, MEM_COMMIT, PAGE_READWRITE);if (lpvResult ==NULL) {
cout<< "VirtualAlloc failed" << endl <
}else{
showMemStatus("刚刚提交完页面");
}
lpNxtPage= (LPTSTR) ((PCHAR) lpNxtPage + 10000*PageSize);returnEXCEPTION_CONTINUE_EXECUTION;
}intmain()
{
PageSize=showSysInfo();
s1= C(1, "ss1");
s2= C(0, "ss2");
hThread=CT(Tracer, NULL);
showMemStatus("之前");
lpvBase= VirtualAlloc(NULL, 30000*PageSize, MEM_RESERVE, PAGE_NOACCESS); //先设置noacess, 赋值会出错,执行PageFaultExceptionFilter//cout <
if (lpvBase ==NULL) {
cout<< GetLastError() <
}else{
cout<< "成功初始化保留页面" <
}
showMemStatus("初始化: 保留页面");
lpPtr= lpNxtPage =(LPTSTR) lpvBase;for(int i = 0;i < 3; ++i) {
P(s1);for(int j = 0; j < 10000*PageSize; ++j) {
__try {//测试给申请的内存赋值
lpPtr[10000*i*PageSize + j] = 'a';
}
__except (PageFaultExceptionFilter(GetExceptionCode())) {
_tprintf (TEXT("出错了"));
ExitProcess( GetLastError() );
}
}
V(s2);
}
cout<< "第一个页面内容:" << lpPtr[3] << endl <
P(s1);
LPVOID lpvResult= VirtualAlloc(NULL, PageSize, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE |PAGE_GUARD);if (lpvResult ==NULL) {
cout<< GetLastError() <
}else{
cout<< "已经成功提交了一个页面\n\n";
}//测试一次性的PAGE_GUARD功能!同时测试锁定
BOOL bLocked =VirtualLock(lpvResult, PageSize);if (!bLocked) {
cout<< "不能锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功锁定了" << lpvResult << "\n\n";
}
bLocked=VirtualLock(lpvResult, PageSize);if (!bLocked) {
cout<< "不能锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功锁定了" << lpvResult << "\n\n";
}
showMemStatus("锁定了一个页面");//测试解锁
bLocked =VirtualUnlock(lpvResult, PageSize);if (!bLocked) {
cout<< "不能解锁锁定" << lpvResult << ", 错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功锁定了" << lpvResult << "\n\n";
}
showMemStatus("解锁完一个页面");//测试reset
LPVOID lpvResult1 =VirtualAlloc(lpvResult, PageSize, MEM_RESET, PAGE_READWRITE);if (lpvResult ==NULL) {
cout<< GetLastError() <
}else{
cout<< "已经成功Reset了一个页面\n\n";
}
showMemStatus("Reset了一个页面");//测试释放, 整个,物理+页面虚拟
BOOL bSuccess = VirtualFree(lpvBase, 0, MEM_RELEASE);if (!bSuccess) {
cout<< "错误代码 =" << GetLastError() << "\n\n";
}else{
cout<< "成功释放了" << lpvBase << "\n\n";
}
showMemStatus("释放了大内存");
P(hThread);return 0;
}
c语言 sysinfo_操作系统:内存分配(C语言 winapi)相关推荐
- C/C++语言变量声明内存分配
[cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...
- C语言中动态内存分配的本质是什么?
摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...
- c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...
c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...
- 【C语言】动态内存分配
[C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...
- C语言——操作系统内存分配过程
内存分配机制的发展过程: 第一阶段--程序直接操作物理内存. 某台计算机总的内存大小是128M,现在同时运行两个程序A和B,A需占用内存10M,B需占用内存100.计算机在给程序分配内存时会采取这样的 ...
- C语言:动态内存分配
个人博客网址:https://ljsblog.com 动态内存分配(十) 在不知道所需要的空间大小的情况下,这时就可以使用动态内存开辟. 当开辟的空间不再使用时,用free函数来释放calloc.ma ...
- 用c语言为程序分配内存,关于C语言程序的内存分配的入门知识学习
C语言程序的存储区域 C语言编写的程序经过编绎-链接后,将形成一个统一的文件,它由几个部分组成,在程序运行时又会产生几个其他部分,各个部分代表了不同的存储区域: 代码段(Code or Text):代 ...
- 【C语言进阶深度学习记录】三十三 C语言中动态内存分配
如何在程序运行的时候动态给程序分配内存? 文章目录 1 动态内存分配的意义 1.1 C语言中如何动态申请内存空间 1.2 malloc和free的用法 1.3 calloc与realloc 1.31 ...
- c语言紧凑算法的内存分配,C语言(第二章.1)算法与数据结构A.ppt
C语言课件(第二章.1)算法与数据结构A资料 课程设置目的 本课程是非计算机专业学生的技术基础课,通过本课程的学习,应使学生掌握传统的结构化程序设计的一般方法,以C为语言基础,培养学生严谨的程序设计思 ...
最新文章
- linux设备驱动第五篇:驱动中的并发与竟态
- OVS之vhost-net中VM通信(九)
- c#实现显式的用户自定义类型转换(关键字explicit operator)
- 玩转SVN系列之【如何放弃本地/服务器端所做的修改】
- Python到底是有什么魅力,让程序猿为它折腰?
- SQL Server数据库--过滤数据
- 2.开发Mip组件的第一个demo(点击关闭按钮,关闭外层dom)
- 【渝粤教育】国家开放大学2018年春季 0100-22T程序设计基础 参考试题
- 个人博客 修改markdown代码块背景颜色
- 网络爬虫-爬取飞常准航班信息
- 网络爬虫相关软件以及论文检索与推荐网站调研
- 剧本供不应求,会写课堂助力创作者入局剧本杀
- STM32F103c8t6超频
- 动态图解实例 ConstraintLayout Chain
- phpspreadsheet 读取 Excel 表格问题
- HTTPS与TOKEN
- 死亡搁浅运送系统服务器,死亡搁浅图文攻略 主线流程+订单系统+运送流程+建筑搭建_操作介绍_游侠网...
- 【CSS】笔记3-三大样式、盒子模型、PS、圆角、阴影
- 数据结构1800关于图的代码精选(三)
- 【产业互联网周报】三家量子计算初创企业宣布融资,华为公开量子密钥相关专利;钉钉高调押注低代码,腾讯云低码平台开启公测...