三内存管理应用程序设计.ppt
《三内存管理应用程序设计.ppt》由会员分享,可在线阅读,更多相关《三内存管理应用程序设计.ppt(116页珍藏版)》请在三一文库上搜索。
1、第 2/76 页,三、 内存管理应用程序设计,内存管理的相关概念 内存数据空间的动态分配 内存代码空间的动态分配,第 3/76 页,1内存管理,主要任务 对内存储器进行分配、变换、保护和扩充,存储管理还应该能够在内存和外存之间交换数据和代码。 在Windows操作系统下,存储器被保护起来,程序和用户无法直接访问,需要在程序中通过静态和动态两种方式来访问。 Windows的内存管理完成物理内存和虚拟内存之间的交换,虚拟内存是32位的,多达4GB的大小,内存管理还提供了一个核心服务,完成内存映射文件、写时复制内存和用户程序使用的大量和稀疏内存的管理。,第 4/76 页,两种使用内存的基本方法,静态
2、方法 数组,例如 Student student501 动态方法 指针,例如 Student *student=new Studentcount+1,第 5/76 页,Windows NT 内存管理,Windows可以管理4GB大小的空间;操作系统使用其中2GB空间,每个用户进程可以使用2GB的专用地址空间。 Win32 API提供: VirtualXXX形式的以页为单位的虚拟内存函数; CreateMapFile、MapViewofFile内存映射文件函数; HeapXXX堆栈函数。,第 6/76 页,内存管理,Windows NT在X86体系下虚拟地址空间的分布:,第 7/76 页,例3-
3、6 动态申请虚拟内存,整数阶乘计算到13就会出错。怎么办? 使用动态申请的虚拟内存空间编写计算任何数的阶乘的程序。 解体思路: 计算较大数的阶乘的计算一般使用数组来存放阶乘的位数。但是C+中数组最大长度是10万,这将影响使用的范围。 可以通过使用动态内存分配(指针)来解决。 本程序采用动态申请虚拟内存空间的方法,不使用物理内存,而是使用虚拟内存,从而使求解问题的范围扩大。,阶乘源代码,阶乘执行代码,第 8/76 页,程序算法, 从命令行接收输入并使用strtol函数将其转换为long型的整数(n为要求阶乘的数)。 通过函数VirtualAlloc保留n10240的地址空间,申请n1024的地址
4、空间。 调用计算阶乘函数lfac。 一位一位显示阶乘结果。 通过函数VirtulFree释放虚拟内存。,第 9/76 页,函数VirtualAlloc,用函数VirtualAlloc保留或申请虚拟内存空间。 该函数格式如下: LPVOID VirtualAlloc( LPVOID lpAddress, / 起始地址 DWORD dwSize, / 大小 DWORD flAllocationType, / 分配类型(MEM_COMMIT等) DWORD flProtect / 保权限(PAGE_READWRITE等) );,第 10/76 页,函数VirtualFree,使用函数VirtualF
5、ree释放虚拟内存,函数格式: BOOL VirtualFree( LPVOID lpAddress, /起始地址 DWORD dwSize, /大小 DWORD dwFreeType /释放类型(MEM_RELEASE等) );,第 11/76 页,源程序,#include #include int lfac(int *a, int n) int sum,sc; for(int i=0;i0) return -1; else return 0; ,第 12/76 页,举例求5!,a0=1; /最低位设为1 for(i=2;i=n;i+) /n的阶乘的循环 sc=0; for(int j=0;
6、jn*1024;j+) /阶乘每一位处理的循环 sum=aj*i+sc; /上一次进位值和当前计算结果求和 sc=sum/10; /存放进位数值 aj=sum%10; /将余数存入数组 ,i =2(2!=2),i =3(3!=6),i =4(4!=24),i =5(5!=120),j=0 sum=2 sc=0 a0=2 2!=a0=2,j=0 sum=6 sc=0 a0=6 3!=a0=6,j=0 sum=24 sc=2 a0=4,j=0 sum=20 sc=2 a0=0,j=2 sum=20 sc=0 a2=1,j=1 sum=2 sc=2 a1=2,3!=a1a0=24,j=1 sum=1
7、2 sc=1 a1=2,6!=a2a1a0=120,第 13/76 页,主函数,int main() char *p; int n; coutn; if(n=0;i-) if(flag | lpPagei0) flag=TRUE; coutlpPagei; /输出每一位 coutendl; VirtualFree (int *)lpPage + 0,n*1024,MEM_DECOMMIT);/ 对页地址解除提交内存 VirtualFree (lpBase,n*10240,MEM_RELEASE); / 释放整个范围的地址 return 0; ,例3-6源代码,例3-6执行代码,第 14/76
8、页,程序执行结果,第 15/76 页,2 动态连接库的使用,动态链接库(Dynamic-Link Library),简称DLL,是基于Windows程序设计的一个重要组成部分。 优点: 1使用DLL的动态连接不是将库代码拷贝,只在程序中记录函数的入口点和接口,在程序执行时才将库代码装入内存,如果有多个程序使用相同的DLL,也只需将DLL在内存中装载一次,节省了内存开销。 2DLL是基于Windows的程序模块,它不仅包含可执行代码,还可以包含数据,各种资源,扩大了库文件的使用范围。 3对于一个大型的、不断更新的应用程序,可以将许多重复的功能写成DLL,用主程序调用,这样既减少了开发的工作量,又
9、提高了访问速度。 4DLL独立于编程语言,可以使用目前流行的多种计算机语言或开发工具来编制和调用,比如:VC+、C+Builder、PB、VB、Delphi和汇编语言等。,第 16/76 页,例3-7 编写计算圆周率的程序,解题思路 已经提供可以计算任意位小数的圆周率的动态链接库文件“pi.dll”和静态库文件“pi.lib”,需要将它们拷贝到工程的“Debug”子目录中。 在“pi.dll”中存在计算圆周率的函数ComputPI,格式如下: int ComputPI(long bits); 其中,参数bits代表要求的圆周率的小数位数;返回值是0表示成功,是1表示失败。,第 17/76 页,
10、程序步骤, 建立“Win32控制台工程”,工程名称为“Example3_7”; 在工程中添加一个C+源程序文件,文件名称为“Example3_7.cpp”; 在工程中加入文件“pi.lib”。,第 18/76 页,源程序,#include #include int ComputPI(long bits); int main(int argc, char *argv) if (argc “; return 1; char *p; long n=strtol(argv1, ,例3-7源代码,例3-7执行代码,第 19/76 页,程序执行结果,第 20/76 页,四、设备与文件管理应用程序设计,设备
11、管理、文件管理于人机接口管理的相关概念 设备管理程序设计 文件设备管理程序设计 人机接口管理程序设计,第 21/76 页,1. 设备管理与程序设计,主要任务 根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面,以提高设备与设备之间,设备与之间,进程与进程之间的并行性,从而提高整个操作系统的效率。,第 22/76 页,设备和内存之间数据传输方式,操作系统的设备管理程序通过四种控制方式完成设备与内存之间的数据传送。 1程序直接控制方式 中断控制方式 DMA方式 通道方式,第 23/76 页,(1)循环探测I/O方式,通过设置一个测试I/O设备“忙/闲”状态
12、标志的触发器。若它置“闲”,则执行I/O操作,若它置“忙”,则CPU不断对它进行监测,直至设备“闲”下来为止。在早期计算机系统中主要采用这种方式。 由于CPU速度比I/O设备速度高得多,而循环测试I/O方式使得CPU与外部设备只能串行工作,因此CPU绝大部分时间都处于等待I/O设备完成的循环测试中,CPU资源浪费极大。 优点: 管理简单 缺点: 浪费了CPU资源,第 24/76 页,(2)中断处理方式,为了克服循环测试方式的缺点(CPU必须不断主动测试I/O设备是否空闲),引入中断处理技术。该方式的核心就是使I/O设备具有主动“汇报”的能力;每当完成I/O操作后,便给CPU发一个通告信号。只有
13、当CPU接到I/O设备中断请求后,才处理I/O操作。 优点: 速度快,提高了资源的利用率。 缺点:I/O操作还依赖于CPU,如果I/O处理频繁,CPU也将很忙。特别是对字符设备,传送一个字符,就要响应一次中断处理;若字符I/O设备很多、传输量很大时,CPU可能完全陷入I/O处理中而不能自拔。,示例,第 25/76 页,DMA方式(Direct Memory Access),中断方式只能提高CPU的利用率,但在传送数据量大、速度高的情况下,其处理效率就不理想了。 目前在块设备的I/O系统中,采用DMA方式。它是一种简单的通道方式,即在硬件的支持下,通过占用总线控制权,实现信息交换。这种方法并不中
14、断当前CPU的工作,而只是在CPU暂停的几个周期内由DMA控制器实现信息交换。即DMA为具有部分CPU功能的装置。 优点:I/O操作处理速度快。 缺点: DMA方式只能完成简单的数据传输,不能满足更复杂的I/O操作要求,在大、中型计算机系统中,普遍采用I/O处理机来管理外部设备和主存之间的信息交换。,第 26/76 页,(4)通道(Channel)方式,要想把CPU从繁忙的杂务中解放出来,必须使I/O设备的管理不再依赖于CPU。“通道”是具有相对独立的I/O处理能力的装置。如大型机的前端机,PC机的Intel 8090(I/O通道)等。在通道方式下,I/O处理变成了处理机之间的通讯问题。 在采
15、用通道方式的I/O系统中,CPU有两个作用:一是将I/O操作任务下达给通道,由通道代替CPU专门处理I/O工作;二是随时了解通道、控制器和设备工作的情况。,第 27/76 页,设备管理示意图,第 28/76 页,缓冲技术与设备分配,缓冲技术 单缓冲、双缓冲、多缓冲和单缓冲池 设备分配 专门的数据结构 最佳的设备分配原则和策略 设备驱动程序,第 29/76 页,例3-8 光驱管理程序,算法分析 通过使用媒体控制接口(MCI) 的API函数,实现对光驱的操作。 编写命令行式的程序,格式为: 光驱操作命令 光驱号 操作参数 接收命令行的argv1参数,代表光驱盘符,和argv2参数,代表操作命令(O
16、表示打开,C表示关闭); 根据argv2参数的值,分别传递argv1参数调用函数OnCdopen打开光驱和OnCdclose关闭光驱。,第 30/76 页,解题思路,使用“mmsystem.h”中的媒体控制接口(MCI) API函数; MCI_OPEN_PARMS /打开光驱参数结构体 MCI_STATUS_PARMS /光驱状态参数结构体 ZeroMemory函数 /光驱参数赋零,将光驱类型 /参数设为CD_AUDIO mciSendCommand函数 /发送设备打开命令 根据命令参数打开光驱和关闭光驱 最后释放设备存储。,第 31/76 页,对话框框架程序用到的元素,MCI_OPEN_PA
17、RMS结构体 MCI_STATUS_PARMS结构体 mciSendCommand函数 ZeroMemory函数,第 32/76 页,结构体说明光驱管理程序,typedef struct tagMCI_OPEN_PARMS /打开光驱参数 DWORD dwCallback; / MCIDEVICEID wDeviceID; WORD wReserved0; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpstrAlias; MCI_OPEN_PARMS; typedef struct tag MCI_STATUS_PARMS
18、/光驱状态参数 DWORD dwCallback; DWORD dwReturn; DWORD dwItem; DWORD dwTrack; MCI_STATUS_PARMS;,第 33/76 页,设备控制函数说明,MCIERROR mciSendCommand( /发送打开设备命令 MCIDEVICEID IDDevice, /设备标示号 UINT uMsg, /命令消息 DWORD fdwCommand, /命令消息标志 DWORD dwParam /命令消息参数 ); void ZeroMemory ( /初始化数据函数 PVOID Destination, /填充地址 DWORD Le
19、ngth /填充字节大小 );,第 34/76 页,源程序,#include #include #include /MCI API函数头文件 #pragma comment(lib,“winmm“) void CD_OpenCloseDrive(BOOL bOpenDrive, TCHAR cDrive) MCI_OPEN_PARMS op; /光驱打开参数结构 MCI_STATUS_PARMS st; /光驱状态参数结构 DWORD flags; TCHAR szDriveName4; /光驱盘符变量 strcpy(szDriveName, “X:“); :ZeroMemory( /释放设备
20、存取 ,第 35/76 页,子函数源程序,void OnCdopen(CString m_Letter) /打开光驱子函数 CString new_letter = m_Letter; /取得输入光驱盘符 CD_OpenCloseDrive(TRUE, new_letter0);/打开指定盘符光驱 m_Letter = “; void OnCdclose(CString m_Letter) /关闭光驱子函数 CString new_letter = m_Letter; /取得输入光驱盘符 CD_OpenCloseDrive(TRUE, new_letter0);/关闭指定盘符光驱 m_Lett
21、er = “; ,第 36/76 页,主函数,int main(int argc, char *argv) if (argc “; return 1; if( argv20=O ) OnCdopen(argv1); else OnCdclose(argv1); return 0; ,例3-8源代码,例3-8执行代码,第 37/76 页,例3-9 双缓冲显示位图程序,在程序设计中,普通的绘图方法是一个图形一个图形地直接绘制到屏幕上,这样做的缺点是会引起屏幕闪烁。 采用双缓冲技术可以减少屏幕的闪烁。,第 38/76 页,解题思路,本程序采用单文档/视图框架; 本程序中定义一个内存显示设备对象Mem
22、DC、屏幕显示设备对象pDC和位图对象m_Bitmap; 其中CBitmap是MFC提供的一个表示位图文件的位图类,一个位图具有它的类型、大小和颜色值等; 通过MemDC的函数CreateCompatibleDC建立与屏幕显示兼容的内存显示设备; 通过m_Bitmap的函数CreateCompatibleBitmap建立一个与屏幕显示兼容的位图; 通过MemDC的函数SelectObject将位图选入到内存显示设备中; 接着在内存位图中进行绘制; 绘制完成后通过pDC的函数BitBlt将内存中的图拷贝到屏幕上进行显示; 使用完成后,需要清除位图对象m_Bitmap和内存显示设备MemDC。,第
23、 39/76 页,程序步骤, 建立单文档/视图框架程序,工程名为“Example3_9”; 在文件“Example3_9View.cpp”的OnDraw(CDC* pDC) 函数中添加如下代码: CDC MemDC; /首先定义一个显示设备对象 CBitmap m_Bitmap; /定义一个位图对象 int nWidth=500; /绘图宽度 int nHeight=500; /绘图高度 MemDC.CreateCompatibleDC(NULL); /建立与屏幕显示兼容的内存显示设备 m_Bitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 管理 应用程序 设计
链接地址:https://www.31doc.com/p-3106438.html