操作系统试验.doc_第1页
操作系统试验.doc_第2页
操作系统试验.doc_第3页
操作系统试验.doc_第4页
操作系统试验.doc_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 实验一实验一 进程控制和调度进程控制和调度 实验目的 用高级语言编写和调试进程调度的模拟程序 以加深对进程调度算法的理解 实验内容 1 自定义进程相关的数据结构 2 利用 MFC 类库中的栈 queue 链表 list 向量 vector 等模板模拟进程控制块队列 进 程控制块优先级队列 统计信息链表及其指令集合 3 利用 MSDN 和 MFC API 编程实现常见的进程控制和调度策略 先来先服务算法 时 间片轮转算法 最高优先权优先调度算法 最短进程优先调度算法 4 测试以上进程调度策略的周转时间 带权周转时间 平均周转时间和平均带权周转时 间 并定性评价它们的性能 预备知识 1 信号相关的系统调用 SetConsoleCtrlHandler 定义或取消本进程的信号处理例程列表中的用户定义例程 GenerateConsoleCtrlEvent 发送信号到与本进程共享同一控制台的控制台进程组 这一组系统调用处理的信号有 5 种 是 Windows2000 XP 特有的 包括 CTRL C EVENT CTRL BREAK EVENT CTRL CLOSE EVENT CTRL LOGOFF EV ENT CTRL SHUTDOWN EVENT 2 临界区有关的系统调用 InitializeCriticalSection 初始化临界区对象 EnterCriticalSection 等待占用临界区的使用权 TryEnterCriticalSection 非等待方式申请临界区的使用权 LeaveCriticalSection 释放临界区的使用权 DeleteCriticalSection 释放与临界区对象相关的所有系统资源 3 线程相关的系统调用 CreateThread 创建一个线程内核对象 线程执行指定的 ThreadProc 例程 ThreadProc 线程执行例程 ExitThread 终止线程的运行 同时操作系统清除该线程使用的所有操作系统资源 TerminateThread 撤消任何线程 线程的内核对象的使用计数也被递减 但系统 不撤消该线程的堆栈 线程函数返回是确保所有线程资源被正确地清除的唯一办法 以上的系统调用详细资料参考 MSDN 网站或光盘 4 进程调度常用算法的相关知识参考课堂 计算机操作系统 教材 5 MFC 栈 queue 链表 list 向量 vector 相关知识参考 MSDN 网站或光盘 实验指导 1 进程相关的数据结构 进程状态 enum PROCSTATUS 2 Ready 就绪 Block 阻塞 Run 运行 进程优先级 enum PROCPRIORITY Low 低 LowStandard 低于标准 Standard 标准 HighStandard 高于标准 High 高 RealTime 实时 调度算法 enum SCHEDULEALGORITHM FCFS 先来先服务 SPF 短进程优先 FPF Reaved 抢占式高优先级 TimePiece 时间片轮转 进程标识符 struct PROCID intnInID 内部标识符 intnOutID 外部标识符 处理机状态 struct PROCESSORSTATUS intnIP 指令指针 进程调度信息 struct PROCSCHINFO PROCSTATUSstatusProc 进程状态 PROCPRIORITY procPriority 进程优先级 进程控制信息 struct PROCCONINFO PCB pNextPCB 下一 PCB 3 程序 struct PROGRAM intnProgLen 程序大小 intnIP 指令指针 SYSTEMTIMEtimeSystem 程序请求运行时间 INSTRUCTIONSETinstructionSet 指令集合 统计信息 struct STATINFO intnRequestTime 进程请求运行时间 int nGetCPUTime 系统为之提供服务时间 进程控制块 struct PCB STATINFOinfoStat 统计信息 PROCIDidProc 进程标识符 PROGRAMprogram 该进程对应的程序 PROCESSORSTATUS statusProcessor 处理机状态 PROCSCHINFOinfoProcSch 进程调度信息 PROCCONINFOinfoProcCon 进程控制信息 统计信息 程序长度 struct STATINFO PROGLEN int nProgLen 程序长度 int nProcID 进程 ID int nPeriod 周转时间 int nWeightPeriod 带权周转时间 bool operator STATINFO PROGLEN infoStat return nProgLen infoStat nProgLen 统计信息 进程优先级 struct STATINFO PRIORITY PROCPRIORITY procPriority 进程优先级 intnProcID 进程 ID intnPeriod 周转时间 intnWeightPeriod 带权周转时间 bool operator STATINFO PRIORITY infoStat return procPriority infoStat procPriority 4 2 进程调度算法和性能测试程序的主要模块 DWORD WINAPI GetRandProc LPVOID lpParam 产生随机随机进程并插入就绪队列 void Schedule FCFS FCFS 调度 void Schedule SPF 短作业优先 void Schedule FPF Reaved 高优先权调度 void Schedule TimePiece 时间片调度 void Schedule 调度程序 BOOLRunProc PCB pPcb 运行进程 void Exit 退出系统 void PressAnyKey 按任意键继续 void CoolBeep UINT uiCbSort 蜂鸣声 void Reset SCHEDULEALGORITHM algo 重新设置初值 void PrintPriority PROCPRIORITY p 以文字方式打印优先级 BOOLCtrlHandler DWORD dwCtrlType 处理控制台事件 void Clean 事后清理 void PrintAlgorithm SCHEDULEALGORITHM algo 打印算法 打印统计信息 程序长度 void PrintStatInfo ProgLen STATINFOL PROGLEN l SCHEDULEALGORITHM algo 打印统计信息 进程优先级 void PrintStatInfo Priority STATINFOL PRIORITY l SCHEDULEALGORITHM algo void SortInsProgLenQ PCBPQUEUE 按程序大小入队列 void SortInsPriorityQ PCBPQUEUE 按优先级入队列 3 全局变量 intg nCloseTime 模拟时间 intg nMaxRunTime 程序最大运行时间 intg nMaxInterval 最大间隔 intg nMaxTimePiece 最大时间片 intg nCurProcID 0 当前进程 ID PCBg CurRunningProc 当前正在运行的进程 intg nFinishedTime 0 模拟已完成的时间 BOOLg bIsEnd FALSE 结束标志 BOOLg bProgIsRun 是否有程序正在运行 BOOLg bIsPrioritierReach FALSE 是否有优先级更高的进程达到 PCBg pcbPrioritier 更高优先级的进程 PCBQUEUEg pcbReadyQueue 就绪队列 PCBPQUEUEg pcbReadyPriorityQueue 就绪优先级队列 SCHEDULEALGORITHM g ScheduleAlgorithm 调度算法 CRITICAL SECTION g CriticalSection 临界区 STATINFOL PROGLENg listStatInfoProgLen 3 统计信息链表 程序长度 STATINFOL PRIORITYg listStatInfoProcPriority 统计信息链表 进程优先级 HANDLE g hStdOut GetStdHandle STD OUTPUT HANDLE 标准输出 控制台句柄 4 自定义宏 颜色 define CLR GREEN10 绿 define CLR RED12 红 5 define CLR SECRED13 次红 define CLR YELLOW14 黄 define CLR INCLR RED 输入颜色 define CLR NORMALOUTCLR GREEN 一般输出颜色 define CLR CRITICALOUTCLR RED 重要输出颜色 define CLR NORMALRESULTCLR YELLOW 一般结果输出颜色 define CLR CRITICALRESULTCLR RED 重要结果输出 define CLR SECCRITICALRESULTCLR SECRED 次重要结果输出 声音类型 define CB ERROR0 错误 define CB OK1 正确 define RANDDFrand 1 0 RAND MAX 产生 0 1 之间的随机小数 struct PCB struct PCBPriorityCompare struct PCBProgLenCompare struct STATINFO PROGLEN struct STATINFO PRIORITY typedef intINSTRUCTION 指令 typedef queuePCBQUEUE 进程控制块队列 typedef listPCBPQUEUE 进程控制块优先级队列 typedef vectorINSTRUCTIONSET 指令集合 typedef listSTATINFOL PROGLEN 统计信息链表 程序长度 typedef list STATINFOL PRIORITY 统计信息链表 进程优先级 5 参考程序 主函数 int main int argc TCHAR argv TCHAR envp UCHAR ucSelection 选择号 srand time 0 InitializeCriticalSection SetConsoleTitle 进程调度算法演示及其性能测试系统 设置标题 SetConsoleCtrlHandler PHANDLER ROUTINE CtrlHandler TRUE ucSelection getch switch ucSelection case 1 case 2 case 3 case 4 g ScheduleAlgorithm SCHEDULEALGORITHM ucSelection 1 FCFS Reset g ScheduleAlgorithm CreateThread 0 0 GetRandProc 0 0 0 生产线程 产生进程 与主线程同步 6 Schedule 主线程 按指定调度算法调度生产线程产生的各个进程 break case 5 Exit Exit break 产生随机进程并插入就绪队列 DWORD WINAPI GetRandProc LPVOID lpParam PROCPRIORITY procPriority int nProgLen PCB pcb UINT uDelay int i INSTRUCTION instruction PROGRAM program ContinueGet program instructionSet clear nProgLen RANDDF g nMaxRunTime 1 1 procPriority PROCPRIORITY int RANDDF Low RealTime RealTime pcb infoProcSch procPriority procPriority pcb infoStat nRequestTime GetTickCount pcb infoStat nGetCPUTime 0 产生随机程序 program nIP 0 GetLocalTime program instructionSet reserve nProgLen pcb idProc nInID g nCurProcID program nProgLen nProgLen for i 0 i nProgLen i instruction rand program instructionSet push back instruction pcb program program EnterCriticalSection SetConsoleTextAttribute g hStdOut CLR SECCRITICALRESULT switch g ScheduleAlgorithm 7 case FCFS cout endl 进程 setw 2 g nCurProcID 请求运行 其请求时间为 SetConsoleTextAttribute g hStdOut CLR NORMALOUT cout setw 2 program timeSystem wMinute 分 setw 2 program timeSystem wSecond 秒 setw 3 program timeSystem wMilliseconds 微秒 endl break case SPF cout endl 进程 setw 2 g nCurProcID 请求运行 其长度为 SetConsoleTextAttribute g hStdOut CLR NORMALOUT cout program nProgLen endl break case FPF Reaved cout endl 进程 setw 2 g nCurProcID 请求运行 其优先级为 SetConsoleTextAttribute g hStdOut CLR NORMALOUT PrintPriority procPriority cout endl break case TimePiece cout endl 进程 setw 2 g nCurProcID 请求运行 其长度为 SetConsoleTextAttribute g hStdOut CLR NORMALOUT cout program nProgLen 8 g pcbReadyPriorityQueue front infoProcSch procPriority g bIsPrioritierReach TRUE g pcbPrioritier pcb SortInsPriorityQ g pcbReadyPriorityQueue pcb LeaveCriticalSection break case TimePiece g pcbReadyPriorityQueue push back pcb break uDelay RANDDF g nMaxInterval 1 1 if g nFinishedTime uDelay g nCloseTime g nCurProcID Sleep uDelay goto ContinueGet else g bIsEnd TRUE return 0 调度程序 void Schedule switch g ScheduleAlgorithm case FCFS Schedule FCFS break case SPF Schedule SPF break case FPF Reaved Schedule FPF Reaved break case TimePiece Schedule TimePiece break 9 FCFS 调度 void Schedule FCFS PCB pcb PROGRAM program int nIP 0 Schedule if g bIsEnd PrintStatInfo ProgLen g listStatInfoProgLen FCFS FCFS return if g pcbReadyQueue empty goto Schedule EnterCriticalSection pcb g pcbReadyQueue front g pcbReadyQueue pop LeaveCriticalSection RunProc 添加统计信息 STATINFO PROGLEN infoStat infoStat nPeriod GetTickCount pcb infoStat nRequestTime infoStat nProgLen pcb program nProgLen infoStat nProcID pcb idProc nInID infoStat nWeightPeriod infoStat nPeriod pcb infoStat nGetCPUTime g listStatInfoProgLen FCFS push back infoStat goto Schedule 6 运行结果 进程调度算法演示及其性能测试系统 1 先来先服务 2 短进程优先 3 抢占式高优先权 4 时间片轮转 5 退出系统 10 请选择 1 进程 0 请求运行 其请求时间为 52 分 49 秒 125 微秒 进程 0 开始运行 其请求运行时间为 52 分 49 秒 125 微秒 进程 0 正在运行指令 18BE 进程 0 运行完毕 进程 1 请求运行 其请求时间为 52 分 50 秒 31 微秒 进程 1 开始运行 其请求运行时间为 52 分 50 秒 31 微秒 进程 1 正在运行指令 2CD6 进程 1 运行完毕 进程 14 运行完毕 算法 先来先服务 程序长度 进程 ID 周转时间 带权周转时间 1 0 94 47 3 8 93 46 3 10 219 109 4 2 141 70 8 5 141 8 9 7 157 9 9 9 172 10 9 12 125 7 11 3 79 4 12 1 157 78 13 11 94 5 14 6 204 12 16 13 47 2 17 4 204 12 18 14 219 13 平均周转时间为 143 平均带权周转时间为 28 7 性能评价 先来先服务算法 该算法思想是按照进入就绪队列的先后次序来分配处理机 FCFS 采 用非剥夺调度方式 即一旦某个进程占有处理机 就一直运行下去 直到该进程完成其工 作或因等待某一事件而不能继续执行时才释放处理机 该算法原理简单 易于实现 各进程平等竞争 由于各进程执行的时间不一样 从而导致相对不公平现象的产生 该算法有利于长进程 不利于短进程 该算法很少用来作为主调度策略 常常用作辅助调度算法使用 11 其他调度算法的程序代码 运行结果 性能评价等实验内容参考先来先服务算法 8 思考题 queue list vector 对象之间有什么异同 它们是否都可以用来实现进程队列 Windows 线程函数格式是什么 线程与进程有什么区别和联系 Windows 线程之间有哪些对象可以用来满足同步要求 12 实验二实验二 银行家算法银行家算法 一 一 实验目的和意义实验目的和意义 了解掌握银行家算法 学会模拟实现资源分配 同时有要求编写和调试一个系统分配 资源的简单模拟程序 观察死锁产生的条件 并使用适当的算法 有效的防止和避免死锁 的发生 二 方案设计及开发过程二 方案设计及开发过程 1 实验背景 在多道程序系统中 虽可借助与多个进程的并发执行 来改善系统的资源利用率 提 高系统的吞吐量 但可能发生一种危险 死琐 产生死锁的原因可归结为两点 1 竞争资源 当系统中供多个进程共享的资源如打印机 公用队列等 其数目不足 以满足诸进程的需要时 会引起诸进程对资源的竞争而产生死锁 2 进程间推进顺序非法 进程在运行过程中 请求和释放资源的顺序不当 也同样 会导致产生进程死锁 最有代表性的避免死锁的算法 是 Dijkstra 的银行家算法 这是由于该算法能用与 银行系统现金贷款的发放而得名的 2 算法描述 设 Request i 是进程 Pi 的请求向量 如果 Requesti j K 表示进程 Pi 需要 K 个 Rj 类 型的资源 当 Pi 发出资源请求后 系统按下面步骤进行检查 1 如果 Requesti j Need i j 便转向步骤 2 否则认为出错 因为它所需要的资源 数已超过它所宣布的最大值 2 如果 Requesti j Available j 便转向步骤 3 否则 表示尚无足够资源 Pi 须等 待 3 系统试探着把资源分配给进程 Pi 并修改下面数据结构中的数值 Available j Available j Requesti j Allocation i j Allocation i j Requesti j Need i j Need i j Requesti j 4 系统执行安全性算法 检查此次资源分配后 系统是否处于安全状态 若安全 才正式将资源分配给进程 Pi 以完成本次分配 否则 将本次的试探分配作废 恢复原来的资源分配状态 让进程 Pi 等待 3 数据结构 13 银行家算法中的数据结构 1 可利用资源向量 Available 这是一个含有 n 个元素的数组 其中的每一个元素代 表一类可利用的资源数目 其初始值是系统中所配置的该类全部可用资源的数目 其数值随该类资源的分配和回收而动态地改变 如果 Available j K 则表示系统 中现有 Rj 类资源 K 个 2 最大需求矩阵 Max 这是一个 m n 的矩阵 它定义了系统中 n 个进程中每一个进 程对 m 类资源的最大需求 如果 Max i j K 则表示进程 i 需要 Rj 类资源的最大数 目为 K 3 分配矩阵 Allocation 这也是一个 m n 的矩阵 它定义了系统中每一类资源当前已 分配给每一进程的资源数 如果 Allocation i j K 则表示进程 i 当前已分得 Rj 类资 源的数目为 K 4 需求矩阵 Need 这也是一个 n m 的矩阵 用以表示每一个进程尚需的各类资源数 如果 Need i j K 则表示进程 i 还需要 Rj 类资源 K 个 方能完成其任务 5 工作数组 Work 这是一个含有 n 个元素的数组 它代表可以提供分配的资源数 初始值是 Available 中的数值 随着资源的回收 它的值也会改变 公式是 Work i Work i Allocation i 4 主要函数说明 主要函数主要有四个 1 Main 主函数 用来显示资源的分配情况和提示信息 同时用 Main 函数来调用 其它子程序 2 Safe 函数 用来检查是否有安全序列 如果存在则返回一个 1 给主函数 否 则返回 0 3 Disp 函数 用来显示随机生成的资源包括 Max Need Allocation Available 4 Request 函数 用来进行资源请求 分为手动的和随机申请 同时对申请的资源进 行判断 检查申请是否有效 如果有效则返回一个 1 给主函数 否则返回 0 14 程序初始化 随机分配资源 并显示在屏幕 检查安全序列 是否要申请 资源 退出程序 输入 Request Request Need Request Available Need i j Need i j Request j Available j Available j Request j 报错 检查安全序列 保留原始 Available Request 恢复原始 Available Request 判 Allocation Max Available j Max i j work j Finish i 1 输出结果 5 算法流程图 N Y Y N N Y N Y Y 15 三 调试记录与分析三 调试记录与分析 在调试过程中为了显示安全序列的检查状况 在检查 Available 是否满足 Need 时 要检查 m n 遍 并存在表达有歧异 经过修改后 就不需要全部检查 而是 Available 只 要有一个不满足 Need 就停止检查 图 3 1 修改前 图 3 2 修改后 四 运行结果及说明四 运行结果及说明 图 4 1 不存在安全序列 随机分配完资源后 进行安全检查 在检查过程中在屏幕上显示检查信息 上图为资 源分配不安全时显示的信息 图 4 2 存在安全路径 16 存在安全路径后 在屏幕上显示变化过程和安全路径 提示是否申请资源 图 4 3 申请资源 提出申请后 询问进行随机分配资源还是手动分配 图 4 4 手动分配 图 4 5 随机分配 五 实验总结五 实验总结 附录附录 17 include include include define M 3 define N 3 int Need M N Allocation M N Avalible N Max M N finish N Need 进程需要的资源数 Allocation 进程已分配的资源 Avalible 进程可供分配的资源 void display int a int n 显示一维数组 int i for i 0 i n i printf 3d a i void disp 显示资源列表 int i j k h l printf Nnumber t Max t t need t t allocation t avalible n for i 0 i M i printf p d t i display Max i N printf t display Need i N printf t display Allocation i N printf t if i 0 display Avalible N printf n int grand int a int b int n 分配资源 int i for i 0 i n i a i b i int check int a int b int n 检查 Allocation 是否与 Max 相等 int i for i 0 i n i if a i b i return 0 return 1 int compare int a int b int n 比较数组的大小 int i char flag for i 0 i n i if a i b i return 0 return 1 int comp int a int b int n int m 比较数组 int i for i 0 ib i if m 1 printf request Number d resouce have an error request overflow avalible d n i 1 i if m 2 printf request Number d resouce have an error request overflow Need d n i 1 i return 0 return 1 18 void dec int a int b int n 数组相减 int i for i 0 i n i a i b i char input 输入数据 char c c getchar 0 x30 return c void add int a int b int n int m 数组相加 int i for i 0 i n i a i b i for i 0 i n i if m 0 printf Avalible d d i a i if m 3 printf n if m 1 printf work valuese changed work d d n i a i printf n 检查安全序列 int safe int i count 0 n j r1 1 int work N sr M flag int finish1 N grand work Avalible N printf check safe list n for i 0 i N i finish1 i 1 for n 0 n M n for i 0 ineed d n i break if finish1 i 1 add work Allocation i N r1 finish1 i 1 sr count i count 记录安全序列 if count M printf have an safe list n for i 0 i sr i else printf p d n sr i return 1 else printf after check there no safe list n printf can t apply resouce n return 0 随机请求资源 int ran request int i flag1 flag2 r1 1 r2 2 r3 3 int request N pn pn rand 2 19 printf Process d call for resouce n pn for i 0 i N i request i rand 5 for i 0 iM 1 printf input error else printf nplease input the request number n for i 0 i N i getchar printf The d rquest n i rt i input printf Your request is 锛歕 n display rt N if finish pn 1 flag1 comp rt Avalible N r1 flag2 comp rt Need pn N r2 if flag1 1 dec Avalible rt N dec Need pn rt N add Allocation pn rt N r3 disp if safe 1 if check Allocation pn Max pn N 1 add Avalible Allocation pn N 0 finish pn 1 k return 1 else return 0 else printf The resouce have assigned n 20 int main int i j s flag char c s int av N s ll M N for i 0 i M i finish i 1 srand time NULL for i 0 i M i for j 0 j N j Allocation i j rand 10 Need i j rand 10 Max i j Allocation i j Need i j for i 0 i N i Avalible i rand 12 disp s flag safe if s flag 1 printf 是否申请资源 Y N n c getchar if c Y c y N1 printf 1 random request resouce n printf 2 request resouce by man n grand av Avalible N 保存原始的 available 的值 for i 0 i M i grand s ll i Allocation i N getchar Mnu s getchar switch s case 1 if ran request 1 printf continue request Y N n getchar c getchar if c Y c y goto N1 else grand Avalible av N for i 0 i M i grand Allocation i s ll i N break case 2 if request 1 printf continue request Y N n getchar c getchar if c Y c y goto N1 else grand Avalible av N for i 0 i M i grand Allocation i s ll i N break default printf input error please input agin n goto Mnu if c N c n printf Thank for your use n return 0 21 实验三实验三 存储器管理存储器管理 实验目的 编程模拟实现存储器页面置换的常用算法 调试分析相关存储器管理程序 加深对存 储器页面置换常用算法的理解和实现技巧 实验内容 1 自定义存储器管理有关的数据结构 2 依据最佳置换算法 OPTIMAL 先进先出置换算法 FIFO 最近最久未使用算 法 LRU 原理 编写对应函数 模拟系统的存储器页面置换功能 3 为了更好地模拟和评价算法的性能 允许用户自行指定可用页块数并输入需访问 的页面号序列 4 统计以上算法实际需要的总页面数 缺页中断次数以及它们的缺页率 5 比较 分析以上算法的置换性能 并作出自己的评价 预备知识 存储器页面置换常用算法的相关知识参考课堂 计算机操作系统 教材 实验指导 1 请求分页存储器管理模拟系统界面 图 3 1 请求分页存储器管理模拟系统界面 图形界面可以自行设计 也可以使用控制台终端输出信息 访问页面号序列 和 页 块数 为输入信息 列表框 或编辑框 具体的页面置换情况 及其统计数据为输出信息 控制台终端的输出信息可以通过剪贴板复制保存为电子实验记录文件 图形界面可以通过 保存 按钮保存列表框的输出信息 采用编辑框显示的输出信息 也可以通过剪贴板复 22 制保存 OPTIMAL LRU FIFIO 算法分别由其对应按钮或函数实现 2 全局变量 INT PAGESEQ MAXPAGENUM 用来放置页面号序列的整型数组 CSTRING PAGESEQNUM 带分隔符的访问页面序列字符串备份 INT TOTALPAGECOUNT 实际输入的总页面数 INT FAILPAGECOUNT 缺页中断次数 INT PAGEBLOCK 9 PRIORITY 9 已在内存页面号 及其优先数 BOOL METATHESIS SPACE 是否缺页 是否有空页 CSTRING STR MEMO OUTPUT 信息标题 调页记录 输出信息 3 主对话框类声明 CLASS CPAGEMETATHESISDLG PUBLIC CDIALOG CONSTRUCTION PUBLIC BOOL UPDATEPAGESEQ VOID OPTIMAL INT INT VOID LRU INT INT VOID FIFO INT INT CPAGEMETATHESISDLG CWND PPARENT NULL STANDARD CONSTRUCTOR DIALOG DATA AFX DATA CPAGEMETATHESISDLG ENUM IDD IDD PAGEMETATHESIS DIALOG CEDITM BLOCKCOUNT CONTROL CLISTBOXM DISPLAY CEDITM PAGESEQNUM CONTROL CSTRINGM HINT CSTRINGM PAGESEQNUM INTM BLOCKCOUNT AFX DATA CLASSWIZARD GENERATED VIRTUAL FUNCTION OVERRIDES AFX VIRTUAL CPAGEMETATHESISDLG PROTECTED VIRTUAL VOID DODATAEXCHANGE CDATAEXCHANGE PDX DDX DDV SUPPORT AFX VIRTUAL IMPLEMENTATION PROTECTED HICON M HICON GENERATED MESSAGE MAP FUNCTIONS AFX MSG CPAGEMETATHESISDLG VIRTUAL BOOL ONINITDIALOG AFX MSG VOID ONPAINT AFX MSG HCURSOR ONQUERYDRAGICON AFX MSG VOID ONBUTTONCLR AFX MSG VOID ONBUTTONEXIT AFX MSG VOID ONBUTTONLRU AFX MSG VOID ONBUTTONFIFO AFX MSG VOID ONBUTTONOPTIMAL AFX MSG VOID ONBUTTONSAVE 23 AFX MSG DECLARE MESSAGE MAP 4 参考代码 实现 OPTIMAL 算法的函数 VOID CPAGEMETATHESISDLG OPTIMAL INT ADDR INT PHYSICAL SIZE CHAR CSNUM 2 METATHESIS TRUE SPACE TRUE STR R N OUTPUT FOR INT Z 1 Z 0 I PAGEBLOCK I 1 设置数组初值为 1 PRIORITY I 0 设置数组优先级为 0 FOR I 0 I TOTALPAGECOUNT I METATHESIS TRUE FOR INT J 0 METATHESIS J IF ADDR I PAGEBLOCK J METATHESIS FALSE MEMO FOR Z 0 Z PHYSICAL SIZE Z IF PAGEBLOCK Z 1 无中断且有空页面 空页面处输 出空格 MEMO ELSE 无中断 ITOA PAGEBLOCK Z CSNUM 10 MEMO CSNUM MEMO OUTPUT R N OUTPUT MEMO M DISPLAY INSERTSTRING M DISPLAY GETCOUNT MEMO IF METATHESIS 有中断 IF SPACE 有空页面 插入页面中断 24 INT M FOR Z 0 Z PHYSICAL SIZE Z IF PRIORITY Z 0 PRIORITY Z 1 PAGEBLOCK Z ADDR I M Z Z PHYSICAL SIZE IF PRIORITY PHYSICAL SIZE 1 0 SPACE FALSE 无空页面 MEMO FOR Z 0 Z PHYSICAL SIZE Z ITOA PAGEBLOCK Z CSNUM 10 IF M Z MEMO ELSE MEMO CSNUM MEMO MEMO 插入页面 FAILPAGECOUNT OUTPUT R N OUTPUT MEMO M DISPLAY INSERTSTRING M DISPLAY GETCOUNT MEMO ELSE 无空页面 替换页面中断 INT MAX 0 FOR Z 0 Z PHYSICAL SIZE Z FOR INT K I 1 KPRIORITY MAX MAX Z IF K TOTALPAGECOUNT MAX Z Z PHYSICAL SIZE PAGEBLOCK MAX ADDR I MEMO FOR Z 0 Z 0 I PAGEBLOCK I 1 设置数组初值为 1 PRIORITY I 0 设置数组优先级为 0 FOR INT Z 1 Z PHYSICAL SIZE Z STR 页块 ITOA Z CSNUM 10 STR CSNUM STR STR 有无中断 页面置换形式 M DISPLAY INSERTSTRING M DISPLAY GETCOUNT STR FOR I 0 I TOTALPAGECOUNT I METATHESIS TRUE FOR INT J 0 METATHESIS J IF ADDR I PAGEBLOCK J METATHESIS FALSE FOR Z 0 ZPRIORITY J PRIORITY Z 1 PRIORITY J PHYSICAL SIZE MEMO FOR Z 0 Z PHYSICAL SIZE Z 26 IF PAGEBLOCK Z 1 无中断且有空页面 空页面处输 出空格 MEMO ELSE 无中断不为空页面 ITOA PAGEBLOCK Z CSNUM 10 MEMO CSNUM MEMO OUTPUT R N OUTPUT MEMO M DISPLAY INSERTSTRING M DISPLAY GETCOUNT MEMO IF METATHESIS 有中断 IF SPACE 有空页面 插入页面中断 INT M FOR Z 0 Z PHYSICAL SIZE Z IF PRIORITY Z 0 PRIORITY Z PHYSICAL SIZE PAGEBLOCK Z ADDR I M Z Z PHYSICAL SIZE ELSE PRIORITY Z 1 IF PRIORITY PHYSICAL SIZE 1 0 SPACE FALSE 无空页面 MEMO FOR Z 0 Z PHYSICAL SIZE Z ITOA PAGEBLOCK Z CSNUM 10 IF M Z MEMO ELSE MEMO CSNUM MEMO MEMO 插入页面 FAILPAGECOUNT OUTPUT R N OUTPUT MEMO M DISPLAY INSERTSTRING M DISPLAY GETCOUNT MEMO ELSE 无空页面 替换页面中断 FOR Z 0 Z PHYSICAL SIZE Z IF PRIORITY Z 1 PRIORITY Z PHYSICAL SIZE PAGEBLOCK Z ADDR I 27 ELSE PRIORITY Z 1 MEMO FOR Z 0 Z 0 I PAGEBLOCK I 1 设置数组初值为 1 PRIORITY I 0 设置数组优先级为 0 FOR INT Z 1 Z PHYSICAL SIZE Z STR 页块 ITOA Z CSNUM 10 STR CSNUM STR STR 有无中断 页面置换形式 M DISPLAY INSERTSTRING M DISPLAY GETCOUNT STR FOR I 0 I TOTALPAGECOUNT I METATHESIS TRUE FOR INT J 0 METATHESIS J IF ADDR I PAGEBLOCK J METATHESIS FALSE MEMO FOR Z 0 Z PHYSICAL SIZE Z IF PAGEBLOCK Z 1 无中断且有空页面 空

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论