




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OS第7章OS接口 刘扬河南大学计算机与信息工程学院 课程主要内容 OS引论进程管理处理机调度与死锁存储管理设备管理文件管理OS接口 UNIX系统内核结构 第7章OS接口 用户接口 UI CUIMUI VUI GUI IUI程序接口 PI 系统调用 7 1CUI 7 1 3键盘终端处理程序内核中对终端设备 包括输入输出功能 的特别处理字符接收功能面向字符 面向行 可以通过ioctl系统调用设置字符缓冲功能回显方式实际终端设备会有直接回显选项 一般用软件回显行内编辑功能特殊字符处理 例如ctrl c中断字符行内编辑和特殊字符处理只存在于 面向行 模式中 功能命令解释程序的主要作用是在屏幕上给出提示符 请用户键入命令 然后读入该命令 识别命令 再转到相应命令处理程序的入口地址 把控制权交给该处理程序去执行 并将处理结果送屏幕上显示组成 1 常驻部分 这部分包括一些中断服务子程序 2 初始化部分 它跟随在常驻内存部分之后 在启动时获得控制权 3 暂存部分 这部分主要是命令解释程序 并包含了所有的内部命令处理程序 批文件处理程序 以及装入和执行外部命令的程序 命令解释程序 CMD工作流程 系统在接通电源或复位后 初始化部分获得控制权 对整个系统完成初始化工作 并自动执行AUTOEXEC BAT文件 之后便把控制权交给暂存部分 暂存部分首先读入键盘缓冲区中的命令 判别其文件名 扩展名及驱动器名是否正确 若发现有错 在给出出错信息后返回 若无错 再识别该命令 简单识别命令的方法是基于一张表格 其中的每一表目都是由命令名及其处理程序的入口地址两项所组成的 如果暂存部分在该表中能找到键入的命令 且是内部命令 便可以直接从对应表项中获得该命令处理程序的入口地址 然后把控制权交给该处理程序去执行该命令 如果发现键入的命令不属于内部命令而是外部命令 则暂存部分还须为之建立命令行 再通过执行系统调用exec来装入该命令的处理程序 并得到其基地址 然后把控制权交给该程序去执行相应的命令 图7 2COMMAND COM的工作流程 7 2Shell命令语言 Shell命令是一个能完成某种功能的目标程序的名字 命令的格式如下 Command optionargumentlist 进入与退出系统命令进入系统Login退出系统Logout文件操作命令显示文件内容命令cat复制文件副本的命令cp对已有文件改名的命令mv撤消文件的命令rm确定文件类型的命令file目录操作命令建立目录的命令mkdir撤消目录的命令rmdir改变工作目录的命令cd列目录命令ls改变对文件的存取方式的命令chmod 系统询问命令访问当前日期和时间命令date询问系统当前用户的命令who显示当前目录路径名的命令pwd重定向与管道命令 通信命令信箱通信命令mail对话通信命令write允许或拒绝接收消息命令mesg后台命令 UNIX系统提供后台执行机制 用户在种命令后面再加上 号 使用ps wait及Kill命令去了解和控制后台进程的运行 7 3系统调用 为了保证OS系统程序不被应用程序有意或无意地破坏两类指令特权指令 系统态时只允许OS运行的关系到系统全局的指令 其对内存存储空间的访问范围基本不受限制 如启动各种外部设备 设置系统时钟时间 关中断 清主存 修改存储器管理寄存器 执行停机指令 转换执行状态等 非特权指令 在用户态时 完成一般性的操作和任务 不能对系统中的硬件和软件直接进行访问 其对内存的访问范围也局限于用户空间的应用程序所运行的指令 可以防止应用程序的运行异常对系统造成的破坏 两类程序 OS系统程序应用程序两种状态 系统态 管态或核心态 OS在系统态运行用户态 目态 应用程序只能在用户态运行 系统调用与中断 系统调用 为保护OS程序不被用户程序破坏 一般都不允许用户程序访问OS的程序和数据 也不允许应用程序采用一般的过程调用方式来直接调用这些过程 而在OS的内核中都设置了一组用于实现各种系统功能的子程序 过程 让应用程序通过系统调用去间接调用所需的OS过程 取得相应的服务 中断机制 系统调用是通过中断机制实现的 并且一个OS的所有系统调用都通过同一个中断入口来实现 对于拥有保护机制的OS来说 中断机制本身也是受保护的 只有授权给应用程序保护等级的中断号 才是可以被应用程序调用的 MS DOS提供了INT21H中断获取OS的服务 Linux仅给应用程序授权4个中断号 3 4 5以及80H 前三个中断号是提供给应用程序调试所使用的 而80h正是系统调用 systemcall 的中断号 系统调用与普通过程调用的相同点和不同点 相同点改变指令流程重复执行和公用改变指令流程后需要返回原处但系统调用在本质上是应用程序请求OS内核完成某功能时的一种过程调用 但它是一种特殊的过程调用 它与一般的过程调用有明显差别 1 执行状态不同 过程调用 其调用程序和被调用程序都运行在相同的状态 系统态或用户态 系统调用 调用程序运行在用户态 被调用程序是运行在系统态 调用和返回经历了不同的系统状态 通常核心和应用程序的代码分别运行在CPU的不同的状态下 所用地址空间也不同 核心的代码可以直接访问应用进程的地址空间 反之不然 状态切换 系统调用 中断 异常trap陷入特权指令 访问关键寄存器 停机指令 和I O敏感指令 中断屏蔽 端口读写 系统调用与普通过程调用的相同点和不同点 2 进入方式不同 状态的转换通过软中断机制实现 不允许由调用过程直接转向被调用过程 利用int或trap指令进行系统调用 利用call或jmp指令进入普通的过程调用 CALL指令的内部实现过程 返回地址压栈 即该CALL指令所在的地址 将该CALL指令中所含的地址 即被调用代码所在地址 送入PCRET指令的内部实现过程 从栈顶弹出返回地址送入程序计数器PC3 返回执行问题 采用抢先式调度的系统 在系统调用返回时 要进行重新调度的检查是否有更高优先级的任务就绪 创建或唤醒 系统调用与普通过程调用的相同点和不同点 系统调用与普通过程调用的相同点和不同点 4 嵌套或递归调用 系统调用嵌套的深度有一定的限制 一般最大深度为6 一般的过程对嵌套的深度则没有什么限制 图7 3示出了没有嵌套及有嵌套的两种系统调用情况 图7 3系统功能的调用 5 系统调用是动态调用 而CALL调用方式是静态调用 系统调用是动态调用 程序中不包含被调用代码 好处 1 用户程序长度缩短 2 当OS升级时 调用方不必改变系统调用方式的调用地址和返回地址都是不固定的 系统调用指令中不包含调用地址 只包含功能号 是按功能号 在可执行目标程序中 调用的 在OS内部 由系统调用处理程序通过系统调用分支表 OS的一个数据结构 将功能号转换为相应的指令地址 系统调用返回指令中不包括返回地址 通过栈保存和弹出返回地址 系统调用返回地址不固定 因为用户程序在不同的地方调用OS CALL调用方式是静态调用 被调用代码与调用代码在同一程序之内 CALL调用方式 其调用地址是固定的 包含在调用语句中 返回地址是不固定的 同一子程序可能被不同处多次调用 在程序执行过程中通过栈的实现来保存和弹出返回地址 7 3 2系统调用的类型1 进程控制类系统调用 这类系统调用主要用于对进程的控制 如创建一个新的进程和终止一个进程的运行 获得和设置进程属性等 2 文件操纵类系统调用对文件进行操纵的系统调用数量较多 有创建文件 删除文件 打开文件 关闭文件 读文件 写文件 建立目录 移动文件的读 写指针 改变文件的属性等 3 进程通信类系统调用在OS中经常采用两种进程通信方式 即共享存储区方式 建立共享存储区并连接到进程自身的虚地址空间 和消息传递方式 open accept closeconnection send receivemessage 4 设备管理类系统调用 信息维护类系统调用 7 3 3POSIX标准POSIX PortableOperatingSystemIX 为实现应用程序与OS平台的无关性问题 ISO给出的有关系统调用的国际标准POSIX1003 1 也称为 基于UNIX的可移植OS接口 应用开发 POSIX定义了标准应用程序接口 API 用于保证编制的应用程序可以在源代码一级上在多种OS上移植运行 OS开发 POSIX标准定义了一组构造系统调用所必须的过程 指定系统调用的功能 但未明确规定系统调用实现形式的 早期OS用汇编实现 现代OS以库函数 系统调用可被映射一个 大多数 或多个过程的系统调用 Unix Linux系统程序 库函数 系统调用的分层关系 7 3 4系统调用的处理方式 一般的函数调用序列并不能把进程的运行模式从用户态变为核心态 而系统调用却可以做到这一点 中断类型外中断 指由于外部设备事件所引起的中断 如通常的磁盘中断 打印机中断等 中断是由于系统中某事件引起的 该事件与现行指令无关 内中断 trap 捕获 陷入 指由于CPU内部事件所引起的中断 如程序出错 非法指令 地址越界 电源故障等 内中断 通常 陷入是由于执行了现行指令所引起的 由于系统调用引起的中断属于内中断 因此把由于系统调用引起中断的指令称为陷入指令 2 中断和陷入向量为了处理上的方便 通常都是针对不同的设备编制不同的中断处理程序 并把该程序的入口地址放在某特定的内存单元中 此外 不同的设备也对应着不同的处理机状态字PSW 且把它放在与中断处理程序入口指针相邻接的特定单元中 在进行中断处理时 只要有了这样两个字 便可转入相应设备的中断处理程序 重新装配处理机的状态字和优先级 进行对该设备的处理 因此 我们把这两个字称为中断向量 相应地 把存放这两个字的单元称为中断向量单元 类似地 对于陷入 也有陷入向量 不同的系统调用对应不同的陷入向量 在进行陷入处理时 根据陷入指令中的陷入向量 转入实现相应的系统调用功能的子程序 即陷入处理程序 由所有的中断向量和陷入向量构成了中断和陷入向量表 如图7 6所示 图7 6中断向量与陷入向量 a 中断向量 b 陷入向量 2 系统调用号和参数的设置系统调用号 为实现一个系统中设置多条系统调用 每条系统调用被赋予一个唯一系统调用号 系统调用命令 陷入指令 传递系统调用号给中断和陷入机制的方法 直接把系统调用号放在系统调用命令 陷入指令 中 IBM370和早期的UNIX系统 是把系统调用命令的低8位用于存放系统调用号 将系统调用号装入某指定寄存器或内存单元中 MS DOS是将系统调用号放在AH寄存器中 Linux则是利用EAX寄存器来存放应用程序传递的系统调用号 系统调用参数设置实现方式 1 陷入指令自带方式 陷入指令携带一个系统调用号和几个参数到系统内部 主要问题 一条陷入指令的长度有限 自带的只能是少量的 有限的参数 2 直接将参数送入相应的寄存器中 系统程序和应用程序都可以访问相应寄存器 MS DOS便是采用的这种方式 即用MOV指令将各个参数送入相应的寄存器中 主要问题 寄存器数量有限 限制所设置参数的数目 2 系统调用号和参数的设置 3 参数表方式 将系统调用所需的参数放入一张参数表中 再将指向该参数表的指针放在某个指定的寄存器中 当前大多数的OS中 如UNIX系统和Linux系统 便是采用了这种方式 直接参数方式 所有的参数值和参数的个数N 都放入一张参数表中间接参数方式 在参数表中仅存放参数个数和指向真正参数数据表的指针 图7 7系统调用的参数形式 系统调用参数设置实现方式 3 系统调用的处理步骤在设置了系统调用号和参数后 便可执行一条系统调用命令 在UNIX系统执行CHMK命令 MS DOS中执行INT21软中断 系统调用的处理过程可分成以下三步 状态转换与现场保护将处理机状态由用户态转为系统态 由硬件和内核程序进行系统调用的一般性处理 即首先保护被中断进程的CPU环境 将处理机状态字PSW 程序计数器PC 系统调用号 用户栈指针以及通用寄存器内容等 压入堆栈 将用户定义的参数传送到指定的地址保存起来 查找系统调用入口表 执行处理子程序 系统调用入口表 每个表目对应一条系统调用 内容包含系统调用自带参数的数目 系统调用处理子程序的入口地址等 恢复现场 在系统调用处理子程序执行完后 恢复被中断的或设置新进程的CPU现场 然后返回被中断进程或新进程 继续往下执行 系统调用处理函数根据trap指令后面的系统调用号去查系统调用入口表 然后转入各个具体的系统调用处理程序 系统调用入口表 系统调用入口表sysent结构 7 3 5系统调用实现过程示例 设用户进程A在运行中要向已打开的文件 用fd表示 写一批数据 为此在用户C源程序中可用如下系统调用语句 rw write fd buf count 这条语句经编译以后形成的汇编指令形式如下 trap4参数1参数2参数3 7 3 5系统调用的实现过程 实际上系统调用语句本身是硬件提供的 机器指令 但其所调用的功能是OS提供的 每种机器的机器指令集中都有一条系统调用指令 系统调用实现过程示例 设置系统调用号和参数 调用号作为指令的一部分 如早期UNIX 或装入到特定寄存器里 如 DOSint21h AH 调用号 参数装入到特定寄存器里 或以寄存器指针指向参数表 内存区域 执行trap int指令 入口的一般性处理 查入口跳转表 跳转到相应功能的过程 保护CPU现场 将PC与PSW入栈 改变CPU执行状态 处理机状态字PSW切换 地址空间表切换 将参数取到核心空间执行OS内部代码 执行iret指令 将执行结果装入适当位置 类似于参数带入 恢复CPU现场 以栈顶内容置PSW和PC xyz system call sys xyz ret from sys call iret xyz int0 x80 sys xyz 在应用程序在libc标准库系统调用系统调用调用中的中的封装例程处理程序服务例程系统调用 用户态内核态 Linux调用一个系统调用 libc库对不同的服务例程进行封装 Linux定义了从 syscall0到 syscall5的六个宏每个宏名字的数字0到5对应着系统调用所用的参数个数 系统调用号除外 系统调用的参数个数一般不超过六个 每个宏严格地需要2 2 n个参数 n是系统调用的参数个数 另外两个参数指明系统调用的返回值类型和名字 每一对参数指明相应的系统调用参数的类型和名字例 fork 的封装例程 syscall0 int fork 在用户态进行系统调用时 要进行用户态堆栈到内核态堆栈的切换 但在内核中进行系统调用时 不用进行堆栈切换 Linux在系统文件 usr src linux 2 4 arch i386 kernel entry S中存放了系统所提供的系统调用的入口表 表中给出了函数名与调用编号之间的对应关系 比如exit 的调用号是1号 fork 是2号 以此类推 如下所示为部分调用号与函数名之间对应的系统调用入口表 ENTRY sys call table longSYMBOL NAME sys ni syscall 0old setup systemcall longSYMBOL NAME sys exit longSYMBOL NAME sys fork longSYMBOL NAME sys read longSYMBOL NAME sys write longSYMBOL NAME sys open 5 longSYMBOL NAME sys close longSYMBOL NAME sys waitpid longSYMBOL NAME sys creat longSYMBOL NAME sys link longSYMBOL NAME sys unlink 10 Linux的系统调用 在系统文件 usr src linux 2 4 kernel sys c中存放了一部分系统调用函数 它们都以asmlinkage开头 类型都是long 而且在调用的函数名前面加上前缀sys 如下所示 比如 上面的入口表中的第0号系统调用函数ni syscall就是asmlinkagelongsys ni syscall void 函数 如下所示 asmlinkagelongsys ni syscall void return ENOSYS Linux的系统调用 还有其它一些系统调用函数 它们都以asmlinkagelongsys 开头 比如 asmlinkagelongsys getrusage intwho structrusage ru if who RUSAGE SELF Linux的系统调用 Linux的系统调用 在系统内核中增加一个新的系统调用函数 则必须修改上述两个系统文件entry S和sys c 并对系统内核进行重新编译形成新的内核 系统才能识别新增加的系统调用函数 添加系统调用步骤 实现系统调用服务例程 把sys mysyscall加在kernel目录下的系统调用文件sys c中在系统调用表 在entry S中 中添加自己的服务例程sys mysyscall添加系统调用号 系统调用号在unistd h文件中定义 以 NR 开头重新编译内核编写用户态程序 源码的修改 kernel sys c中增加系统服务例程如下 asmlinkageintsys addtotal intnumdata inti 0 intenddata 0 while i numdata enddata enddata i i returnenddata 该函数有一个int型入口参数numdata 并返回从0到numdata的累加值 然而也可以把系统服务例程放在一个自己定义的文件或其他文件中 只是要在相应文件中作必要的说明 把smlinkageintsys addtotal int 的入口地址加到sys call table表中 arch i386 kernel entry S中的最后几行源代码修改前为 longSYMBOL NAME sys sendfile longSYMBOL NAME sys ni syscall streams1 longSYMBOL NAME sys ni syscall streams2 longSYMBOL NAME sys vfork 190 reptNR syscalls 190 longSYMBOL NAME sys ni syscall endr修改后为 longSYMBOL NAME sys sendfile longSYMBOL NAME sys ni syscall streams1 longSYMBOL NAME sys ni syscall streams2 longSYMBOL NAME sys vfork 190 addbyI longSYMBOL NAME sys addtotal reptNR syscalls 191 longSYMBOL NAME sys ni syscall endr 把增加的sys call table表项所对应的向量 在include asm 386 unistd h中进行必要申明 以供用户进程和其他系统进程查询或调用 增加后的部分 usr src linux include asm 386 unistd h文件如下 define NR sendfile187 define NR getpmsg188 define NR putpmsg189 define NR vfork190 addbyI define NR addtotal191 Linux内核编译第一步 清除内核中不稳定的目标文件 附属文件及内核配置文件makemrproper第二步 清除以前生成的目标文件和其他文件makeclean第三步 采用默认的内核配置makeoldconfig第四步 编译内核makebzImage第五步 编译模块makemodules第六步 安装模块makemodules install 测试程序 test c 如下 include include syscall1 int addtotal int num main inti j i 36 j addtotal i printf Totalfrom0to dis dn i j 运行结果 gcc testtest c testTotalfrom0to36is666 DOS系统调用举例 凡是与硬件相关 与应用无关的工作 都通过OS程序来完成 1 利用系统调用向打印机输出5个字符 方法1 调用DOS功能向打印机输出MOVEA PARA1MOVEB PARA2INT21H 方法2 用OUT指令直接打印L1 MOVEA IINADDR1 BORB BSJNCL1OUTADDR2 ARET 利用系统调用和out指令完成打印功能的比较 I O设备的硬件接口 一般由四种寄存器 地址 数据 状态 控制 或其子集组成 任一程序中若要使用I O设备来输出数据或接受输入 必须通过对这四种寄存器读写的I O机器指令进行 使用系统调用的程序段则简单许多 程序员不再需要与接口寄存器打交道 只需一个简单的调用即可 2 利用系统调用实现硬盘文件内容读写 在应用程序中直接利用I O指令进行硬盘文件内容读写将是十分复杂和困难的 原因为 磁盘的控制和状态接口寄存器比打印机的复杂的多 而且还有地址接口寄存器 涉及像磁道号 磁面号 扇区号这样复杂的外存物理地址 通常一个外存存储介质上可以存放多个文件 随着文件的建立 删除和拷贝在不停地变化 每个文件的长度随着其内容的变化而不停地变化 安全问题 MOVEDX OFFSETBUFFMOVECX BYTEMOVEBX HANDLEMOVEAH 3FHINT21H 7 4UNIX系统调用 7 4 1UNIX系统调用的类型1 进程控制 1 创建进程 fork 2 终止进程 exit 3 等待子进程结束 wait 4 执行一个文件 exec 5 获得进程ID getpgrp获得调用进程的进程组ID getppid获得调用进程的父进程ID 6 获得用户ID getuid获得真正的用户ID geteuid获得有效用户ID getgid获得真正用户组ID 7 进程暂停 pause 2 文件操纵 1 创建文件 creat 2 打开文件 open 3 关闭文件 close 4 读和写文件read和write 5 连接和去连接 link和unlink 3 信息维护 1 设置和获得时间 stime 2 获得进程和子进程时间 times 3 设置文件访问和修改时间 utime 4 获得当前UNIX系统的名称 uname 4 进程间的通信IPC 1 消息机制 建立一个消息队列msgget 若成功 便返回消息队列描述符msgid 发送消息msgsend向用户指定的消息队列发送消息 从指定的消息队列中接收指定类型的消息msgrcv 2 共享存储器机制 建立一个共享存储区shmget 若成功 便返回该共享存储区描述符shmid 将该共享存储区连接到本进程的虚地址空间上shmat 拆除进程与共享存储区间的连接shmdt 3 信号量机制 7 5图形用户界面GUI 1 GUI的特点利用图形元素表示功能 将各种图形元素显示在屏幕上 用户可以通过操纵图形元素 如菜单 图标 来执行相应的功能同屏多窗口与并发进程相对应 屏幕上同时显示多个窗口 一个进程可以对应一个或多个窗口 窗口动态创建 改变 撤销输入方式 鼠标指针点击 或其他定位设备 和键盘输入 通常是即时交互一致的图形元素风格可方便用户学习和使用 如按钮 滚动条优点 操作直观 不必记命令行参数 可与多个进程交互 便于进行多媒体处理 简而言之 交互的并发性好 传递信息量大 2 窗口系统的图形元素及其状态 窗口 window 屏幕上的矩形区域 可以通过掩模mask来显示任意形状 包括 标题条 titlebar 边框 border 窗口角 corner 系统菜单框 systemmenubox 最大化 最小化按钮 maximize minimize 滚动条 scrollbar 等状态 当前 非当前窗口 active inactive 接受输入 最大化 最小化 恢复原大小 restore 窗口的前后遮盖 Z轴 焦点 focus 接受键盘输入 而非鼠标 桌面 desktop 和墙纸 wallpaper 图标 icon 一个小图像 如32x32或64x64pixel 做为鼠标指针点击区 通过不同的图标可以标识不同的对象 如 可执行程序 最小化的窗口 文件 动画图标 鼠标指针 mousepointer 鼠标指针通常对应屏幕上的光标 cursor 光标在屏幕上只有一个 在不同屏幕位置 上下文 可以呈现不同形状 可以独立于鼠标来直接操纵光标 鼠标点击 左键 右键 中键 left right middlebutton 单击 click 双击 double click 拖曳 drag 拖放 drag and drop 按钮 button 鼠标点击或按回车键 空格键时执行相应功能 如menubutton 提供单项或多项选择 如radiobutton和checkbutton 当前按钮及其切换菜单 menu 临时窗口 菜单条 menubar 弹出式菜单 下拉式菜单 上下文相关菜单 对话框 dialogbox 临时窗口 显示提示信息或填写用户设置 3 窗口管理器 windowmanager 形成统一的使用风格 处理窗口的通用特性 如 窗口的大小 位置 窗口的标题条 边框 控制菜单框 窗口中由应用程序管理的部分称为 客户区 clientarea 协调各窗口间的相互关系 如 窗口之间的前后遮盖关系 桌面 7 5 2MSWindows 1 MSWindows结构OS系统服务 KERNEL 内存管理 程序加载 包括DLL 任务调度 文件管理用户接口 USER 窗口和消息管理 以及菜单 控制 对话框 定时器等图形设备接口 GDI GraphicDeviceInterface 管理显示器 为USER与应用程序提供与硬件设备独立的接口 2 基本概念消息 message 消息作为窗口的输入 如用户操作 其他窗口或系统发出的请求或通知 窗口过程 windowprocedure 消息由各窗口自己的窗口过程来作处理 窗口过程的调用参数 接收窗口句柄 可以在多个窗口共用一个窗口过程时加以区分 消息ID 消息的类型 消息参数 16 32位或32 32位值 整数或指针 还可以取得消息的发生时间和屏幕坐标 3 消息处理 两种方法排队消息 放到进程 线程的FIFO消息队列里 如应用程序发送的消息 系统的鼠标 键盘 定时器 窗口绘制和退出等 排队消息所用的API 发送消息到消息队列PostMessage 从消息队列读取消息GetMessage PeekMessage 分发一个消息到相应窗口DispatchMessage 非排队消息 直接发送到指定窗口的窗口过程 非排队消息所用的API SendMessage直到接收方窗口过程处理完才返回接收方正处于GetMessage 而接受并处理SendMessage送来的消息之后 仍处于GetMessage 为防止死锁 一般要 if InSendMessage ReplyMessage TRUE 消息循环 不断移出消息 并加以处理 用户不作处理的消息 应传给默认窗口过程加以处理 DefWindowProc WM PAINT消息 通知窗口客户区中的某部分 region 已被改变 应用程序应该对其重新绘制 总是被排在线程消息队列的最后 并且多个WM PAINT消息中的region会自动被合并为一个 1 特点Client Server结构 Xclient和server都是应用程序一个server可以为不同计算机上的多个client提供服务 server对有关I O设备具有访问权一个client也可以连接不同计算机上的多个server显示设备独立性和支持多种网络协议 在TCP IP DECnet之上的Xprotocol X不是计算机OS的一部分 其他大部分窗口系统都是以OS核心为基础的 如 MSWindows Macintosh SunView支持自由风格 policyfree 只提供机制不提供风格 包括窗口管理器 菜单 按钮 滚动条等的管理和操作 如 Motif OpenLook Tcl Tk等 7 5 3XWindow 2 XWindow的结构 XWindow的结构 各client 窗口管理器和Xserver可以在一台或多台计算机上用户对server所控制设备的操作都使server发送事件 event 如 鼠标移动 点击 键盘输入 事件是一个数据块 内容包括 事件类型 相关的窗口等client对来自server的事件进行处理 然后向server发送请求 request 如 窗口操作 显示图形或正文Xprotocol使用的传送信道 异步字节流 server不断发送事件而由client中的先进先出FIFO队列加以缓冲 client不断发送请求而由server中的FIFO队列加以缓冲 XWindow的队列 3 基本概念 屏幕 screen 和显示器 display 屏幕指显示设备硬件 而显示器指Xserver 及其控制的键盘 鼠标和屏幕 X允许一个显示器控制多个屏幕 即显示设备硬件 资源 resource 是Xwindow使用的窗口 位图 bitmap 字体 font 调色板 colormap 和其他数据结构的总称 资源在Xserver中创建和存储 按照client的请求来加以管理 而client退出时撤销对应的资源 通过资源标识 resourceID 整数类型 来标识不同的资源 包括系统资源 资源的自身不体现风格窗口树 层次 子窗口只显示出被父窗口剪切 clip 的区域 4 Xlib和工具箱 toolkit Xlib函数库 将接收到的Xprotocol转换为事件 并将请求转换为发送Xprotocol 其代码链接在Xclient中 如 打开显示器 XOpenDisplay char display name 与Xserver建立连接取得Xconnection的文件描述符 XConnectionNumber Xtoolkit 提供各种构件的例程库 便于用户使用 体现不同的风格 如 Motif OpenLook Tcl Tk 构件的数据结构存储在Xclient构件 widget 由多个资源 最终是resourceID 复合而成 具有特定外观和功能的部件 如 按钮 菜单和滚动条 如同建筑上的预制件 本质是 对某些事件给出了默认响应 通常是改变外观 并可以挂接回调过程来进行用户定义的处理 方便用户使用 如Tcl Tk button app button2 imageicon2 command incrx0 各个widget也构成widgettree 最顶层是top levelwidget 在toolkit初始化时建立 editres命令 查看widgettree 并对X应用进程中的资源进行动态修改widgetset 构件集合 构件类 widgetclass 和构件实例 widgetinstance XtIntrinsics 对构件的管理和操作 如 建立和撤销widget 管理资源 包括widget的初始值 处理事件并调用相应的处理程序 回调过程call back 7 5 4事件驱动模式 event driven 若C1 C2 C3在判断时是阻塞式 blocking 则一个分支在阻塞等待时 使得其他两个即使条件具备也不被立即执行若C1 C2 C3在判断时是非阻塞式 non blocking 则C1 C2 C3不间歇地反复查询 CPU开销大 面临的问题几个处理分支在各自条件下 间歇地 重复地执行次序不定 如 While done if C1 P1 C1 管道1可读 if C2 P2 C2 管道2可写 if C3 P3 C3 定时器的时间到 2 事件驱动模式 将多路判断和等待汇集为一路UNIX系统中相应的系统调用或库函数为 select Solaris2 3库函数 Linux系统调用 poll Solaris2 3系统调用 特点 节省运行CPU开销 无事件时等待而不是反复查询 有事件时才处理当处理分支较多时 switch语句变得复杂和不易掌握 While done NextEvent Event 获取下一个事件 若无事件则等待直到有事件 switch Event Type caseC1 P1 caseC2 P2 caseC3 P3 3 分发驱动模式 特点 通过对象管理机构 如Xtoolkit 创建多个对象或构件 输入事件通过对象各自的回调过程 call backprocedure 来处理通过对象管理机构 将输入事件分发给适当的元素 无须了解分发过程的实现 CreateObject object1 P1 CreateObject object2 P2 CreateObject object3 P3 While done NextEvent Event 获取下一个事件 若无事件则等待直到有事件 Dispatch Event 分发事件给相应的回调过程 4 举例 MSWindows的消息处理 WinMain CreateWindow MainWndClass SampleName 窗口过程的入口指针包括在WNDCLASS结构中 通过RegisterClass注册窗口类 while GetMessage XWindow的事件处理 main topWidget XtAppInitialize XtRealizeWidget while 1 这里的while循环等价于XtAppMainLoop函数 XtAppNextEvent intWINAPIWinMain HINSTANCEhInstance HINSTANCEhPrevInstance PSTRszCmdLine intiCmdShow HWNDhwnd MSGmsg WNDCLASSwndclass 初始wndclass 关键是设置WndProc回调函数RegisterClass Windows程序示意 while GetMessage intmain intargc char argv Display display char display name NULL Windowwin XEventev ConnecttoXserver if display XOpenDisplay display name NULL win XCreateSimpleWindow display RootWindow display screen num x y width height border width BlackPixel display screen num WhitePixel display screen num Choosewhicheventswewanttohandle XSelectInput display win KeyPressMask DisplayWindow XMapWindow display
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论