重庆科技学院。
高级系统程序设计》大作业。
专业班级。学号。
姓名。成绩。
目录。公共部分 3
1请综合比较c/c++中i/o的使用方法与本课程程序实践中所采用的i/o方法各自的特点,并请举例分析说明? 3
i/o 3i/o 3
2请结合具体的例子解释什么是内核对象,对内核对象的操纵与之前学习的对指针的操作方法有什么本质的区别? 4
2.1.内核对象 4
2.2.句柄与指针的区别 5
选题部分 6
题目一:综合比较windows内存管理中内存映射文件和堆2钟方法各自的特点,写出你的详细分析结论并请编程举例说明,必须在大作业中给出你的每个程序的设计思考过程和关键程序**段,完整的源程序可在附录中给出。 6
3.1.堆 6
3.1.1.创建堆 6
3.1.2. 从堆中分配内存块 7
3.1.3再分配内存块 8
3.1.4 释放堆内存、撤消堆 8
3.2.内存映射文件 9
3.2.1创建或打开文件内核对象 9
3.2.2.创建一个文件映射内核对象 10
3.2.3.将文件数据映射到进程的地址空间 10
3.2.4从进程的地址空间中撤消文件数据的映象 11
3.2.5关闭文件映射对象和文件对象 11
总结 12参考文献 13
附录 14i/o是input/output的缩写,即输入输出端口。每个设备都会有一个专用的i/o地址,用来处理自己的输入输出信息。
c通过调用标准库函数来实现对i/o的使用。一般使用的是中的getchar(从标准输入设备读入一个字符)、putchar(向标准输出设备写出一个字符)、scanf(从标准输入设备读入格式化后的数据)、printf(向标准输出设备输出格式化字符串)、gets(从标准输入设备读入一个字符串)、puts(向标准输出设备输出一个字符串)、sprint(把格式化的数据写入某个字符串缓冲区)等函数对i/o进行使用。
c++中没有定义专门的输入、输出(i/o)语句。输入、输出操作是通过i/o流实现的。在中预定义了四个对象cin(用于处理标准输入设备(键盘)的输入)、cout(用于处理标准输出设备(屏幕)的输出)、cerr(用于处理在标准设备上输出出错信息(不带缓冲,即立即显示))、clog(用于处理在标准输出设备上输出错误信息(带缓冲),当缓冲区满时输出)。
c/c++的i/o使用十分简单方便,最简单的就是对printf函数的使用。例如printf(”hello world”/n)这样就可以将hello world输出在屏幕中。
在windows系统中i/o机制有两种:同步i/o和异步i/o。
同步i/o: 线程执行一个输入输出函数时,输入输出工作执行完毕后,函数返回继续执行以后的**。
异步i/o: 线程执行一个输入输出函数时,函数不等待读/写操作完成便立即返回,线程可先去执行下文,执行下文时可查询刚刚发起的读/写操作是否完成。
windows系统中,创建和打开文件都是使用api函数,一般常用的有createfile(创建文件)、writefile(写文件)、readfile(读文件)、closehandle(关闭句柄)等函数。
windows对i/o的使用是需要通过对内核对象调用,通过句柄来标识、引用实现的。但需要遵守windows准则。比如createfile函数就是很好的遵守了windows准则。
handle createfile(
lpctstr lpname,dword dwaccess,dword dwsharemode,lpsecurity_attributes lpsecurityattributes,dword dwcreate,dword dwattrsandflags,handle htemplatefile),许多系统资源以内核对象(kernal object)来表示,它们通过句柄(handle)来标识、引用。内核对象必须由windows api来操作,其包括文件对象、进程对象、线程对象、进程间通信管道对象、内存映射对象以及事件对象等。对象有安全属性。
这些对象是通过调用函数来创建的。例如,createfilemapping函数可使系统能够创建一个文件映射对象。每个内核对象只是内核分配的一个内存块,并且只能由该函数访问。
该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如,进程对象有一个进程id、一个基本优先级和一个退出**,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。
windows用句柄(handle)来唯一标识内核对象,内核对象的操作需要windows特定的api函数、接口,比如文件映射内核对象:
handle createfilemapping(
handle hfile,psecurity_attributes psa,dword flprotect,dword dwmdximumsizchigh,dword dwmaximumsizelow,pctstr pszname);
类型为handle,作为标识,同时参数hfile也属于handle。
再比如文件对象:
handle createfile(
lpctstr lpfilename,dword dwdesiredaccess,dword dwsharemode,lpsecurity_attributes lpsecurityattributes,dword dwcreationdisposition,dword swflagsandattributes,handle htemplatefile
htemplatefile也是handle类型的。所以说handle是用来唯一标识内核对象。
句柄和指针有很明显的区别。
首先,指针指向系统中物理内存的地址,而句柄是windows在内存中维护的一个对象内存物理地址列表的整数索引,句柄是一种指向指针的指针。
在windows系统中的内存管理一般会将当前处于空闲状态的对象的内存释放掉,当需要访问的时候再重新提交分配物理内存,从而导致对象的物理地址是变化的,这样就不允许系统直接通过指针来访问(物理地址不断变化)的对象。
句柄是一种指向指针的指针。由于windows是一种以虚拟内存为基础的操作系统,其内存管理器经常会在内存中来回的移动对象,以此来满足各种应用程序对内存的需求。而对象的移动意味着对象内存地址的变化,正是因为如此,如果直接使用指针,在内存地址被改变后,系统将不知道到**去再调用这个对象。
windows系统为**解决这个问题,系统专门为各种应用程序腾出了一定的内存地址(句柄)专门用来记录这些变化的地址(这些内存地址就是指向指针的指针),这些内存地址本身是一直不变化的。windows内存管理器在移动某些对象之后,他会将这些对象新的内存地址传给句柄,告诉他移动后对象去了**。
windows在堆中维护着内存池。进程可以包含许多堆,可以从堆中分配内存。堆非常适合分配大量的小型数据。
堆是用来管理链表和树的最佳方式。堆的优点是它能让我们专心解决手头上的问题,但缺点是分配和释放内存块的速度比其他方式慢。堆是windows对象,所以它们有句柄。
但是,堆不是内核对象。在分配内存时需要有堆的句柄。每个进程有其自己的默认堆,一个程序也可以创建不同的堆。
有时候用不同的堆来为不同的数据结构分配内存会比较方便。使用不同的堆时会有公平性、多线程性能、分配效率、内存释放效率、引用的局部性带来的效率等好处。
在进程中,如果需要可以在原有默认堆的基础上动态创建一个堆,可由heapcreate()函数完成:
handle heapcreate(
dword floptions,dword dwinitialsize,dword dwmaximumsize
其第一个参数floptions指定了对新建堆的操作属性。该标志将会影响一些堆函数如heapalloc()、heapfree()、heaprealloc()和heapsize()等对新建堆的访问。参数dwinitialsize和dwmaximumsize分别为堆的初始大小和堆栈的最大尺寸。
其中,dwinitialsize的值决定了最初提交给堆的字节数。如果设置的数值不是页面大小的整数倍,则将被圆整到邻近的页边界处。而dwmaximumsize则实际上是系统能为堆保留的地址空间区域的最大字节数。
如果该值为0,那么将创建一个可扩展的堆,堆的大小仅受可用内存的限制。如果应用程序需要分配大的内存块,通常要将该参数设置为0。如果dwmaximumsize大于0,则该值限定了堆所能创建的最大值,heapcreate()同样也要将该值圆整到邻近的页边界,然后再在进程的虚拟地址空间为堆保留该大小的一块区域。
在这种堆中分配的内存块大小不能超过0x7fff8字节,任何试图分配更大内存块的行为将会失败,即使是设置的堆大小足以容纳该内存块。如果heapcreate()成功执行,将会返回一个标识新堆的句柄,并可供其他堆函数使用。
高级系统大作业
重庆科技学院。高级系统程序设计 大作业。专业班级。学号。姓名。成绩。目录。公共部分 2 1请综合比较c c 中i o的使用方法与本课程程序实践中所采用的i o方法各自的特点,并请举例分析说明?2 i o 2i o 2 2请结合具体的例子解释什么是内核对象,对内核对象的操纵与之前学习的对指针的操作方法...
系统辨识大作业
系统辨识。大作业。1.考虑如下系统。式中,为白噪声。取初值,分别选择m序列和方差为1的正态分布白噪声作为输入信号,采用递推最小二乘算法进行参数估计,迭代l 400步停止计算。要求。i 给出基本迭代公式 ii 画出程序流程框图 iii 画出输入输出数据曲线 参数估计曲线 误差曲线 提示 产生长度为l方...
系统辨识大作业
系统辨识大作业 递推增广最小二乘法。题目一 已知一系统为两输入单输出系统,观测数据受有色噪声污染,噪信比为n s 0.1。系统经2000次采样,存放于文件中。系统输入u1为7级m序列,u2为u1的63步移位序列。模型类可选为 a q 1 y k b1 q u1 k b2 q u2 k w k c q...