当前位置: 首页 > news >正文

东莞哪家网站建设专业小游戏制作开发

东莞哪家网站建设专业,小游戏制作开发,大连网络设计有限公司,天津正规网站建设调试公司目录 前言 正文#xff1a; 1消息队列 1.1什么是消息队列#xff1f; 1.2消息队列的数据结构 1.3消息队列的相关接口 1.3.1创建 1.3.2释放 1.3.3发送 1.3.4接收 1.4消息队列补充 2.信号量 2.1什么是信号量 2.2互斥相关概念 2.3信号量的数据结构 2.4…目录 前言 正文 1消息队列 1.1什么是消息队列  1.2消息队列的数据结构  1.3消息队列的相关接口  1.3.1创建  1.3.2释放  1.3.3发送  1.3.4接收  1.4消息队列补充 2.信号量  2.1什么是信号量  2.2互斥相关概念  2.3信号量的数据结构 2.4信号量相关接口  2.4.1创建  2.4.2释放 2.4.3操作 2.5信号量补充 3.深入理解 System V通信方式  总结 前言 在 System V 通信标准中还有一种通信方式消息队列以及一种实现互斥的工具信号量随着时代的发展这些陈旧的标准都已经较少使用了但作为 IPC 中的经典知识我们可以对其做一个简单了解扩展 IPC 的知识栈尤其是 信号量可以通过它为以后多线程学习中 POSIX 信号量的学习做铺垫 正文 1消息队列 1.1什么是消息队列  消息队列Message Queuing是一种比较特殊的通信方式它不同于管道与共享内存那样借助一块空间进行数据读写而是 在系统中创建了一个队列这个队列的节点就是数据块包含类型和信息 假设现在进程 A、B 想要通过消息队列进行通信首先创建一个消息队列然后进程 A 将自己想要发送给进程 B 的信息打包成数据块其中包括发送方的信息将数据块添加至消息队列队尾处进程 B 同样也可以向消息队列中添加数据块同时也会从消息队列中捕获其他进程的数据块解析后进行读取这样就完成了通信 遍历消息队列时存数据块 还是 取数据块 取决于 数据块中的类型 type 注意 消息队列跟共享内存一样是由操作系统创建的其生命周期不随进程因此在使用结束后需要删除 下面有关于消息队列详解的文章 《什么是消息队列》《消息队列详解》 1.2消息队列的数据结构  同属于 System V 标准消息队列也有属于自己的数据结构 注msg 表示 消息队列 struct msqid_ds {struct ipc_perm msg_perm; /* Ownership and permissions */time_t msg_stime; /* Time of last msgsnd(2) */time_t msg_rtime; /* Time of last msgrcv(2) */time_t msg_ctime; /* Time of last change */unsigned long __msg_cbytes; /* Current number of bytes in queue (nonstandard) */msgqnum_t msg_qnum; /* Current number of messages in queue */msglen_t msg_qbytes; /* Maximum number of bytes allowed in queue */pid_t msg_lspid; /* PID of last msgsnd(2) */pid_t msg_lrpid; /* PID of last msgrcv(2) */ };和 共享内存 一样其中 struct ipc_perm 中存储了 消息队列的基本信息具体包含内容如下 struct ipc_perm {key_t __key; /* Key supplied to msgget(2) */uid_t uid; /* Effective UID of owner */gid_t gid; /* Effective GID of owner */uid_t cuid; /* Effective UID of creator */gid_t cgid; /* Effective GID of creator */unsigned short mode; /* Permissions */unsigned short __seq; /* Sequence number */ };可以通过 man msgctl 查看函数使用手册其中就包含了 消息队列 的数据结构信息 1.3消息队列的相关接口  论标准的重要性消息队列的大小接口风格与共享内存一致都是出自 System V 标准 1.3.1创建  使用 msgget 函数创建 消息队列 #include sys/types.h #include sys/ipc.h #include sys/msg.hint msgget(key_t key, int msgflg);关于 msgget 函数 与 共享内存 的 shmget 可以说是十分相似了关于 ftok 函数计算 key 值这里就不再阐述可以在这篇文章中学习 《Linux进程间通信【共享内存】》 简单使用函数 msgget 创建 消息队列并使用 ipcs -q 指令查看资源情况 #include iostream #include sys/types.h #include sys/ipc.h #include sys/msg.husing namespace std;int main() {//创建消息队列int n msgget(ftok(./, 668), IPC_CREAT | IPC_EXCL | 0666);if(n -1){cerr msgget fail! endl;exit(1);}return 0; }程序运行后创建出了一个 msqid 为 0 的消息队列 因为此时并 没有使用消息队列进行通信所以已使用字节 used-bytes 和 消息数 messages 都是 0 注意 消息队列在创建时也需要指定创建方式IPC_CREAT、IPC_EXCL、权限 等信息消息队列创建后msqid也是随机生成的大概率每次都不一样消息队列生命周期也是随操作系统的并不会因进程的结束而释放 1.3.2释放  消息队列也有两种释放方式通过指令释放、通过函数释放 释放指令ipcrm -q msqid 释放消息队列其他 System V 通信资源也可以这样释放 ipcrm -m shmid 释放共享内存ipcrm -s semid 释放信号量集 释放函数msgctl(msqid, IPC_RMID, NULL) 释放指定的消息队列跟 shmctl 删除共享内存一样 #include sys/types.h #include sys/ipc.h #include sys/msg.hint msgctl(int msqid, int cmd, struct msqid_ds *buf);关于 msgctl 函数 简单回顾下参数2部分可传递参数 IPC_RMID 表示删除共享内存IPC_STAT 用于获取或设置所控制共享内存的数据结构IPC_SET 在进程有足够权限的前提下将共享内存的当前关联值设置为 buf 数据结构中的值 同样的消息队列 消息队列的内核数据结构struct msqid_ds 真正开辟的空间 1.3.3发送  利用消息队列发送信息即 将信息打包成数据块入队尾所使用函数为 msgsnd #include sys/types.h #include sys/ipc.h #include sys/msg.hint msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);关于 msgsnd 函数 参数2 表示待发送的数据块这显然是一个结构体类型需要自己定义结构如下 struct msgbuf {long mtype; /* message type, must be 0 */char mtext[1]; /* message data */ };mtype 就是传说中数据块类型据发送方而设定mtex 是一个比较特殊的东西柔性数组其中存储待发送的 信息因为是 柔性数组所以可以根据 信息 的大小灵活调整数组的大小 1.3.4接收  消息发送后总得接收吧既然发送是往队尾中添加数据块那么接收就是 从队头中取数据块假设所取数据块为自己发送的那么就不进行操作其他情况则取出数据块使用 msgrcv 函数接收信息 #include sys/types.h #include sys/ipc.h #include sys/msg.hssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);关于 msgrcv 函数 同样的接收的数据结构如下所示也包含了 类型 和 柔性数组 struct msgbuf {long mtype; /* message type, must be 0 */char mtext[1]; /* message data */ };1.4消息队列补充 System V 版的 消息队列 使用起来比较麻烦并且过于陈旧现在已经较少使用了所以我们不必对其进行深究知道个大概就行了如果实际中真遇到了再查文档也不迟 2.信号量  2.1什么是信号量  信号量semaphore一种特殊的工具主要用于实现 同步和互斥 信号量 又称 信号灯是各大高校《操作系统》课程中老师提及的高频知识点往往伴随着 P、V 操作出现但大多数老师都只是提及了基本概念并未对 信号量 的本质及使用场景作出详细讲解 在正式学习 信号量 相关知识前需要先简单了解下 互斥相关四个概念为后续 多线程中信号量的学习作铺垫重点 2.2互斥相关概念  1、并发 是指系统中同时存在多个独立的活动单元 比如在多线程中多个执行流可以同时执行代码可能访问同一份共享资源 2、互斥 是指同一时刻只允许一个活动单元使用共享资源 即在任何一个时刻都只允许一个执行流进行共享资源的访问可以通过加锁实现 3、临界资源 与 临界区多执行流环境中的共享资源就是 临界资源涉及 临界资源 操作的代码区间即 临界区 在多线程环境中全局变量就是 临界资源对全局变量的修改、访问代码属于 临界区 4、原子性只允许存在 成功 和 失败 两种状态 比如对变量的修改要么修改成功要么修改失败不会存在修改一半被切走的状态 所以 互斥 是为了解决 临界资源 在多执行流环境中的并发访问问题需要借助 互斥锁 或 信号量 等工具实现 原子操作实现 互斥 关于互斥锁mutex 的相关知识在 多线程 中介绍现在先来学习 信号量搞清楚它是如何实现 互斥 的 2.3信号量的数据结构 下面来看看 信号量 的数据结构通过 man semctl 进行查看 sem 表示 信号量 struct semid_ds {struct ipc_perm sem_perm; /* Ownership and permissions */time_t sem_otime; /* Last semop time */time_t sem_ctime; /* Last change time */unsigned long sem_nsems; /* No. of semaphores in set */ };System V 家族基本规矩struct ipc_perm 中存储了 信号量的基本信息具体包含内容如下 struct ipc_perm {key_t __key; /* Key supplied to semget(2) */uid_t uid; /* Effective UID of owner */gid_t gid; /* Effective GID of owner */uid_t cuid; /* Effective UID of creator */gid_t cgid; /* Effective GID of creator */unsigned short mode; /* Permissions */unsigned short __seq; /* Sequence number */ };显然无论是 共享内存、消息队列、信号量它们的 ipc_perm 结构体中的内容都是一模一样的结构上的统一可以带来管理上的便利具体原因可以接着往下看 2.4信号量相关接口  2.4.1创建  信号量的申请比较特殊一次可以申请多个信息量官方称此为 信号量集所使用函数为 semget #include sys/types.h #include sys/ipc.h #include sys/sem.hint semget(key_t key, int nsems, int semflg);关于 semget 函数 除了参数2其他基本与另外俩兄弟一模一样实际传递时一般传 1表示只创建一个 信号量 使用函数创建 信号量集并通过指令 ipcs -s 查看创建的 信号量集 信息 #include iostream #include sys/types.h #include sys/ipc.h #include sys/sem.husing namespace std;int main() {//创建一个信号量int n semget(ftok(./, 668), 1, IPC_CREAT | IPC_EXCL | 0666);if(n -1){cerr semget fail! endl;exit(1);}return 0; }程序运行后创建了一个 信号量集nsems 为 1表示在当前 信号量集 中只有一个 信号量 信号量集在创建时也需要指定创建方式IPC_CREAT、IPC_EXCL、权限 等信息信号量集创建后semid也是随机生成的大概率每次都不一样信号量集生命周期也是随操作系统的并不会因进程的结束而释放 2.4.2释放 老方法 指令释放直接通过指令 ipcrm -s semid 释放信号量集略 通过函数释放semctl(semid, semnum, IPC_RMID)信号量中的控制函数有一点不一样 #include sys/types.h #include sys/ipc.h #include sys/sem.hint semctl(int semid, int semnum, int cmd, ...);关于 semctl 函数 注意 参数2 表示信号量集中的某个信号量编号从 1 开始编号参数3 中可传递的动作与共享内存、消息队列一致参数4 就像 printf 和 scanf 中最后一个参数一样可以灵活使用 2.4.3操作 信号量的操纵比较ex也比较麻烦所以仅作了解即可 使用 semop 函数对 信号量 进行诸如 1、-1 的基本操作 #include sys/types.h#include sys/ipc.h#include sys/sem.hint semop(int semid, struct sembuf *sops, unsigned nsops);关于 semop 函数 重点在于参数2这是一个结构体具体成员如下 unsigned short sem_num; /* semaphore number */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */其中包含信号量编号、操作等信息需要我们自己设计出一个结构体然后传给 semop 函数使用 可以简单理解为sem_op 就是要进行的操作如果将 sem_op 设为 -1表示信号量 -1申请同理 1 表示信号量 1归还 2.5信号量补充 信号量 是实现 互斥 的其中一种方法具体表现为资源申请计数器 -1资源归还计数器 1只有在计数器不为 0 的情况下才能进行资源申请可以设计 二元信号量 实现 互斥 System V 中的 信号量 操作比较麻烦但 信号量 的思想还是值得一学的等后面学习 多线程 时也会使用 POSIX 中的 信号量 实现 互斥相比之下POSIX 版的信号量操作要简单得多同时应用也更为广泛 因为 信号量 需要被多个独立进程看到所以 信号量 本身也是 临界资源不过它是 原子 的所以可以用于 互斥 多个独立进程看到同一份资源这就是 IPC 的目标所以 信号量 被划分至进程间通信中   3.深入理解 System V通信方式  不难发现共享内存、消息队列、信号量的数据结构基本一致并且都有同一个成员 struct ipc_perm所以实际对于 操作系统 来说对 System V 中各种方式的描述管理只需要这样做 将 共享内存、消息队列、信号量对象描述后统一存入数组中再进行指定对象创建时只需要根据 ipc_id_arr[n]-__key 进行比对即可当前对象是否被创建因为 struct shmid_ds 与 struct ipc_perm shm_perm 的地址一致其他对象也一样所以可以对当前位置的指针进行强转((struct shmid_ds)ipc_id_arr[0]) 即可访问 shmid_ds 中的成员这不就是多态中的虚表吗 这样一来操作系统可以只根据一个地址灵活访问 两个结构体中的内容比如 struct ipc_perm shm_perm 和 struct shmid_ds并且操作系统还把多种不同的对象描述融合入了一个 ipc_id_arr 指针数组中真正做到了 高效管理 注默认 ipc_id_arr[n] 访问的是 struct ipc_perm 中的成员 注上述图示只是一个草图目的是为了辅助理解原理并非操作系统中真实样貌 操作系统在进行比较判断时如何判断类型呢 这就是操作系统设计的巧妙之处了ipc_id_arr 没那么简单它会存储对象的相应类型信息 通过下标id 访问对象这与文件系统中的机制不谋而合不过实现上略有差异间接导致 System V 的管理系统被边缘化历史选择了文件系统 shmid、msqid 和 semid 都是 ipc_id_arr 的下标为什么值很大呢 在进行查找时会将这些 id % 数组大小 进行转换确保不会发生越界事实上这个值与开机时间有关开机越长值越大当然到了一定程度后会重新轮回 总结 上面就是关于信号量部分的内容有个大概了解就行。
http://www.dnsts.com.cn/news/14462.html

