收藏 分享(赏)

操作系统课程设计之消息函数的分析论文.doc

上传人:无敌 文档编号:649255 上传时间:2018-04-16 格式:DOC 页数:43 大小:801KB
下载 相关 举报
操作系统课程设计之消息函数的分析论文.doc_第1页
第1页 / 共43页
操作系统课程设计之消息函数的分析论文.doc_第2页
第2页 / 共43页
操作系统课程设计之消息函数的分析论文.doc_第3页
第3页 / 共43页
操作系统课程设计之消息函数的分析论文.doc_第4页
第4页 / 共43页
操作系统课程设计之消息函数的分析论文.doc_第5页
第5页 / 共43页
点击查看更多>>
资源描述

1、1摘 要Linux 是一种自由和开放源码的类 Unix 操作系统。目前存在着许多不同的Linux,但它们都使用了 Linux 内核。Linux 可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux 采用消息队列的方式来实现消息传递。System V 的消息队列(message queues)是进程之间互相发送消息的一种异步(asynchronously)方式,在这种情形之下,发送方不必等待接收方检查它的消息即在发送完消息后,发送方就可以从事其它工作了而接收方也不必一直等待消息。新的消息总是放在队列的末尾,接收的时候并不总是从头来接

2、收,可以从中间来接收。消息队列允许一个或多个进程写消息,一个或多个进程读取消息。Linux 维护了一系列消息队列的 msgque 向量表。其中的每一个单元都指向一个 msqid_ds 的数据结构,完整描述这个消息队列。当创建消息队列的时候,从系统内存中分配一个新的 msqid_ds 的数据结构并插入到向量表中。关键字: Linux , 消息函数 ,分析2目 录摘 要 .11 课设简介 .31.1 课程设计题目 .31.2 课程设计小组成员 .32 LINUX 的消息函数主模块功能描述 .33 LINUX 的消息函数各个子模块功能描述 .43.1 Msgget: .43.2 Msgsnd: .5

3、3.3 Msgrcv: .63.4 Msgctl: .74 LINUX 的消息函数各个子模块相关函数代码分析结果 .94.1 有关常量、函数及相关错误信息的含义: .94.1.1 常量含义: .94.1.2 错误信息含义 .94.1.3 相关函数及文件首部含义 .94.2 函数 sys_msgget 的分析 .164.2.1 代码及注释 .164.3 发送消息函数 real_msgsnd 的分析 .234.3.1 代码分析 .234.4 接收消息函数 real_msgrcv 的分析 .284.4.1 代码及注释 .284.5 函数 sys_msgctl 的分析 .334.5.1 代码及注释 .

4、33心得体会 .42参考文献 .4331 课设简介1.1 课程设计题目LINUX 的消息函数的分析1.2 课程设计小组成员Msgget:孙帅,分析消息队列的创建函数(sys_msgget)以及与它相关的函 1数 newque、findkey、msg_init,写出代码分析结果,明确组内成员的明细分工,总体把握组内成员的进度。后期组织组内成员成果汇总进行本组总体报告撰写。王亚璇,画出流程图来表示相关函数之间的相互调用关系。魏蕾,负责查阅资料。Msgsnd:张婷,分析消息的发送函数(real_msgsnd)以及与它相关的函数 2sys_msgsnd,写出代码分析结果。王鑫坤,画出流程图来表示相关函

5、数之间的相互调用关系。闫瞳,张飞龙,负责查阅资料。Msgrcv:樊德山,分析消息的接收函数(real_msgrcv)以及与它相关的函 3数 sys_msgrcv,写出代码分析结果。赵松,画出流程图来表示相关函数之间的相互调用关系。鹿新宇,孙适,负责查阅资料。Msgctl:刘晶,分析消息队列的控制函数(sys_msgctl)以及与它相关的函 4数 freeque,写出代码分析结果。鞠冰霜,画出流程图来表示相关函数之间的相互调用关系。刘航,负责查阅资料。2 LINUX 的消息函数主模块功能描述Linux 采用消息队列的方式来实现消息传递。System V 的消息队列(message queues)

6、是进程之间互相发送消息的一种异步(asynchronously)方式,在这种情形之下,发送方不必等待接收方检查它的消息即在发送完消息后,发送方就可以从事其它工作了而接收方也不必一直等待消息。新的消息总是放在队列的末尾,接收的时候并不总是从头来接收,可以从中间来接收。消息队列允许一个或多个进程写消息,一个或多个进程读取消息。Linux 维护了一系列消息队列的 msgque 向量表。其中的每一个单元都指向一个 msqid_ds 的数据结构,完整描述这个消息队列。当创建消息队列的时候,从系统内存中分配一个新的 msqid_ds 的数据结构并插入到向量表中。每一个 msqid_ds 数据结构都包括一个

