软件开发技术基础 第 3 章 操作系统及程序设计 讲授教师:卫颜俊
主 要 内 容 主 要 内 容 操作系统及其功能 进程管理应用程序设计 内存管理应用程序设计 设备与文件管理应用程序设计 人机接口管理应用程序设计
学时安排 6 个学时讲授 (36/6) 2 个学时实验 (12/6)
本章序 计算机系统 硬件系统 主机、显示器、打印机、键盘和鼠标等 软件系统 操作系统、浏览器、办公软件、杀毒软件、多媒 体软件、软件开发工具和数据库软件等 Windows Server 2003 是一种操作系统
本章目标 《大学计算机基础 》为先修课程 回答了:操作系统在计算机中起的作用和它能干什 么 未回答:如何干、又如何在操作系统下编写程序 本课本章 不对操作系统的原理作深入的介绍,但以它的几项 重要功能为主线,以 C++ 为工具,揭示了一部分操作 系统 “ 内幕 ” ,使读者对操作系统的工作原理有进一步 的了解,同时对程序设计语言的应用有所加强
3 . 1 操作系统及其功能 操作系统的发展 手工操作、批处理、多道程序系统和分时操 作系统等四个阶段,其中分时操作系统为目 前最为流行 实用的操作系统 Windows X DOS Linux
3 . 1 . 1 操作系统的定义 定义 一组控制和管理计算机软、硬件资源,为用户提供 便捷使用计算机的程序的集合 作用 管理计算机和使用计算机 特征 并发性、共享性、虚拟性和不确定性 计算机系统组成 硬件、操作系统、其他系统软件、应用软件和用户 接口
3 . 1 . 2 操作系统的功能 CPU 与进程管理 对处理器的时间进行合理分配、对处理器的运行实施有效的管理 存储器管理 对存储器进行分配、保护和扩充 设备管理 根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工 作,为用户提供良好的设备使用界面 文件管理 有效地管理文件的存储空间,合理地组织和管理文件系统,为文件访 问和文件保护提供更有效的方法及手段 用户接口 用户操作计算机的界面, 或称为用户界面,通过用户接口,用户只需进 行简单操作,就能实现复杂的应用处理
用户接口类型 命令接口,用户通过交互命令方式直接或间 接地对计算机进行操作, DOS :是纯命令行输入方式, Windows :鼠标操作方式 程序接口,供用户以程序方式进行操作,或 API(Application Programming Interface) ,用 户通过 API 函数可以调用系统提供的例行程序, 实现既定的操作。 DOS :中断服务功能, Windows : Windows API 函数
3 . 1 . 3 DOS 与 Windows 操作使用 方法简介 DOS 常用命令: HELP DIR CLS CD RD COPY … Windows 最常用的功能是:桌面、浏览器、资源管理器、我的电脑、 网上邻居、控制面板 (Control) 、任务管理器 (taskmgr) 、 Word 、 Excel 、 VC++, 记事本 (Notepad) ,写字板 (write)…
3 . 1 . 4 DOS 与 Windows 操作系统 程序接口简介 DOS 单用户单任务的磁盘操作系统 功能体现在系统提供的 DOS 和 BIOS 层上,借助于高 级语言和汇编 语言,并通过调用中断服务程序,可以完成大部分编 程工作。 Windows 一种多用户多任务、图形化的新型操作系统
Windows NT 体系结构 登录进程和会话 管理器 事件日志、调度 服务、 SQL Server Win32 MS-DOS 程序和 Win32 程序 进程线程管理、 I/O 和内存管理 线程调度、中断 和异常处理 将内核、设备驱动 程序和执行体分离 以适应不同的平台 将 I/O 函数调用转 换为 I/O 请求 窗口和绘制
窗口
消息 Windows 程序是以事件为驱动、消息机制为基础 消息定义:由用户操作而向应用程序发出的信息,也包括操作 系统内部产生的消息。 消息类型: windows 消息,命令消息和控件通知 WM_LBUTTONDOWN 、 WM_PAINT 消息结构:消息号和参数组成 typedef struct tagMSG{ HWND hwnd; 窗口句柄,为 NULL ,则可检索所有驻留在消息队列中的消息 UINT message; 消息值,由 windows.h 头文件中的宏定义来标识 WPARAM wParam; 包含有关消息的附加信息, 不同消息其值有所不同 LPARAM lParam; DWORD time; 指定消息送至队列的时间 POINT pt; 指定消息发送时屏幕光标的位置, 其数据类型 POINT 也是一个结 构体 }MSG;
Windows 数据类型
Windows 程序框架 WinMain 框架结构 例 3-1 对话框框架程序 例 3-2 文档视图框架程序 例 3-3
例 3-1 WinMain 框架结构 要求: 显示一个窗口 在窗口中显示一段文字 步骤: 打开 VC++ 新键工程类型为 “Win32 Application” 添加 C++ 源程序
例 3-1 WinMain 框架结构 (2) 用到的主要数据结构: 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 窗口结构体
例 3-1 WinMain 框架结构 (3) 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-2 对话框框架程序 步骤 打开 VC++ 工程类型为 “MFC AppWizard(exe) ” 程序类型为 “ Dialog based ” 改变窗口标题 改变静态控件标题
例 3-3 文档视图框架程序 步骤 打开 VC++ 工程类型为 “MFC AppWizard(exe) ” 程序类型为 “ Single document ” 改变窗口标题 在视图类的 OnDraw 函数中添加代码: “pDC->TextOut(100,100,"MFC 文档 / 视图演示程序 ");”
3 . 2 进程管理应用程序设计 CPU 与进程管理的相关概念 Windows 操作系统的进程和线程 管理 进程和线程的应用
3 . 2 . 1 CPU 与进程管理 主要任务 对处理器的时间进行合理分配、对处理器的运行实 施有效的管理 程序的概念 一个静态概念,代表有严格时间顺序的可执行指令 序列,输入、处理和输出三部分组成指令序列特征 并发性、共享性、虚拟性和不确定性 进程的概念 程序的一次执行。系统进行资源调度和分配的独立 单位
3 . 2 . 1 CPU 与进程管理 (2) 进程与程序的主要区别 进程是动态的,而程序是静态的 进程的特点 动态性、并发性、独立性、异步性、结构性 和制约性 进程的状态 就绪状态、运行状态和停止状态
3 . 2 . 1 CPU 与进程管理 (3) 进程数据结构 进程描述信息 进程标识符 (process ID) ,唯一,通常是一个整数;进程名,通常 基于可执行文件名(不唯一);用户标识符 (user ID) ;进程组关 系 (process group) 进程控制信息 当前状态;优先级 (priority) ;代码执行入口地址;程序的外存地址; 运行统计信息(执行时间、页面调度);进程间同步和通信;阻 塞原因 资源占用信息 虚拟地址空间的现状、打开文件列表 CPU 现场保护结构 寄存器值(通用、程序计数器 PC 、状态 PSW ,地址包括栈指针
3 . 2 . 1 CPU 与进程管理 (4) 多个进程并发执行 同步和互斥 协调点
3 . 2 . 1 CPU 与进程管理 (5) Windows 进程的建立 函数 CreateProcess 使一个程序运行 使用 C 的 spawnlp 函数 使用 Win API 函数 ShellExecute ……
例 3-4 编程启动两个子进程 _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-5 编程显示当前系统所有进程 PROCESSENTRY32 结构体格式 typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; // 进程编号 DWORD th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; char szExeFile[MAX_PATH]; // 进程执行文件名 } PROCESSENTRY32;
例 3-5 编程显示当前系统所有进程 (2) CreateToolhelp32Snapshot 函 数格式 HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, // TH32CS_SNAPPROCESS, TH32CS_SNAPTHREAD DWORD th32ProcessID // 进程标识好,当前进程为 0 );
例 3-5 编程显示当前系统所有进程 (3) Process32First 函数格式 BOOL WINAPI Process32First( HANDLE hSnapshot, LPPROCESSENTRY32 lppe );
例 3-5 编程显示当前系统所有进程 (4) Process32Next 函数格式 BOOL WINAPI Process32Next( HANDLE hSnapshot, LPPROCESSENTRY32 lppe );
例 3-5 编程显示当前系统所有进程 (5) TerminateProcess 函数格式 BOOL TerminateProcess( HANDLE hProcess, // 进程句柄 UINT uExitCode // 进程退出码 );
3 . 2 . 2 线程及其应用 线程的概念 指令序列 程序运行的基本单位,不过它是作为 CPU 调 度单位,它只拥有必不可少的资源 线程的优点 减小并发执行的时间和空间开销 线程的状态 就绪、阻塞(等待)和执行
3 . 2 . 2 线程及其应用 (2) 线程与进程的区别 线程是比进程更小的单位,从运行角度来讲, 同类线程的数据和代码区是共享的,这有利 于线程的快速调度和切换,而进程之间的数 据和代码区是独立的。
Windows 操作系统下的线程状态转 换
例 3-6 编写一个动态显示时钟时间的 线程 CTime 类 时间 CString 类 字符串 CreateThread 函数格式 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全属性 DWORD dwStackSize, // 初始线程栈大小 LPTHREAD_START_ROUTINE lpStartAddress, // 线程函数 LPVOID lpParameter, // 参数 DWORD dwCreationFlags, // 标志 LPDWORD lpThreadId // 保存线程号 ); 返回线程句柄
例 3-6 编写一个动态显示时钟时间的 线程( 2) TerminateThread 函数格式 BOOL TerminateThread( HANDLE hThread, // 线程句柄 DWORD dwExitCode // 退出码 ); 成功返回非 0
例 3-6 编写一个动态显示时钟时间的 线程( 3) 步骤 建立对话框程序 在对话框中拖入一个静态文本控件(时间标题) 一个编辑文本控件(时间) 四个按钮(启动、停止、确定、取消) 增加按钮消息函数 添加全局变量和函数代码 DWORD ThreadID;// 定义线程编号变量 HANDLE hThread;// 定义线程句柄变量 void ThreadProc(){// 线程函数 添加按钮消息代码 OnStart() OnStop()
Thank You ! By Yan-jun Wei