WINDOWS内存三种管理方式及优缺点

WINDOWS内存管理方式综述

WINDOWS内存管理方式主要分为:段式管理、页式管理、段页式管理
页式管理:页式管理的基本原理将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(page frame然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。 其优点是没有外碎片,每个内碎片不超过页大小。一个程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)。 缺点:程序全部装入内存,要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。增加了系统开销,例如缺页中断处理机,请求调页的算法如选择不当,有可能产生抖动现象。 虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。 
段式管理的基本思想就是把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址影射机构把段式虚拟地址转换为实际内存物理地址。 程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。其优点是:可以分别编写和编译。 可以针对不同类型的段采取不同的保护。 可以按段为单位来进行共享,包括通过动态链接进行代码共享。 
段页式管理:为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理、存储保护及地址变换等。另外,由于一个段又被划分成了若干页,每个段又必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然,与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。另外,由于在段页式管理中,页表不再是属于进程而是属于某个段,因此,段表中应有专项指出该段所对应页表的页表始址和页表长度。 因为段页式管理是段式管理的页式管理方案结合而成的,所以具有它们二者的优点。但反过来说,由于管理软件的增加,复杂性和开销也就随之增加了。另外,需要的硬件以及占用的内存也有所增加。更重要的是,如果不采用联想寄存器的方式提高CPU的访内速度,将会使得执行速度大大下降。
API函数

1.使用全局和局部函数分配和释放内存的API函数

/* 头文件 */

#include <windows.h>

#include <stdio.h>

*************************************

* int main(void)

* 功能  演示Global*函数的使用

* 参数  无

**************************************/

int main(void)

{  

     LPVOID lpMem;     //内存地址

     HGLOBAL hMem;  //内存句柄

     SIZE_T sizeMem;   //内存大小

     UINT uFlags; //属性

     //分配内存

     lpMem =(LPVOID)GlobalAlloc(GPTR,1000);

     //将数据复制到内存中

     lstrcpy(lpMem,"this is astring");  

     //获得内存属性,打印

     uFlags = GlobalFlags(lpMem);

     printf("内存中的内容:\"%s\",内存地址:0x%.8x,内存属性:%u\n",

          lpMem,lpMem,uFlags);

     //释放

     GlobalFree(lpMem);

     //分配内存,获取信息

     hMem =GlobalAlloc(GMEM_MOVEABLE,1000);

     sizeMem = GlobalSize(hMem);

     uFlags = GlobalFlags(hMem);

     //打印信息

     printf("内存大小:%d,内存句柄:0x%.8x,内存属性:%u\n",

          sizeMem,hMem,uFlags);

     //锁定

     lpMem = GlobalLock(hMem);

     //释放

     GlobalFree(hMem);

     return 0;

}

 

2.分配和释放可读可写的虚拟内存页面

/* 头文件 */

#include <windows.h>

#include <stdio.h>

/*************************************

* int main(void)

* 功能  演示虚拟内存的使用

* 参数  未使用

**************************************/

int main(void)