7、 ipc_perm 的数据结构和进入这个队列的消息的指针。另外,Linux 保留队列的改动时间,例如上次队列写的时间等。Msqid_ds 队列也包括两个等待队列:一个用于向消息队列写,另一个用于读。 4每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的 ipc_perm 数据结构的模式比较。如果进程可以向这个队列写,则消息会从进程的地址空间写到 msg 数据结构,放到消息队列的最后。每一个消息都带有进程间约定的,应用程序指定类型的标记。但是,因为 Linux 限制了可以写的消息的数量和长度,可能会没有空间容纳消息。这时,进程会被放到消息队列的写等待队列,然后调用调度程序选择

8、一个新的进程运行。当一个或多个消息从这个消息队列中读出去的时候会被唤醒。从队列中读是一个相似的过程。进程的访问权限一样被检查。一个读进程可以选择是不管消息的类型从队列中读取第一条消息还是选择特殊类型的消息。如果没有符合条件的消息,读进程会被加到消息队列的读等待进程,然后运行调度程序。当一个新的消息写到队列的时候,这个进程会被唤醒,继续运行。3 LINUX 的消息函数各个子模块功能描述3.1 Msgget:功能:取得一个消息队列。调用者提供消息队列的键标(用于表示一个消息列的唯一的名字) ,当这个队列存在的时候,这个系统调用负责返回这个队列的标识号;如果这个队列不存在,就创立一个消息队列,然后返

9、回这个消息队列的标识号。主要由 sys_msgget 执行。说明:系统调用返回与参数 key 相关的消息队列的标识符.若以下事实成立,则与消息队列相关的标识符和数据结构将被创建出来:若参数 key 等于 IPC_PRIVATE.若参数 key 没有存在的消息队列标识符与之相关,同时(msgflg否则返回值为-1. 简单框图:53.2 Msgsnd:功能:发送消息到指定的消息队列中。主要由 real_msgsnd 执行。说明:发送一个消息到由 msqid 指定消息队列标识号的消息队列.参数 msgp 指向一个用户定义的缓冲区,并且缓冲区的第一个域应为长整型,指定消息类型,其他数据放在缓冲区的消息

10、中其他正文区内.下面是消息元素定义:long mtype;char mtext;mtype 是一个整数,用于接收进程选择消息类型.mtext 是一个长度为 msgsz 字节的任何正文,参数 msgsz 可从 0 到系统允许的最大值之间变化.msgflg 指定操作行为:若(msgflg /消息队列static int msgbytes = 0; /消息队列中所有消息的总字节数static int msghdrs = 0; /消息队列的队头static unsigned short msg_seq = 0;static int used_queues = 0; /已用的消息队列数static in

11、t max_msqid = 0; /消息队列最大的 ID 值static struct wait_queue *msg_lock = NULL; /消息队列锁定,不让等待进程进入4.1.2 相关错误信息的含义:EINVAL 22 /* Invalid argument */EFAULT 14 /* Bad address */EIDRM 43 /* Identifier removed */EACCES 13 /* Permission denied */EAGAIN 11 /* Try again */EINTR 4 /* Interrupted system call */ENOMEM12

12、 /* Out of memory */E2BIG 7 /* Arg list too long */ENOMSG42 /* No message of desired type */ENOSPC 28 /* No space left on device */ENOMEM12 /* Out of memory */EPERM 1 /* Operation not permitted */ENOENT 2 /* No such file or directory */EEXIST 17 /* File exists */4.1.3 相关函数及文件首部含义:struct msg_receiver

13、 struct list_head r_list; /* 等待接收者进程列表*/struct task_struct* r_tsk; /*任务列表*/int r_mode; /* 接收模式*/long r_msgtype; /* 等待的消息模型*/long r_maxsize; /* 最大大小*/10struct msg_msg* volatile r_msg; /* 消息结构*/;struct msg_sender struct list_head list; /* 等待发送者进程列表*/struct task_struct* tsk; /* 任务列表*/;struct msg_msgseg

14、 /*每一个消息都要有 msg_msg 数据结构*/struct msg_msgseg* next;/*消息的下一部分 */;struct msg_msg /: msg 消息队列数据结构:/struct list_head m_list; /*用于存放消息的链表*/long m_type; /*消息类型*/ int m_ts; /*消息文本大小*/struct msg_msgseg* next;/*下一个消息*/;struct msg_queue struct kern_ipc_perm q_perm;/*IPC 许可证*/time_t q_stime; /* 最后发送时间*/time_t q

15、_rtime; /* 最后接收时间*/time_t q_ctime; /* 最后修改时间 */unsigned long q_cbytes; /*队列当前的字节数 */unsigned long q_qnum; /*队列中消息的数量 */unsigned long q_qbytes; /*队列的最大字节数*/pid_t q_lspid; /* 最后一个发送者进程的 PID*/pid_t q_lrpid; /* 最后一个接受者进程的 PID*/struct list_head q_messages; /* 存放消息的队列*/struct list_head q_receivers; /* 消息接收者的队列*/struct list_head q_senders; /* 消息发送者的队列*/;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 管理论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报