《2022年操作系统课程设计进程间通信》由会员分享,可在线阅读,更多相关《2022年操作系统课程设计进程间通信(8页珍藏版)》请在金锄头文库上搜索。
1、2003 级操作系统课程设计指导二-进程间通信设计2006/6/20沈奕鹏管建军一、设 计 目 的Linux 系统的进程通信机构(IPC) 允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉 Linux 支持的消息通信机制、共享存储区机制及信息量机制。二、设 计 内 容1. 消息的创建,发送和接收。使用系统调用msgget(),msgsnd() ,msgrev() 及 msgctl()编制一长度为1K 的消息的发送和接收程序。观察上面程序,说明控制消息队列系统调用msgctl()在此起什么作用? 2. 共享存储区的创建、附接和断接。使用系统调用shmget(),shmat() ,sgm
2、dt() ,shmctl(),编制一个与上述功能相同的程序。三 、 指导 步骤1. 消 息的 创建 、发 送和 接 收( 任务) 使 用 系统 调用 msgget(),msgsnd(),msgrev(),及 msgctl()编 制 一 长度 为 1K 的 消息发送 和接 收的程 序。( 程序设 计 (1) 为了 便 于 操作 和观 察结 果 , 用一 个程 序作 为“引 子”, 先 后 fork()两 个子 进程 , SERVER 和 CLIENT, 进 行 通信 。(2)SERVER 端建 立一个 Key 为 75 的 消息队 列, 等 待 其 他进 程发 来 的 消息 。当 遇到 类型 为
3、 1 的消 息 , 则作 为结 束信 号, 取消 该 队 列, 并 退出SERVER 。SERVER 每接 收到 一个 消息后 显 示一 句 “ (server)received。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - (3)CLIENT端 使 用 key 为 75 的消 息队 列, 先后 发送 类型 从 10 到 1 的消 息, 然 后 退出 。 最 后的 一个 消息 , 即 是 SERVER 端 需 要 的结 束 信
4、号 。CLIENT 每 发 送 一条消 息后 显 示 一句“ (client)sent”。(4) 父进 程 在 SERVER 和 CLIENT 均退 出后结 束 。程序) /*e-2-1*/#include#include#include#include#define MSGKEY 75 /* 定义关键词MEGKEY*/struct msgform /* 消息结构 */long mtype;char mtextl030; /* 文本长度 */msg;int msgqid,i;void CLIENT() int i;msgqid=msgget(MSGKEY,0777);for(i=10;i=1;
5、 i-)msg.mtype=i; printf(client)sentn);msgsnd(msgqid,&msg,1024,0); /* 发送消息msg入 msgid消息队列 */exit(0);名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - void SERVER()msgqid=msgget(MSGKEY,0777|IPC_CREAT); /* 由关键字获得消息队列*/domsgrcv(msgqid,&msg,1030,0,
6、0); /* 从 msgqid队列接收消息msg */printf(server)receivedn);while(msg.mtype!=1); /* 消息类型为1 时,释放队列 */msgctl(msgqid,IPC_RMID,0);exit(O);int main()while(i=fork()=-1);if(!i)SERVER();while(i=fork()=-1);if(!i)CLIENT();wait(0);wait(0);(结 果) 从 理 想的 结果 来 说, 应 当是 每 当 Clinet发送 一 个消 息后 ,Server接收该 消息 ,Clinet再 发送下 一条。 也就
7、 是 说“ (Clinet)sent和“ (server)received的 字样 应该 在 屏幕 上交 替出现 。实 际 的结 果大 多 是, 先由 Clinet发 送 了两 条消 息 , 然后 Server 接收 一条 消息。 此 后 C1inet-Server交 替发 送 和接 收消 息。 最后 Server一次 接名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 收 两条消 息 。 Client和 Server分别 发送
8、和接收 了 10 条消息 , 与预 期设 想一 致。(分 析) message 的 传送和 控制并 不保 证 完全 同步 , 当一 个 程序 不在 激 活状 态的 时候 , 它 完全 可能继 续 睡眠 , 造成 了上 面的现 象 , 在 多次 sendmessage后 才 receive message。 这一点 有助 于 理解 消息 传 送的 实现 机理。2. 共 享存储 区的创 建 , 附 接和断 接(任 务) 使 用 系统 调 用 shmget(),sgmat(),smgdt(),shmctl(),编制 一 个与 上述 相同功 能 的程 序。 (1) 为了 便 于 操作 和 观 察结 果
9、 , 用一 个程 序作 为“ 引 子”, 先 后 fork()两 个子 进程 , SERVER 和 CLIENT, 进行 通信 。(2)SERVER 端建 立一 个 Key 为 75 的 共享 区, 并将 第一 个字 节置 为-1 。作 为数 据 空的 标 志 。等 待其 他进 程发 来的 消息 。当 该 字 节的 值 发生变 化时 , 表示 收 到了 信 息 , 进 行处 理。 然 后再 次把 它的 值 设为 -1 。如 果遇到 的值 为 0, 则 视 为 结束 信 号, 取消 该 队列 , 并退 出 SERVER 。SERVER 每接 收到一 次数 据 后显 示 “ (server)rec
10、eived”。(3)CLIENT端建 立一个 Key 为 75 的共 享 区, 当共 享取 得第 一个字节 为-1 时 ,Server端 空闲 , 可 发 送 请求 。 CLIENT 随即 填 入 9 到 0。 期间等 待Server端 的 再 次空 闲 。进 行完 这些 操作后 ,CLIENT 退 出。 CLIENT 每 发 送一 次数 据 后显 示 “(client)sent。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - -
11、(4) 父进 程 在 SERVER和 CLIENT 均 退出 后结 束。( 程序) /*e-2-2*/#include#include#include#define SHMKEY 75 /* 定义共享区关键词*/int shmid,i;int *addr;void CLIENT() int i;shmid=shmget(SHMKEY,1024,0777);/*获取共享区 ,长度 1024,关键词 SHMKEY*/addr=shmat(shmid,0,0); /* 共享区起始地址为addr*/for(i=9;i=0;i-)while(*addr!=-1);printf(client)sentn)
12、; /* 打印 (client)sent*/*addr=i; /* 把 i 赋给 addr*/exit(O);void SERVER()shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /* 创建共享区 */addr=shmat(shmid,0,0); /* 共享区起始地址为addr*/do*addr=-1;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - while(*addr=-1);prin
13、tf(server)receivedn); /* 服务进程使用共享区*/while(*addr);shmctl(shmid,IPC_RMID,0);exit(O);void main()while(i=fork()=-1);if(!i)SERVER();while(i=fork()=-1);if(!i) CLIENT();wait(O);wait(O)( 结果) 运 行的 结 果 和预 想的 完全 一样 。但 在 运行的 过 程中, 发 现每 当 client发 送一 次 数据 后 ,server要等 待 大 约 0.1 秒才 有 响 应 。 同 样, 之 后 client又 需要 等待 约
14、0.1 秒才 发送 下一 个数 据。分析) 出 现上 述 的 应答 延迟 的现 象是 程序 设计 的问 题 。 当 client端发 送了数 据后 , 并 没有 任 何 措施 通 知 server端数 据已 经发 出 , 需要 由 client的查 询才 能 感知 。 此 时 ,client端 并没 有 放 弃系 统 的 控制 权, 仍然 占用 CPU的 时间 片 。只 有 当 系统 进行 调度 时, 切换 到了 server进 程, 再 进行应 答 。这 个问 题, 也同 样 存 在于 server端到 client的应 答过 程之 中 。3. 比较 两 种 消息 通信 机制 中的 数据 传
15、输 的时 间名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 由 于两 种 机 制实 现的 机理 和用 处都 不一 样, 难以 直接 进 行时间 上 的比较 。如 果比较 其 性 能 , 应 更 加 全面 地 分析 。(1) 消息 队 列 的建 立 比 共享 区 的设 立消 耗的 资源 少。 前 者只是 一 个软件 上设 定 的问 题 , 后 者需 要 对 硬件 操 作, 实 现内 存的 映 像 , 当然 控制起 来比 前者 复
16、杂 。如果 每次都 重新 进行 队列或 共 享的建 立 , 共 享区 的设立没 有什 么优 势。(2) 当消 息 队 列和 共 享 区建 立 好后 , 共享 区的 数 据 传输 , 受到了 系 统硬件 的支 持, 不耗 费 多 余的 资 源 ; 而 消息 传递 , 由 软件 进行 控制 和 实现 , 需要消 耗一 定的 CPU资 源 。从这个 意义 上讲 , 共 享区 更适 合频 繁和 大量的数 据传 输。(3) 消息 的 传 递 , 自 身 就带 有 同 步的 控 制 。当 等 到 消息 的 时候 , 进 程 进入 睡 眠 状态 , 不 再 消 耗 CPU资 源。 而 共 享队 列 如果 不
17、 借 助其 他 机 制进 行 同 步 , 接 收 数据 的 一方 必 须 进 行不 断 的 查询 , 白 白 浪费 了 大量 的 CPU资 源 。 可见 , 消 息方 式 的 使用 更 加灵 活 。二、说明:教材 “ 计算机操作系统教程第二版习题解答与实验指导-张尧学 ” 书,P90实验 ,有多个错误,这正是要求同学进行分析、排错和调试,这也是考核学生的实际动手能力。一定要仔细哦。一定要把自己的所有程序保存在一张软盘上,以供教师检查。课程设计结束,要上交课程设计报告一份和含有程序的软盘一张。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 完计算机软件教研室教师:沈奕鹏管建军 2006/6/20名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -