资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,P.,*,多媒体技术,软件开发技术基础,顾刚,计算机教学实验中心,1,这一讲的教学目标:,了解操作系统的几项重要功能,并不是介绍操作系统的原理,以主要功能为主线,以,C+,为工具,了解一部分操作系统,“,内幕,”,介绍,C+,如何实现,掌握与操作系统相关的程序设计,第,3,讲 操作系统及相关程序设计,2,讲授内容提纲,操作系统概述,进程管理及应用程序设计,内存管理及应用程序设计,设备管理及应用程序设计,文件管理及应用程序设计,人机接口管理,第,3,讲 操作系统及相关程序设计,3,操作系统定义,一组控制和管理计算机软、硬件资源,为用户提供便捷使用计算机的程序的集合,操作系统作用,管理计算机和使用计算机,操作系统特征,并发性、共享性、虚拟性和不确定性,3.1,操作系统概述,4,CPU,与进程管理,对处理器的时间进行合理分配、对处理器的运行实施有效的管理,存储器管理,对存储器进行分配、保护和扩充,设备管理,根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面,文件管理,有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段,用户接口,用户操作计算机的界面,或称为用户界面,通过用户接口,用户只需进行简单操作,就能实现复杂的应用处理,操作系统包含,5,大功能模块,3.1,操作系统概述,5,用户接口类型,命令接口:用户通过交互命令方式直接或间接地对计算机进行操作,DOS,:是纯命令行输入方式,Windows,:鼠标操作方式,程序接口:供用户以程序方式进行操作,或者用户通过,API(Application Programming Interface),函数可以调用操作系统所提供的例行程序,实现既定的操作,DOS,:中断服务功能,Windows,:,Windows API,函数,3.1,操作系统概述,6,用户操作计算机的两种界面:,DOS,:字符界面,以字符命令行方式操作计算机,常用命令:,HELP DIR CLS CD RD COPY,Windows,:图形界面,以鼠标点击方式操作计算机,最常用的功能是:桌面、浏览器、资源管理器、我的电脑、网上邻居、控制面板,(Control),、任务管理器,(taskmgr),、,Word,、,Excel,、,VC+,记事本,(Notepad),,写字板,(write),3.1,操作系统概述,7,DOS,与,Windows,系统程序接口简介,DOS,单用户单任务的磁盘操作系统,功能体现在系统提供的,DOS,和,BIOS,层上,借助于高级语言和汇编语言,并通过调用中断服务程序,可以完成编程工作,Windows,WINDOWS API,调用系统程序,借助于高级语言可以完成编程工作,3.1,操作系统概述,8,标准化窗口界面,3.1,操作系统概述,9,消息的相关概念,Windows,程序是以事件为驱动、消息机制为基础,WINDOWS,是基于消息的操作系统。当用户操作计算机时,会产生一系列的动作,如单击鼠标左键,选取菜单中某个命令等,在事件驱动的程序结构中,程序的控制流程不再由事件的预定发生顺序来决定,而是由实际运行时各种事件的实际发生来触发,事件的发生可能是随机的、不确定的,并没有预定的顺序,3.1,操作系统概述,10,消息的相关概念,消息定义:由用户操作而向应用程序发出的信息,也包括操作系统内部产生的信息。,消息类型:,windows,消息,命令消息和控件通知,消息类型细分为:鼠标消息、键盘消息、定时器消息、菜单命令消息、窗口绘制消息,例如单击鼠标左键,,windows,将产生,WM_LBUTTONDOWN,名字的消息;又如按下键盘上的字母键,将产生,WM_CHAR,消息,对,windows,操作系统的任何操作事件都被记录为消息,保存在,windows,消息队列中,3.1,操作系统概述,11,消息的相关概念,消息结构:消息号和参数组成,typedef struct tagMSG,HWND hwnd;,窗口句柄,为,NULL,,则可检索所有驻留在消息队列中的消息,UINT message;,消息值,由,windows.h,头文件中的宏定义来标识,WPARAM wParam;,包含有关消息的附加信息,不同消息其值有所不同,LPARAM lParam;,DWORD time;,指定消息送至队列的时间,POINT pt;,指定消息发送时屏幕光标的位置,其数据类型,POINT,也是一个结构体,MSG;,句柄:是一个,4B,长的数,用于唯一标示各种不同的,windows,对象类型,如窗口、菜单、画笔和画刷等,3.1,操作系统概述,12,Windows,数据类型,3.1,操作系统概述,13,Windows,程序框架,控制台应用程序,DOS,命令行应用程序,基于框架窗口应用程序,窗口界面应用程序,(SDI),单文档,/,视图应用程序,类似记事本程序,(MDI),多文档,/,视图应用程序,类似,WORD,、,PPT,、,EXCEL,应用程序,基于对话框应用程序,类似计算器程序,3.1,操作系统概述,14,控制台应用程序创建要点,要求:求两个正整数的最大公因数,操作步骤,打开,VC+,新建工程类型为,“,Win32 Console Application,”,新建程序类型为,C+,源程序,添加如下程序:,#include /,包含库文件,using namespace std;,void main(),int p,q,r;/,定义三个整数变量,cin p q;/,输入两个正整数,if(p q)/,比较,p,和,q,大小,r=p;p=q;q=r;,r=p%q;/,计算余数,while(r!=0)/,循环计算余数,p=q;,q=r;,r=p%q;,cout ,最大公因数是,q Create(0,_T(gugang);,pFrame-ShowWindow(m_nCmdShow);,HWND hWnd;,hWnd=AfxGetMainWnd()-m_hWnd;,/,得到框架类句柄,HDC hdc;,PAINTSTRUCT ps;,hdc=BeginPaint(hWnd,/,创建绘图对象并和框架窗口类关联,TextOut(hdc,0,0,“,同学们,大家好,”,strlen(,“,同学们,大家好,”,);,/,用绘图对象显示字符串,EndPaint(hWnd,this-m_pMainWnd=pFrame;,return TRUE;,Cgu1App ThisA;,编译、连接、运行,3.1,操作系统概述,16,用到的主要数据类型及结构:,UINT,无符号整数 等价于,unsigned int,HINSTANCE,实例句柄等价于,unsigned ong,PSTR,字符指针等价于,char*,TCHAR,字符等价于,char,HWND,窗口句柄等价于,unsigned long,MSG,消息结构,WINAPI CDECL,LRESULT,消息返回值等价于,long,CALLBACK PASCAL,WPARAM,消息参数 等价于,UINT,LPARAM,消息参数 等价于,long,PAINTSTRUCT,窗口绘制信息结构,HDC,设备环境句柄等价于,unsigned long,WNDCLASS,窗口结构体,typedef struct _WNDCLASS,UINT style;,WNDPROC lpfnWndProc;,int cbClsExtra;,int cbWndExtra;,HANDLE hInstance;,HICON hIcon;,HCURSOR hCursor;,HBRUSH hbrBackground;,LPCTSTR lpszMenuName;,LPCTSTR lpszClassName;,WNDCLASS;,3.1,操作系统概述,17,对话框应用程序创建要点:,要求:应用程序界面为对话框,操作步骤,打开,VC+,工程类型为,“,MFC AppWizard(exe),”,程序类型为,“,Dialog based,”,改变对话框标题,改变静态控件标题,增加命令按钮,点击运行,“,计算器,”,程序,3.1,操作系统概述,18,文档视图框架应用程序创建要点:,要求:应用程序界面为文档,操作步骤,打开,VC+,工程类型为,“,MFC AppWizard(exe),”,程序类型为,“,Single document,”,改变窗口标题,在视图类的,OnDraw,函数中添加代码:,pDC-TextOut(100,100,MFC,文档,/,视图演示程序,);,3.1,操作系统概述,19,CPU,与进程管理的相关概念,Windows,操作系统的进程和线程管理,进程和线程的应用,3.2,进程管理及应用程序设计,20,设有一个程序有三个程序段,分别执行,I,(输入)、,C,(计算)和,P,(输出)操作。执行顺序为:,只有,输入,了数据 ,才能,计算,这些数据,也只有,计算,产生了结果,才能,输出,它们。这些逻辑关系(顺序)是不能随意改变的。,I,结果,数据,C,P,3.2,进程管理及应用程序设计,21,设有,N,个程序,每个程序分三段子程序,都是,I,段(输入)、,C,段(计算)、,P,段(输出),N,个程序运行有两种模式:顺序运行和并行运行,I,1,C,1,P,1,I,2,C,2,P,2,3.2,进程管理及应用程序设计,22,由于硬件性能提高迅猛异常,尤其,CPU,和内存储器为程序并发运行提供保障,单道程序顺序执行效率低下,多道程序并发执行能提高硬件资源利用率,并提高程序运行的综合效率,在多道程序系统中,由于受资源的制约,每个程序处理过程的行为和状态是不确定的,3.2,进程管理及应用程序设计,23,CPU,与进程管理,处理机管理的主要任务,对处理器的时间进行合理分配、对处理器的运行实施有效管理,程序的概念,?,一个静态概念,代表有严格时间顺序的可执行指令序列,输入、处理和输出三部分组成指令序列特征,并发性、共享性、虚拟性和不确定性,进程的概念,?,能否将程序中的三段子程序独立出来,由操作系统分配资源,各段子程序并发、独立运行,能否将,N,个程序并发独立运行,3.2,进程管理及应用程序设计,24,1966,年美国麻省理工学院,J,H,Sallexer,提出,“,进程,”,概念。进程具有以下,6,个基本特性:,动态性,。进程是,“,活着,”,的程序,它具有生命周期,表现在它由,“,创建,”,而产生,由,“,调度,”,而执行,因得不到资源而,“,暂停,”,,最后由,“,撤消,”,而消亡。,并发性,。同时执行。,独立性,。进程是一个独立运行、资源分配和调度的基本单位。,异步性,。不同进程均具有各自的运行,“,轨迹,”,。进程具有,“,执行暂停执行,”,这样走走停停的活动规律。,结构特征,。为便于管理,系统为每个进程创建一套数据结构,记录该进程有关的状态信息。,制约性,。由于系统资源受限,多个进程在并发执行过程中相互制约。,3.2,进程管理及应用程序设计,25,进程在其生存周期内,其执行过程是间断性的,因此进程状态是不断变化,就绪状态,。进程已经获得了除,CPU,之外所需资源,一旦得到,CPU,,就可以立即执行。,运行状态,。进程获得了,CPU,及其它一切所需资源,正在运行,等待状态,。由于某种资源得不到满足,进程运行受阻,处于暂停状态,等待分配到所需资源后,再投入运行,等待状态,就绪状态,时间用完,获得资源,等,待,资,源,运行状态,就绪状态,资,进程调度,3.2,进程管理及应用程序设计,26,程序和进程的区别,静和动。程序是,“,静止,”,的,它描述的是静态的指令集合及相关的数据结构;进程是,“,活动,”,的,它描述程序执行起来的动态行为,程序可以脱离机器,长期保存,。而进程是执行着的程序,当程序执行完毕,进程也就不存在了。进程的生命是,暂时,的,程序不具有,并发特征,,不会受到其他程序的制约和影响。进程具有,并发性,,因此受到其他进程的制约和影响,(,争夺资源,),进程与程序,不一一对应,。一个程序多次执行,可以产生多个不同的进程;一个进程也可以对应多个程序,3.2,进程管理及应用程序设计,27,进程由三部分组成:,程序块,。就是程序本身,用于描述进程所要完成的操作;,数据集合,。它包括进程执行时所需要的数据集和工作区;,进程控制块,PCB,(,Process Control Block,)。,PCB,用于记录进程各种信息,反映进程动态特性变化。,PCB,是进程控制的核心机制(数据表格),,OS,就是通过,PCB,实现对进程的控制和管理的。,3.2,进程管理及应用程序设计,28,进程数据结构,进程描述信息,进程标识符,(process ID),,唯一,通常是一个整数,进程名,通常基于可执行文件名(不唯一),用户标识符,(user ID),进程组关系,(process group),进程控制信息,当前状态;优先级,(priority),;,代码执行入口地址,进程间同步和通信;阻塞原因,资源占用信息,虚拟地址空间的现状、打开文件列表,CPU,现场保护结构,寄存器值(通用、程序计数器,PC,、状态,PSW,,地址包括栈指针,3.2,进程管理及应用程序设计,29,多个进程并发执行,同步和互斥,协调点,同步并行算法:将每次迭代分成三个计算单元,分别计算,f(x,k,)f,k,,,f,(x,k,)f,k,,,x,k,f,k,/f,k,x,k+1,及检验精度,将计算分为两个进程,P1,及,P2,,假定计算,f,(x,k,),的时间比计算,f(x,k,),时间长,则两个进程或其中一个进程必出现等待继续计算所需数据的情况,3.2,进程管理及应用程序设计,30,3.2,进程管理及应用程序设计,31,Windows,进程的建立,函数,CreateProcess,使一个程序运行,使用,C,的,spawnlp,函数,使用,Win API,函数,ShellExecute,3.2,进程管理及应用程序设计,32,例题:编程启动两个子进程,_spawnlp,函数格式,“,process.h,”,int _spawnlp(int mode,const char*cmdname,const char*arg0,const char*arg1,.const char*argn,NULL);,其中,mode,表示运行方式,,cmdname,为进程名,,arg0,argn,为若干个进程参数,,NULL,为终止符。,返回值:,-1 Error,其他:进程返回码,3.2,进程管理及应用程序设计,33,#include,#include,void child_process(char command),BOOL bSuccess;,PROCESS_INFORMATION piProcInfo;/,保存创建的进程信息,STARTUPINFO Info;/,定义进程的窗口特征参数,Info.cb=sizeof(STARTUPINFO);/,定义结构体的字节大小,Info.lpDesktop=NULL;/,无进程桌面,Info.lpTitle=NULL;/,无进程窗口,Info.cbReserved2=0;/,保留,必须是,0,bSuccess=CreateProcess(NULL,command,NULL,NULL,FALSE,NULL,NULL,NULL,/,创建进程,if(!bSuccess),cout,错误命令,endl;,else,coutcommand,进程创建成功,进程号,:piProcInfo.dwProcessIdendl;,void main(),cout,父进程启动,endl;,child_process(osk);,child_process(calc);,cout,父进程退出,endl;,3.2,进程管理及应用程序设计,34,例题:编程显示当前系统所有进程,PROCESSENTRY32,结构体格式,typedef struct tagPROCESSENTRY32,DWORD dwSize;,DWORD cntUsage;,DWORD th32ProcessID;/,进程编号,DWORD th32DefaultHeapID;,DWORD th32ModuleID;,DWORD cntThreads;,DWORD th32ParentProcessID;,LONG pcPriClassBase;,DWORD dwFlags;,char szExeFileMAX_PATH;/,进程执行文件名,PROCESSENTRY32;,3.2,进程管理及应用程序设计,35,CreateToolhelp32Snapshot,函数格式:,HANDLE WINAPI CreateToolhelp32Snapshot(,DWORD dwFlags,/TH32CS_SNAPPROCESS,TH32CS_SNAPTHREAD,DWORD th32ProcessID /,进程标识好,当前进程为,0,);,例题:编程显示当前系统所有进程,Process32First,函数格式,BOOL WINAPI Process32First(,HANDLE hSnapshot,LPPROCESSENTRY32 lppe,);,Process32Next,函数格式,BOOL WINAPI Process32Next(,HANDLE hSnapshot,LPPROCESSENTRY32 lppe,);,3.2,进程管理及应用程序设计,36,显示系统所有进程的源程序如下:,#include,#include,#include,void main(),PROCESSENTRY32 pe;/,保存进程信息,HANDLE hSnapshot=,CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);/,创建进程快照句柄,Process32First(hSnapshot,/,先搜索系统中第一个进程的信息,cout,进程号,t,进程执行文件名,endl;,int count=0;/,进程计数器变量,do,count+;,coutpe.th32ProcessID,tpe.szExeFileendl;/,输出进程号和执行文件名,while(Process32Next(hSnapshot,/,循环枚举系统中的所有进程,cout,系统总进程数量为:,countendl;,CloseHandle(hSnapshot);/,关闭进程快照句柄,3.2,进程管理及应用程序设计,37,两个函数用于测试打开和终止指定的进程,OpenProcess,函数格式,HANDLE OpenProcess(,DWORD dwDesiredAccess,/,访问标志,这里是,PROCESS_TERMINATE,,即允许终止,BOOL bInheritHandle,,,/,进程继承标志,这里设为,FALSE,DWORD dwProcessID /,进程标示号,),;,TerminateProcess,函数格式,BOOL TerminateProcess(,HANDLE hProcess,/,进程句柄,UINT uExitCode /,进程退出码,);,3.2,进程管理及应用程序设计,38,线程及其应用,线程的概念,指令序列,程序运行的基本单位,不过它仅作为,CPU,调度单位,它只拥有必不可少的资源,线程的优点,减小并发执行的时间和空间开销,线程的状态,就绪、阻塞(等待)和执行,3.2,进程管理及应用程序设计,39,线程与进程的区别,线程是比进程更小的单位,线程是,CPU,进行调度和分配的独立单位,进程是操作系统进行调度和分配的独立单位,从运行角度来讲,同类线程的数据和代码区是共享的,这有利于线程的快速调度和切换,而进程之间的数据和代码区是独立的,3.2,进程管理及应用程序设计,40,Windows,下的线程状态转换,3.2,进程管理及应用程序设计,41,例题:编写动态显示时钟时间的线程,CTime,类 时间类,CString,类字符串类,CreateThread,函数格式,HANDLE CreateThread(,LPSECURITY_ATTRIBUTES lpThreadAttributes,/,线程安全属性,DWORD dwStackSize,/,初始线程栈大小,LPTHREAD_START_ROUTINE lpStartAddress,/,线程函数,LPVOID lpParameter,/,参数,DWORD dwCreationFlags,/,标志,LPDWORD lpThreadId /,保存线程号,);,返回线程句柄,3.2,进程管理及应用程序设计,42,TerminateThread,函数格式,BOOL TerminateThread(,HANDLE hThread,/,线程句柄,DWORD dwExitCode /,退出码,);,成功返回非,0,例,3-3,编写动态显示时钟时间的线程,3.2,进程管理及应用程序设计,43,控制台界面的源程序如下:,/Example3_3.cpp-,时钟显示线程,#include,#include,DWORD ThreadID;/,定义线程编号变量,HANDLE hThread=NULL;/,定义线程句柄变量,void ThreadProc()/,线程函数,CTime time;/,定义时间变量,CString m_time;/,定义字符串型时间变量,for(;),time=CTime:GetCurrentTime();/,取得当前机器时间,m_time=time.Format(%H:%M:%S);/,并按,时,:,分,:,秒,的格式赋给字符串变量,cout(LPCTSTR)m_timeendl;/,显示时间,Sleep(1000);/,线程休眠,1000ms,void main(),if(hThread=NULL),hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,NULL,0,/,建立并启动线程,for(;);/,循环等待线程的运行,3.2,进程管理及应用程序设计,44,步骤,建立对话框程序,如右下图所示,在对话框中拖入一个静态文本控件(时间标题),一个编辑文本控件(时间),添加两个按钮(启动、停止)保留按钮(确定、取消),增加按钮消息函数,添加全局变量和函数代码,DWORD ThreadID;/,定义线程编号变量,HANDLE hThread;/,定义线程句柄变量,void ThreadProc()/,线程函数,添加按钮消息代码,OnStart(),OnStop(),例题:编写动态显示时钟时间的线程,对话框界面,3.2,进程管理及应用程序设计,45,直接采用定时器,动态显示时钟,创建对话框程序项目,添加编辑文本控件,并附加变量,m_time,添加命令按钮控件,并附加函数,其代码如下,SetTimer(1,1000,NULL);,添加定时器消息处理函数,如下图,代码如下:,CTime time;/,定义时间变量,time=CTime:GetCurrentTime();/,取得当前机器时间,m_time=time.Format(%H:%M:%S);/,并按,时,:,分,:,秒,的格式赋给字符串变量,UpdateData(FALSE);/,将控件变量值更新屏幕控件,46,核对控件使用,设计对话框应用程序,输入任意一个整数,鉴别该整数有哪些数字,输入任意一个实数,求,cos(),和,sin(),47,具体实现步骤,创建对话框程序项目,项目名称:,gctrl,在对话框中添加,4,个编辑控件,并为每个编辑控件附加一个变量,其中一个为整数变量,三个为,double,变量,将原,“,确定,”,命令按钮控件添加一个函数,代码见备注,添加,10,个,“,check box,”,控件,并为每个控件附加一个,bool,变量或,int,变量,观察,CGctrlDlg,类中的构造函数,,10,个变量赋值为,false,在,gctrlDlg.cpp,程序中的头部添加,#include,”,math.h,”,,见备注,在,gctrlDlg.cpp,程序中添加全局函数,详见备注程序,在,CGctrlDlg,类中添加成员函数,double mysin(double x),添加,2,个,“,radio button,”,控件,并为两个控件添加函数,分别求,sin(),和,cos(),,详见备注程序,48,内存管理的相关概念,内存数据空间的动态分配,内存代码空间的动态分配,3.3,内存管理及应用程序设计,49,所有计算机处理的数据和程序都是存放在外存中,使用时才调入内存。这是冯,.,诺依曼确立的工作机制,存储器管理应该解决的问题如下:,调入内存后如何分配存储空间?,(,讨论),多个程序存储空间怎样分配?,(,讨论),在小内存中能否运行大程序?,(,讨论),同一程序多次装入内存其地址相同吗?即如何解决程序的重定位问题?,(,讨论),怎样解决存储保护?,3.3,内存管理及应用程序设计,50,内存管理的主要目标:,多道程序共享内存,即能够并发运行多道程序,能够方便用户不断扩大内存容量,硬件扩充,用户使用主存采用逻辑地址,虚拟存储器的管理:将外存部分空间作为内存统一使用,让用户感到内存无限的大,,3.3,内存管理及应用程序设计,51,内存管理的实质,存贮器管理分为实存管理和虚存管理,所谓实存是指实际的物理存贮器,它包括高速缓存、主存和外存所对应的硬件装置,这些物理存贮器均具有实际的存贮地址,将实存的空间地址称为实地址,即绝对地址,用户在实际编程时,所用的地址是逻辑地址,其地址空间可与实空间一一对应,也可以不一一对应,可以设想存在一个虚拟的存贮设备,或虚存,提供了逻辑地址对应的虚拟空间,3.3,内存管理及应用程序设计,52,在,Windows,操作系统下,存储器被保护起来,程序和用户无法直接访问,需要在程序中通过,静态,和,动态,两种方式来访问,Windows,的内存管理完成物理内存和虚拟内存之间的交换,虚拟内存是,32,位的,多达,4GB,的存储空间,3.3,内存管理及应用程序设计,53,存储器管理主要有,4,个功能,存储分配,:,按分配策略和算法分配主存空间,地址变换,:,将程序在外存中的逻辑地址转换为在内存中的物理地址;,存储保护,:,保护各类程序(系统的、用户的、应用程序的)及数据区免遭破坏;,存储扩充,:,解决在小的存储空间中运行大程序的问题,即虚拟存储问题,3.3,内存管理及应用程序设计,54,Windows NT,在,X86,体系下虚拟地址空间的分布,8,256MB,2GB,3.3,内存管理及应用程序设计,55,虚拟存储器基本思想是:,把部分外存空间作为主存使用,以此为用户提供足够大的地址空间,虚存空间,用户可以在这个地址空间内编程,而完全不考虑主存的大小,虚拟存储器技术实际上是采用内、外存结合的办法实现的,3.3,内存管理及应用程序设计,56,虚拟存储器示意图:,虚拟存储器,内存,外存,3.3,内存管理及应用程序设计,57,自动覆盖技术:,采用分段方法,将大的程序划分为在主存中可以容纳的独立的逻辑段,每次只调入其中的一段进行处理。后调入的程序使用前面程序使用过的存储空间,程序,3,程序,2,程序,1,程序,i,程序,1,程序,2,程序,3,内存,程序,i,3.3,内存管理及应用程序设计,58,交换技术,的要点是:,将运行程序在内、外存之间进行调入或调出的交换,即把执行了一段时间、因故暂停的进程由系统调出主存,以文件的形式存入外存,而将下一个程序装入主存运行,内存,外存,程序,1,OS,请求交换!,转外存,交换,程序,1,其他程序,2,其他程序,n,其他程序,1,装入,其他程序,1,3.3,内存管理及应用程序设计,59,申请函数,LPVOID VirtualAlloc(,LPVOID lpAddress,/起始地址,DWORD dwSize,/大小,DWORD flAllocationType,/分配类型!(MEM_COMMIT等),DWORD flProtect /保权限(PAGE_READWRITE等),);,释放函数,BOOL VirtualFree(,LPVOID lpAddress,/起始地址,DWORD dwSize,/大小,DWORD dwFreeType /释放类型(MEM_RELEASE等),);,虚拟内存申请函数和释放函数,3.3,内存管理及应用程序设计,60,例题,:使用动态申请的虚拟内存空间来编写一个计算任何数的阶乘的程序,解题主要步骤:,从键盘随机输入,n,,作为要计算的阶乘的数,通过函数,VirtualAlloc,得到,n,10240,的地址空间,并申请使用其中的,n,1024,的地址空间,调用计算阶乘函数,lfac(),一位一位的显示阶乘计算结果,通过函数,VirtualFree,释放虚拟内存,3.3,内存管理及应用程序设计,61,例如,50!,的结果超出了,C+,整数类型的表示范围,利用整数数组来存储,n,位十进制整数,每个数组元素存储,n,位十进制数中的一位,例如定义数组:,int array100;,用来存放,100,位十进制整数,设数组中已存储了,12!=479001600,,乘,13,运算如下:,4,7,9,0,0,1,6,0,0,13,6,2,2,7,0,2,0,8,0,0,3.3,内存管理及应用程序设计,62,一种计算50,!,程序,#,include,/,计算,50,!的程序,不需要申请虚拟内存,using namespace std;,int main(),const int MAXSIZE=100;,int arrayMAXSIZE;,int n=50,sum,sc;,for(int i=0;iMAXSIZE;i+)arrayi=0;/,将数组清0,array,99,=1;,for(i=2;i=0;j-,),sum=arrayj*i+sc;/,当前计算结果加上上一次进位值,sc=sum/10;/,存放进位数值,arrayj=sum%10;/,将余数存入数组,for(,i=0;i MAXSIZE;i+,)coutarrayi;,coutendl;,return 0;,63,#include/,另一种计算,50,!的程序,不需要申请虚拟内存,using namespace std;,int main(),const int MAXSIZE=100;,int arrayMAXSIZE,n=50,sum,sc;,for(int i=0;iMAXSIZE;i+)arrayi=0;/,将数组清,0,array0=1;,for(i=2;i=n;i+),sc=0;,for(int j=0;j=0;i-)coutarrayi;/,输出结果,coutendl;,return 0;,3.3,内存管理及应用程序设计,64,Vc6,编程使用内存限制,定义数组不能超过,100000000,个元素,不论多维数组,元素总个数不能超过,1,亿,不论,4,种基本数据类型,例如下面语句有效:,const int MAXSIZE=100000000;,int arrayMAXSIZE;,使用动态申请内存方法可以不受上述限制,const int MAXSIZE=100000000;,double*p;,p=new doubleMAXSIZE*100;,但最终还是有限制,这就要使用虚拟内存,3.3,内存管理及应用程序设计,65,/*Example3_6.cpp:,计算任何数的阶乘*,/,#include,#include,int lfac(int*a,int n),int sum,sc;,for(int i=0;in*1024;i+)ai=0;/,空间清零,a0=1;/,最低位设为,1,for(i=2;i=n;i+),sc=0;,for(int j=0;j0)return-1;else return 0;,int main(int argc,char*argv),if(argc 2),couta,使用方法,:Example3_6;,return 1;,char*p;,int n=strtol(argv1,/,转换为,long,型整数,if(n0),couta,输入数据错,;,return 1;,int*lpBase=(int*)VirtualAlloc(NULL,n*10240,MEM_COMMIT,PAGE_READWRITE);/,保留,n*10240,的地址空间,int*lpPage=(int*)VirtualAlloc(lpBase+0,n*1024,MEM_COMMIT,PAGE_READWRITE);/,为页地址提交内存,int a;,bool flag=false;,a=lfac(lpPage,n);,if(a0),cout,溢出,=0;i-),if(flag|lpPagei0),flag=true;,coutlpPagei;/,输出每一位,couty?x:y;,打开,MYDLL.def,文件,在,EXPORTS,后即最后加入函数名,gumax,编译,stdafx.cpp,文件,编译,MYDLL.cpp,文件,build MYDLL.dll,3.3,内存管理及应用程序设计,69,使用,DLL,的方法,1,、创建新项目,use_dll,2,、将,MYDLL.dll,文件复制到,debug,文件夹或,windowssystem32,中,3,、在项目中加入文件,MYDLL.lib,project|add to project|file|,选中,MYDLL.lib,4,、在应用程序中,加入函数原型声明,double gumax(double,double);,5,、在应用程序中调用,gumax(),函数即可,3.3,内存管理及应用程序设计,70,3.4,设备管理及应用程序设计,I/O,设备管理的目的:,给用户使用设备提供简易、方便的方法,由设备管理程序提供高级的设备使用方法,使用户无需了解各种物理设备的具体细节,尽可能地保证处理机与外部设备的性能发挥,不致于发生高速,CPU,与低速设备在性能上的严重不匹配现象,71,3.4,设备管理及应用程序设计,I/O,设备管理主要任务,根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,以提高设备与设备之间,设备与,CPU,之间,进程与进程之间的并行性,从而提高整个操作系统的效率,为用户提供良好的设备使用界面,72,设备管理,模块的四部分组成,外部设备中断处理,外部设备的接口程序设计和设备驱动,(,真正的,I/O,操作,),。,外部设备的分配与释放,虚拟设备的实现与管理,(I/O,缓冲区管理,),3.4,设备管理及应用程序设计,73,程序直接控制方式。,中断控制方式。,DMA,方式。,通道方式。,操作系统的设备管理程序通过四种控制方式完成设备与内存之间的数据传送?,3.4,设备管理及应用程序设计,74,循环检测方式,N,号设备忙否,置忙标志,延时,交换一个单位信息,置闲标志,信息交换完否,如,何,检,测,?,闲,这种方式问题是,CPU,一直等待慢速的,IO,设备,75,当一个设备处于工作状态时,,CPU,可能继续处理其他任务,而无需等待,,CPU,与,I/O,并行工作,设备在工作结束后,可以通过向处理机发送中断信号,通知,CPU,设备已处于,“,闲,”,状态,请求,CPU,为其服务,CPU,暂停当前工作,转向设备发送信息,或安排其新的任务,此后,,CPU,又可返回继续处理被中断的任务,中断方式问题:快速,IO,设备频繁中断,CPU,,总体效率不高,什么是中断方式?,3.4,设备管理及应用程序设计,76,DMA(Direct Memory Access),方式,即直接内存存存取方式,它是在硬件的支持下,通过占用总线控制
展开阅读全文