{  

     SIZE_T sizeVirtual = 4000;       //大小

     LPVOID lpRound =(LPVOID)0x100000FF;   //地址

     MEMORY_BASIC_INFORMATION  mbi;   //内存信息

     //分配内存,直接分配已提交的内存

     LPVOID lpAddress =VirtualAlloc(

          lpRound,sizeVirtual,

          MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE

          );

     if(lpAddress == NULL)

     {

          printf("VirtualAlloc error: %d\n",GetLastError());

          return 1;

     }

     printf("Alloc:MEM_COMMIT|MEM_RESERVE\n");

     //复制数据到内存中

     CopyMemory(lpAddress,"hello",lstrlen("hello"));

     printf("分配、复制成功,地址:0x%.8x,内容:%s\n",

          lpAddress,lpAddress);

     //获取内存信息并打印

     VirtualQuery(lpAddress,&mbi,sizeof(mbi));

     printf("使用VirtualQuery获得的信息:\n"

          "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"

          "AllocationProtect:0x%.8x\tRegionSize:%u\t"

          "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",

          mbi.BaseAddress,mbi.AllocationBase,

          mbi.AllocationProtect,mbi.RegionSize,

          mbi.State,mbi.Protect,mbi.Type

          );

     设置为READ-ONLY属性

     //if(!VirtualProtect(lpAddress,0,PAGE_READONLY,NULL))

     //{

     //  printf("VirtualProtect error: %d",GetLastError());

     //  return 1;

     //}

     测试READ-ONLY属性,异常

     //CopyMemory(lpAddress,"readonly",lstrlen("read only"));

     //printf(lpAddress);

     获取内存信息并打印

     //VirtualQuery(lpAddress,&mbi,sizeof(mbi));

     //printf("使用VirtualQuery获得的信息:\n"

     //  "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"

     //  "AllocationProtect:0x%.8x\tRegionSize:%d\t"

     //  "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",

     //  mbi.BaseAddress,mbi.AllocationBase,

     //  mbi.AllocationProtect,mbi.RegionSize,

     //  mbi.State,mbi.Protect,mbi.Type

     //  );

 

     //DECOMMIT释放,页面将变为保留状态

     printf("Free:DECOMMIT\n");

     if(!VirtualFree(lpRound,sizeVirtual,MEM_DECOMMIT))

     {

          printf("VirtualFree error: %d",GetLastError());

          return 1;

     }

     //获取内存信息并打印

     VirtualQuery(lpAddress,&mbi,sizeof(mbi));

     printf("使用VirtualQuery获得的信息:\n"

          "BaseAddress:0x%.8x\tAllocationBase:0x%.8x\t"

          "AllocationProtect:0x%.8x\tRegionSize:%u\t"

          "State:0x%.8x\tProtect:0x%.8x\tType:0x%.8x\n",

          mbi.BaseAddress,mbi.AllocationBase,

          mbi.AllocationProtect,mbi.RegionSize,

          mbi.State,mbi.Protect,mbi.Type

          );

     //释放内存

     printf("Free:RELEASE\n");

     if(!VirtualFree(lpAddress,0,MEM_RELEASE))

     {

          printf("VirtualFree error: %d",GetLastError());

          return 1;

     }

     return 0;

}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在当今的计算机领域中,操作系统是计算机系统中最重要的一个组成部分。操作系统扮演着许多重要角色,其中最重要的一项就是管理和协调计算机硬件和软件资源,为用户提供友好的操作环境。在操作系统的世界中,Windows和Linux是两个最受欢迎的操作系统之一。他们的出现极大地影响了计算机的发展和使用。本文将会比较Linux操作系统和Windows操作系统在进程管理内存管理、文件管理的异同。 一、进程管理 操作系统的进程管理是操作系统中最重要的一部分之一。进程是指正在运行的程序,它是计算机中耗费资源最多的部分。在进程管理中,Linux和Windows操作系统有很多共同点,但也有很多不同之处。 1.1 进程的创建和销毁 Linux和Windows操作系统都可以创建和销毁进程。在Linux中,进程可以通过fork()系统调用来创建新进程,通过exit()系统调用来销毁进程。在Windows中,进程可以通过CreateProcess()函数创建新进程,通过TerminateProcess()函数来销毁进程。 1.2 进程的调度 进程的调度是指操作系统分配CPU时间片给不同的进程,使得它们能够交替运行。在Linux和Windows操作系统中,进程调度的基本原理是相似的。都是使用时间片轮转算法,但是具体的实现方式有所不同。在Linux操作系统中,进程调度是通过进程优先级和时间片大小来实现的。在Windows操作系统中,进程调度是通过进程优先级、时间片大小和进程动态优先级来实现的。 1.3 进程通信 进程通信是指在不同进程之间传递数据的过程。在Linux和Windows操作系统中,进程通信是非常重要的。Linux操作系统中,进程间通信可以使用管道、信号量、共享内存和消息队列等方式Windows操作系统中,进程间通信可以使用管道、邮件槽、共享内存和命名管道等方式。 1.4 进程间同步 进程间同步是指在不同进程之间协调执行的过程。在Linux和Windows操作系统中,进程间同步是必不可少的。Linux操作系统中,进程间同步可以使用信号量、互斥量和条件变量等方式Windows操作系统中,进程间同步可以使用互斥量、临界区和事件等方式。 二、内存管理 内存管理是操作系统中另一个重要的部分,它负责为进程分配和回收内存。在Linux和Windows操作系统中,内存管理的基本原理是相同的。但是,具体的实现方式有所不同。 2.1 内存的分配和回收 在Linux和Windows操作系统中,内存的分配和回收都是通过堆来实现的。在Linux操作系统中,可以使用malloc()和free()函数来分配和回收内存。在Windows操作系统中,可以使用HeapAlloc()和HeapFree()函数来分配和回收内存。 2.2 虚拟内存 虚拟内存是一种将硬盘空间作为内存使用的技术。在Linux和Windows操作系统中,都支持虚拟内存技术。在Linux操作系统中,虚拟内存可以通过swap分区来实现。在Windows操作系统中,虚拟内存可以通过页面文件来实现。 2.3 内存保护 内存保护是指为进程分配的内存空间进行保护,防止其它进程对其进行读写操作。在Linux和Windows操作系统中,内存保护都是通过页表来实现的。在Linux操作系统中,页表可以通过mmap()函数来实现。在Windows操作系统中,页表可以通过VirtualAlloc()函数来实现。 三、文件管理 文件管理是操作系统中最基本和最重要的部分之一。它负责管理文件和文件系统。在Linux和Windows操作系统中,文件管理的基本原理是相同的。但是,具体的实现方式有所不同。 3.1 文件系统 文件系统是操作系统中最重要的部分之一。它负责管理文件和目录。在Linux和Windows操作系统中,文件系统的基本原理是相同的。但是,具体的实现方式有所不同。在Linux操作系统中,文件系统可以通过ext2、ext3、ext4等方式来实现。在Windows操作系统中,文件系统可以通过NTFS和FAT32等方式来实现。 3.2 文件读写 文件读写是操作系统中最基本的操作之一。在Linux和Windows操作系统中,文件读写的基本原理是相同的。但是,具体的实现方式有所不同。在Linux操作系统中,文件读写可以通过open()、read()和write()函数来实现。在Windows操作系统中,文件读写可以通过CreateFile()、ReadFile()和WriteFile()函数来实现。 3.3 文件访问权限 文件访问权限是指对文件的访问权限进行控制。在Linux和Windows操作系统中,文件访问权限的基本原理是相同的。但是,具体的实现方式有所不同。在Linux操作系统中,文件访问权限可以通过chmod()函数来实现。在Windows操作系统中,文件访问权限可以通过SetFileSecurity()函数来实现。 四、总结 通过对Linux操作系统和Windows操作系统在进程管理内存管理、文件管理的比较,可以看出,两种操作系统在基本原理上是相同的,但是具体的实现方式有所不同。Linux操作系统更加注重命令行操作和开发人员的需求,Windows操作系统更加注重用户友好性和易用性。无论是哪种操作系统,都有其自身的优缺点,对于不同的用户,其需求也是不同的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值