版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计说明书课程名称:操作系统课程设计专业:计算机科学与技术班级:2012-2 设 计 人:晁子墨山东科技大学2015 年 1 月 14 日2山东科技大学课 程 设 计 任 务 书一、课程设计题目:操作系统二、设计原始资料:操作系统 (第三版)、 现代操作系统三、设计应解决下列各主要问题:1、生产者 - 消费者问题 2、内存管理3、快速文件系统四、设计说明书应附有下列图纸:五、小组分工说明:晁子墨生产者- 消费者问题、内存管理、快速文件系统六、命题发出日期:2014-9-24 设计完成日期:2015-1-15 3指导教师评语成绩:指导教师(签章):年月日4目录题目一生产者 - 消费者问题1需
2、求分析说明51.1 问题描述5 1.2 原理分析6 2概要设计说明62.1 功能描述6 2.2 数据结构分析7 2.3 数据结构图7 3详细设计说明83.1 主函数模块8 3.2 程序流程图8 3.2.1 生产者9 3.2.2 消费者10 4调试分析 114.1 遇到的问题11 4.2 测试结果13 5用户使用说明13 题目二 内存管理系统1 需求分析说明171.1 问题描述 17 1.2 原理分析 18 2 概要设计说明182.1 函数定义说明19 53 详细设计说明213. 1代 码实 现 26 4 调试分析 264. 1运 行 结 果 2 7 4.2 运行结果分析28 5 用户使用说明3
3、0 题目三 快速文件系统1 需求分析说明371.1 设计目的37 1.2 问题描述38 1.3 原理说明38 2 概要设计说明392.1 函数定义说明40 3 详细设计说明413. 1代 码实 现 43 4 调试分析 434. 1运 行 结 果 4 3 4.2 运行结果分析44 5 用户使用说明455.1 用户操作指南46 课 程 设 计总 结 486题目一生产者 - 消费者问题1 需求分析说明生产者 -消费者问题的总体目标: 在 windows 的开发环境下,利用所学 c+语言和数据结构的相关知识,利用程序实现经典的生产者-消费者问题的输出,以帮助我们更好的理解和应用进程同步的原理。1问题描
4、述有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取走产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。这就是生产者-消费者问题。2原理分析在同一个进程地址空间内执行的两个线程。生产者线程生产物品, 然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须
5、等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。2 概要设计说明1功能描述1.1 生产者功能描述在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。当生产者线程生产物品时,如果没有空缓冲区可用, 那么生产者线程必须等待消费者线程释放出一个空缓冲区。71.2 消费者功能描述消费者线程从缓冲区中获得物品,然后释放缓冲区。 当消费者线程消费物品时,如果没有满的缓冲区, 那么消费者线程将被阻塞, 直到新的物品被生产出来。2数据结构分析2.1 生产者与消费者实现:这其中主要
6、是通过多线程,来实现生产者和消费者之间的协调问题。2.2 生产者 (producer) 消费者 (consumer) :通过一些记录性变量,来记录模拟实现生产者的行为,程序采用oo设计模式,缓存区采用队列结构存储。3程序结构图3 详细设计说明1主函数模块1.1 创建互斥信号量、 已占用的缓存区和未被占用的缓存区并进行初始化。1.2 创建生产者线程和消费者线程。81.3 当输入回车时,结束程序。2程序流程图2.1 生产者n y y n 开 始生产产品p(empty)empty0 p (mutex) mutex=1 addtail() empty- v (mutex) v (occupy) 缓冲区
7、内已满, 已无可用缓冲区缓冲区正被其他进程占用92.2 消费者n y y n 开 始p (full) 消费请求full 0 wait (mutex) mutex=1 消 费full - v(mutex) v (empty) 缓冲区内产品已空,不能进行消费缓冲区正被其他进程占用结 束103、程序主要代码publicclassholdintegersynchronized privateint buffer; / 缓冲区privateint occupiedbuffercount = 0; privateint readposition = 0, writeposition = 0; / 下一个读
8、到的位置和写到的位置public holdintegersynchronized(int capacity) buffer = new int capacity; publicint buffersize get return buffer.length; publicint buffer get int buffercopy; / 加锁lock ( this ) while (occupiedbuffercount = 0) / 多个消费者,所以此处改用whileconsole.writeline(thread.currentthread.name + tries to read. ); 1
9、1 displaystate(buffer empty. + thread.currentthread.name + waits.); monitor .wait( this ); / 为临界区之外等待的生产者放行,让他来生产/ 一直到生产者生产结束,调用了monitor.pauseall()/ 才能继续执行下去 , 此时,消费者自动重新获得this 的锁 -occupiedbuffercount; buffercopy = bufferreadposition; readposition = (readposition + 1) % buffer.length; displaystate(t
10、hread.currentthread.name + reads + buffercopy); / 通知,让等待的生产者线程进入started 状态, 如果生产者处于临界区之外,这句话执行完后他仍然在临界区之外monitor .pulseall(this ); / 释放锁 /lockreturn buffercopy; set / 加锁lock ( this ) while (occupiedbuffercount = buffer.length) console.writeline(thread.currentthread.name + tries to write. ); displays
11、tate(buffer full. + thread.currentthread.name + waits.); monitor .wait( this ); 12/ 为临界区之外等待消费者放行,让他来消费 / 一直到消费者调用了monitor.pause()/ 才能继续执行下去,此时,生产者自动重新获得this 的锁 bufferwriteposition = value ; +occupiedbuffercount; writeposition = (writeposition + 1) % buffer.length; displaystate(thread.currentthread.
12、name + writes + value ); / 通知,让 wait状态的消费者进入 started 状态, 如果消费者处于临界区之外,这句话执行完后他仍然在临界区之外monitor .pulseall(this ); / 释放锁 4 调试分析遇到的问题:一开始对创建线程和创建信号量的函数不熟悉,无法着手写程序。通过上网查询并翻阅了参考书之后才慢慢学会使用_beginthread()和createsemaphore() 函数。生产者与消费者测试结果混乱经过检查,发现是没有设置互斥信号量,加入了互斥信号量op_mutex后,保证了任一时刻只有一个进程读写缓存区和相关的变量,从而避免了混乱。在
13、程序显示结果后无法控制结束加入了语句 while(getchar()=n) break;按下回车使程序结束。13测试结果145 用户使用说明程序设置了缓存区数量buf_size = 10,生产者数量 producers = 3 ,消费者数量 consumers = 8 ,运行之后无需输入参数,以下为运行结果:1516题目二 内存管理系统1 需求分析说明内存管理问题的总体目标:在windows 的开发环境下,利用所学c+语言和数据结构的相关知识,利用程序实现内存管理问题的输出,以帮助我们更好的理解和应用进程同步的原理。1设计目的本实验的目的是从不同侧面了解 windows 2000xp 对用户进
14、程的虚拟内存空间的管理、分配方法。同时需要了解跟踪程序的编写方法( 与被跟踪程序保持同步,使用 windows 提供的信号量 ) 。对 windows分配虚拟内存、改变内存状态,以及对物理内存(physical memory)和页面文件 (pagefile)状态查询的 api 函数的功能、参数限制、使用规则要进一步了解。默认情况下, 32 位 windows 2000xp 上每个用户进程可以占有 2gb 的私有地址空间,操作系统占有剩下的 2gb。windows 2000xp 在 x86 体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个 32 位虚拟地址被解释为三个独立的分量页目
15、录索引、页表索引和字节索引它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。2问题描述编写一个程序,包括两个线程,一个线程用于模拟内存分配活动,另一个用于跟踪第一个线程的内存行为,要求两个线程之间通过信号量实现同步,模拟内存活动的线程可以从一个文件中读出要进行的内存操作。每个内存操作包含如下内容:时间 :每个操作等待时间;块数 :分配内存的粒度;操作 :包括保留一个区域、提交一个区域、释放一个区域、回收一个区域、加锁与解锁一个区域。可将它们的编号放置于一个文件中。保留是指保留进程的虚地址空间,而不分配物理地址空间;17提交是指在内存中分配物理地址空间;回收
16、是指释放物理地址空间,而保留进程的虚地址空间;释放是指将进程的物理地址与虚拟地址空间全部释放;大小 :块的大小;访问权限 :共五种page_readonly, page_readwriye, page_exexute, page_exexute _read, page_exexute _readwriye. 3原理分析windows 进程的虚拟地址空间中也有三种状态的页面:空闲页面、保留页面和提交页面。空闲(free) 页面:空闲页面是指那些可以保留或提交的可用页面。保留 (reserved) 页面:保留页面是逻辑页面已分配但没有分配物理存储的页面。设置这种状态的效果是可以保留一部分虚拟地址,
17、这样,如果不预先释放这些地址,就不能被其他应用程序( 如 malloc ,localalloc 等)的操作所使用。 试图读或写空闲页面或保留页面将导致页面出错异常。保留页面可被释放或提交。提交(committed) 页面:提交页面是物理存储 ( 在内存中或磁盘上 ) 已被分配的页面。 可对它加以保护, 不许访问或允许只读访问,或允许读写访问。提交也可以被回收以释放存储空间,从而变成保留页面。在本实验中,首先创建工程(in)生成随机输入文件,其中包含对内存要求作的各种操作; 然后创建工程 memoryallocation ,实现输入文件所要求的各项内存管理操作。2 概要设计说明2.1 函数定义说
18、明(1)handle allo,trac;/ 信号量句柄(2)queue queuereserved; /记录处于保留状态区域的队列(3)queue queuecommited; /记录处于提交状态区域的队列(4)queue queuelocked; /记录处于锁定状态区域的队列(5) dword tracker(lpdword lpdwparm) /跟踪 allocator 线程的内存行为,并输出必要信息(6)void allocator()/ 模拟内存分配活动的线程(7) waitforsingleobject(allo,infinite);/ 等待 tracker打印结束的信号量18(8
19、) switch(tection)/根据文件内容确定权限(9) releasesemaphore(trac,1,null);/ 释放信号量通知 tracker 可以打印信息(10)waitformultipleobjects(2,handle,true,infinite);/ 等待线程执行的执行结束后,再退出。3 详细设计说明程序代码/* 内存管理问题该程序从文件 in 读入每次的操作,完成操作后,由跟踪进程记录结果,输出到out.txt 文件中输入每行为 4 个整数2 2 2 1 10000 第一个数为操作执行所需的时间(毫秒)第二个数为操作的类型第三个数代表操作的块数第四个数代
20、表操作赋给盘块的权限直到读入执行时间大于等于1000时代表程序输入结束注意:其实,只有保留操作时指定的区域大小才会起作用,每次提交的是保留队列中的区域,每次加锁的是提交队列中的区域,每次解锁的是加锁队列中的区域,每次回收的是提交队列中的区域,每次释放的是保留队列中的区域,若队列中无可操作区域,会显示错误信息19bool theend = false; /分配工作全部完成,结束标志bool opersuccess = true; /标识操作是否成功完成queue queuereserved; /记录处于保留状态区域的队列queue queuecommited; /记录处于提交状态区域的队列que
21、ue queuelocked; /记录处于锁定状态区域的队列struct operation /每个操作的详细信息 int time; / 执行所需的时间int block; /内存块数int oper; /操作类型int protection; /权限; struct trace /跟踪每一次分配活动的数据结构 lpvoid start; /起始地址long size; /分配的大小; operation op; handle allo,trac;/ 信号量句柄dword tracker(lpdword lpdwparm) / 跟踪 allocator 线程的内存行为,并输出必要信息 ofs
22、tream outfile; /输出文件20outfile.open(out.txt); for(int i=0; i=10000; i+) /等待 allocator 一次操作结束waitforsingleobject(trac,infinite); if(theend = true) /检测是否结束break; outfile 第i 个操作 t; /outfile 每个块包含的字节数 tinfo.dwpagesizeendl; switch(op.oper) case 0: outfile 保留一个区域endl; if(opersuccess =false) outfile 操作失败,错误
23、号: getlasterror()endl; break; queuereserved.back(); outfile 首地址 :start tt大小:sizeendl 执行时间 :op.timett 权限 :tection endl; break; 21 case 1:/ 提交一个区域 outfile 提交一个区域endl; if(opersuccess =false) outfile 操作失败,错误号: getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 执行时间 :op.timett 权限 :te
24、ction endl; break; case 2:/ 锁一个区域 outfile 加锁一个区域endl; if(opersuccess =false) outfile 操作失败,错误号: getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 执行时间 :op.timett 权限 :tection endl; 22break; case 3:/ 解锁一个区域 outfile 解锁一个区域endl; if(opersuccess =false) outfile 操作失败,错误号: getlasterror()endl;
25、 break; outfile 首地址 :start tt大小:sizeendl 执行时间 :op.timett 权限 :tection endl; queuelocked.pop(); break; case 4:/ 回收一个区域 outfile 回收一个区域endl; if(opersuccess =false) outfile 操作失败,错误号: getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 23执行时间 :op.timett 权限 :tection endl; queuecommited.
26、pop(); break; case 5:/ 释放一个区域 outfile 释放一个区域endl; if(opersuccess =false) outfile 操作失败,错误号: getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 执行时间 :op.timett 权限 :tection endl; queuereserved.pop(); break; default: break; 24 4 调试分析1. 运行结果in.txt 100 0 4 1 100 0 2 3 200 0 3 4 100 1 5 1 10
27、0 1 2 1 100 2 4 1 100 3 4 1 100 4 4 1 100 5 2 1 100 5 3 1 100 0 4 2 100 5 5 1 200 0 3 0 100 1 5 1 100 1 2 2 100 2 4 1 100 5 5 2 10000 out.txt 第 0 个操作 保留一个区域首地址 :0 x20000 大小:16384 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1962770432 可用虚拟内存字节数 : 2129485824 * 第 1 个操作 保留一个区域首地址 :0 x30000 大小:8192 执行时间
28、:100 权限:3 25每个块包含的字节数 : 4096 可用物理内存字节数 : 1951789056 可用虚拟内存字节数 : 2129477632 * 第 2 个操作 保留一个区域首地址 :0 x3b0000 大小:12288 执行时间 :200 权限:4 每个块包含的字节数 : 4096 可用物理内存字节数 : 1954570240 可用虚拟内存字节数 : 2129465344 * 第 3 个操作 提交一个区域首地址 :0 x20000 大小:16384 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1954562048 可用虚拟内存字节数 : 2
29、129465344 * 第 4 个操作 提交一个区域首地址 :0 x30000 大小:8192 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1954562048 可用虚拟内存字节数 : 2129465344 * 第 5 个操作 加锁一个区域首地址 :0 x20000 大小:16384 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1954549760 可用虚拟内存字节数 : 2129465344 * 第 6 个操作 解锁一个区域首地址 :0 x20000 大小:16384 执行时间 :100 权限:1 每个块
30、包含的字节数 : 4096 可用物理内存字节数 : 1954557952 26可用虚拟内存字节数 : 2129465344 * 第 7 个操作 回收一个区域首地址 :0 x30000 大小:8192 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1954557952 可用虚拟内存字节数 : 2129465344 * 第 8 个操作 释放一个区域首地址 :0 x3b0000 大小:12288 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1954603008 可用虚拟内存字节数 : 2129477632 * 第
31、9 个操作 释放一个区域首地址 :0 x30000 大小:8192 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955135488 可用虚拟内存字节数 : 2129485824 * 第 10 个操作保留一个区域首地址 :0 x30000 大小:16384 执行时间 :100 权限:2 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955135488 可用虚拟内存字节数 : 2129469440 * 第 11个操作释放一个区域首地址 :0 x30000 大小:16384 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可
32、用物理内存字节数 : 1955131392 可用虚拟内存字节数 : 2129485824 * 27第 12 个操作保留一个区域首地址 :0 x30000 大小:12288 执行时间 :200 权限:0 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955557376 可用虚拟内存字节数 : 2129473536 * 第 13 个操作提交一个区域首地址 :0 x30000 大小:12288 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955532800 可用虚拟内存字节数 : 2129473536 * 第 14 个操作提交一个区域操作失
33、败,错误号: 183 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955557376 可用虚拟内存字节数 : 2129473536 * 第 15 个操作加锁一个区域首地址 :0 x20000 大小:16384 执行时间 :100 权限:1 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955532800 可用虚拟内存字节数 : 2129473536 * 第 16 个操作释放一个区域操作失败,错误号: 183 每个块包含的字节数 : 4096 可用物理内存字节数 : 1955540992 可用虚拟内存字节数 : 2129473536 * 282. 运行结果分析(1)
34、 采用不同的方式对文件进行操作所需要花费的时间也不同。(2) 各种对文件操作的方式各有各的优点和不足,使用时应根据具体的情景做最好的选择。(3) 通过对两个线程的操作,并用一个线程对另一个线程进行跟踪,进行保留,提交、锁定、释放。而且当超出一定范围后就让其输出操作错误,提示:操作失败,没有保留区域可供释放。5 用户使用说明1. 用户操作指南(1) 将内存管理 .exe在 code: :blocks 10.05下打开,如下:29(2) 单击编译运行按钮,该exe程序即可运行,如下:题目三 快速文件系统1 需求分析说明2设计目的众所周知,cpu 是整个计算机系统中运算速度最快的部分,而外部设备是最
35、慢的部分,它们之间存在着很大的差别。然而,cpu 却时时刻刻可能要求访问外部设备。 如果 cpu 的每次操作都必须等待外部设备完成,那么 cpu 宝贵的运行时间就会大大浪费, 如何减小 cpu 对外部设备操作的干预,能够提高cpu 的运行效率。随着现代计算机技术的发展,大多30数现代操作系统都对这个问题进行了处理。2问题描述设计一个函数 int filter (char source ,char* sink,int f)其中source :源文件,即从哪个文件中读取数据;sink:目标文件,即将数据写入哪个文件;f:一个对文件的操作(可以任意定义) 。分别用三种方式实现对一个文件的操作:(1)
36、 无缓冲区方式:表示使用的标志位是file_flag_no_buffering ;(2) 缓冲方式:表示使用的标志位是file_flag_sequential_scan ;(3)异步方式:表示使用的标志位是file_flag_overlapped 。具体说明:filter 函数的作用是从 source文件中读取数据,经过操作f 后,写入文件sink 中。整个过程需要三个部分完成:(1)建立三个 filter 文件(功能不同),并自己生成一个源文件(大小不小于 512kb) ,作为 file1,经过 10 步,写入 sink, 记录总体时间。 即从 file1写入 file2,从 file2 写
37、入 file3,从 file9 写入 file10,从 file10 写入 sink文件。(2)用 createfile 建立文件时使用 file_flag_sequential_scan标志,系统将给文件加上缓冲区,与(1)类似,做 10次读写。注意缓冲区大小必须小于文件大小。(3)用 createfile 建立文件时使用file_flag_overlapp标志,将使用异步传输。同( 1) (2)一样做 10 次读写。3原理说明3.1.文件高速缓存文件高速缓存是cpu 访问外设的一个 “ 中间设备 ” 。说是设备,其实它不是真正的物理设备, 而是一种核心级内存映像机制。 由于它被设置在内存中
38、,因此速度非常快,可以部分解决cpu 与硬盘速度差异的问题。文件系统的驱动程序通过调用“ 高速缓存管理程序 ” 来使用文件高速缓存,然后高速缓存管理程序执行高速缓存的处理工作。31文件高速缓存的原理是: 假设一个进程读了文件的第一个字节,它常常会按照顺序读第二个第三个字节,一直到读出所有的字节。 利用这个原理可以进行 “ 预取” ,也就是说,在进程没请求读磁盘之前就先把文件读出来并放到高速缓存中。 这样,当进程请求访问磁盘时, 高速缓存可以快速地把已经取到内存中的文件内容直接送给进程使用,从而大大加速了访问磁盘的速度。 另外,由于一个文件可能会被多次读入,因此可以在第一次读入后,将文件数据保存
39、在高速缓存中。这样,下次再读时,就不必从硬盘而可以从缓存中读取。利用lru(least recently used)的原则,可以将不常使用的文件从缓存中删除以节省高速缓存空间。3.2.异步传输与文件高速缓存不同, 文件的异步传输是一种改变指令执行顺序的机制。在以往的操作系统中, 指令都是顺序执行的, 下一条指令必须在上一条指令执行完毕后才能执行。因此,如果cpu 遇到一条放盘指令,那么它就必须等待缓慢的磁盘访问结束以后才能进行后续工作。如果它后面遇到的指令并不依赖于访盘操作时, 这个等待就很没有必要。 windows2000中使用了一种异步文件传输机制来解决这个问题。它通过设置打开文件时的一个
40、标志位来使进程不等待读些文件操作而继续执行。当后续指令必须用到磁盘访问的结果数据时,它在通过一条wait 指令进行等待。这样,在访盘指令和等待指令之间的指令就可以与磁盘访问同时进行了,从而大大加快了系统的整体速度。2 概要设计说明2.1 函数定义说明(1)handle_src = createfile(source, generic_read, null, null, open_existing, file_flag_no_buffering , null); /读取 read文件对象的句柄(2) handle_dst = createfile(sink, generic_write, nul
41、l, null, create_always, null, null); /读取 write 文件对象的句柄(3)readfile(handle_src, buffer, buffer_size, &numberofbytesread, null); /读取文件32(4)writefile(handle_dst, buffer, numberofbytesread, &numberofbyteswrite, null) ;/把缓冲的信息写入到文件中(5)closehandle(handle_src); closehandle(handle_dst);/ 关闭句柄(6)void
42、filter_nobuffer(char *source, char *sink, void (*func) (char *addr)/ 没有文件高速缓存的filter 函数(7)void filter_sequen(char *source, char *sink, void (*func) (char *addr) / /有文件高速缓存的filter 函数(8)void filter_overlp(char *source, char *sink, void (*func) (char *addr) / /有异步传输的 filter 函数333 详细设计说明3主要程序代码/ 没有文件高速缓
43、存的filter 函数void filter_nobuffer(char *source, char *sink, void (*func) (char *addr) handle handle_src, handle_dst; / handles of source file and destination file bool cycle; dword numberofbytesread, numberofbyteswrite, index; / open the source file handle_src = createfile(source, generic_read, null,
44、null, open_existing, file_flag_no_buffering , null); handle_dst = createfile(sink, generic_write, null, null, create_always, null, null); if(handle_src = invalid_handle_v alue | handle_dst = invalid_handle_v alue) coutcreatefile invocation error!endl; exit(1); cycle = true; while(cycle) / read data
45、and send them into buffer from the source file if(readfile(handle_src, buffer, buffer_size, &numberofbytesread, null) = false) coutreadfile error!endl; exit(1); 34if(numberofbytesread buffer_size) cycle = false; for(index = 0; index numberofbytesread; index +) func(&bufferindex); if(writefil
46、e(handle_dst, buffer, numberofbytesread, &numberofbyteswrite, null) = false) coutwritefile error!endl; exit(1); closehandle(handle_src); closehandle(handle_dst); void filter_sequen(char *source, char *sink, void (*func) (char *addr) handle handle_src, handle_dst; bool cycle; dword numberofbytesr
47、ead, numberofbyteswrite, index; handle_src = createfile(source, generic_read, null, null, open_existing, file_flag_sequential_scan, null); handle_dst = createfile(sink, generic_write, null, null, create_always, file_flag_sequential_scan, null); if(handle_src = invalid_handle_v alue | handle_dst = in
48、valid_handle_v alue) coutcreatefile invocation error!endl; exit(1); cycle = true; while(cycle) / read data and send them into buffer from the source file if(readfile(handle_src, buffer, buffer_size, 35&numberofbytesread, null) = false) coutreadfile error!endl; exit(1); if(numberofbytesread buffe
49、r_size) cycle = false; for(index = 0; index numberofbytesread; index +) func(&bufferindex); / write the content of the buffer to the destination file if(writefile(handle_dst, buffer, numberofbytesread, &numberofbyteswrite, null) = false) coutwritefile error!endl; exit(1); closehandle(handle_
50、src); closehandle(handle_dst); void filter_overlp(char *source, char *sink, void (*func) (char *addr) handle handle_src, handle_dst; bool cycle; dword numberofbytesread, numberofbyteswrite, index, dwerror; overlapped overlapped; handle_src = createfile(source, generic_read, null, null, open_existing
51、, file_flag_no_buffering | file_flag_overlapped, null); handle_dst = createfile(sink, generic_write, null, null, create_always, null, null); if(handle_src = invalid_handle_v alue | handle_dst = invalid_handle_v alue) coutcreatefile invocation error!endl; 36exit(1); overlapped.hevent = null; overlapped.offset = -buffer_size; overlapped.offsethigh = 0; cycle = true; while(cycle) overlapped.offset = overlapped.offset + buffer_size; if(readfile(handle_sr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 雷达产品工艺介绍
- 幼儿假期安全教育
- 肠内外营养并发症处理流程
- 疼痛的分类方法
- 机械班组协议书
- 男女朋友之间的协议书
- 合同补充协议书
- 拍摄 保密协议书
- 2025年西师版五年级英语上册月考考试试题及答案
- 托管中心协议书
- 2025年-2026年(二级)企业培训师考试题库及答案
- 电网数字孪生和人工智能技术的融合发展思路方案
- 自动控制原理系统维护规定
- 2025华夏银行兰州分行招聘笔试历年典型考题及考点剖析附带答案详解
- 医疗救助知识培训课件
- 2025中级注册安全工程师《专业实务-矿山安全》案例 50 问
- 公文格式错误专项纠正案例集
- 2025年电大考试及答案
- 2025-2030中国CAR-T细胞疗法行业竞争格局及前景分析报告
- 电磁场与电磁波(第6版)课件 第6章 均匀平面电磁波的空间传播分析
- 杭州之江城市建设投资集团有限公司下属子公司公开招聘工作人员4人笔试备考题库及答案解析
评论
0/150
提交评论