相关文章:

  • 做球迷网站济南网络招聘
  • 亚洲做性视频网站网站策划编辑如何做
  • c语言怎么做网站重庆网站建公司大全
  • 网站移动端指的是什么网站类别标签文本
  • 寮步做网站济南j建设网
  • 广东网站建设哪里有赣州门户网站建设
  • 网站租用泸州网站建设公司
  • 建设网站服务商小白学网站建设与设计书
  • iis网站主目录阿里云网站更换域名
  • 西安关键词网站排名输入关键词就能写文章的软件
  • 网站可以同时做竞价和优化吗注册门户网站
  • 专业制作网站服务wordpress静态页生成
  • 喜欢网站建设学什么专业微信网站改版价格
  • 做网站人wordpress 管理密码
  • 网站开发房源岗位网站定位
  • 北京建网站公司哪家便宜广告免费设计在线生成
  • 网站开发过程分为哪几个阶段lnmp 网站开发总结
  • 佛山网站设计代理商泰国做彩票网站
  • 网站开发客户wordpress常见问题
  • 做汽车商城网站seo自助建站平台
  • 网站运营内容方案wordpress ftp 主机名
  • 东营做网站优化的公司中航建设集团网站
  • 如何更快的学习.net网站开发用凡科做的手机网站版
  • 请人做ppt的网站网上购物最实惠的网站
  • 介绍一个做美食的网站上海网站的优化公司哪家好
  • 厦门网站设计公司推荐网站空间的申请
  • 成都网站维护网页微博视频不能播放
  • wordpress公司网站插件工信部备案网站打不开
  • 高端网站有哪些优势阿里云的wordpress如何设置
  • 郑州企业建站网站建设工程造价管理总站网站