systemV消息队列-不用详细了解

创建消息队列msgget函数,删除msgctl函数,发消息msgsnd,收消息msgrcv

信号量Semaphore

了解5个概念

信号量本质上是一个计数器,用来表示公共资源中资源的数量。信号量能为用户预定资源。

公共资源:被多个进程同时访问的资源。可以作为一个整体来使用,也可以划分成为一个一个的子资源来使用。

背景:比如通过共享内存进行通信,由于这块公共资源不受保护,就会出现数据不一致的问题。

我们将保护起来的公共资源称为临界资源,进程有对应的代码来访问这部分临界资源,代码所在的地址空间称为临界区。<==>与之对应的就有非公共资源(每个进程独立,有专属的资源),用于访问自己内部资源的代码称为非临界区。

保护的方法之一:互斥,就是当一个进程正在访问这块公共资源时,其他进程不能访问。

要么不做,要么就是做完,只有两态,称为原子性。如转账,要么转账成功,要么没成功余额不变。

信号量就是 原子式的同步和互斥的保护方法,计数器,不过不能用全局变量来实现,因为不同的进程是看不到这个全局变量的,就算是父子进程也不行,会发生写时拷贝。

PV操作

  • P操作 sem++;预定资源
  • V操作 sem--;释放资源

所有进程在访问公共资源前,都必须先申请sem信号量,只有成功了,才能进去–>前提是所有进程必须先看到同一个信号量–>信号量本身就是公共资源–>而信号量要保护其他资源,首先是保护自己,要保证自身操作的安全性–>信号量的++和–操作是原子的

二元信号量有互斥功能:当sem的初始值为1时,表示这个临界资源是当作整体来使用的,一个进程申请了,其他进程就无法申请,这就是互斥。sem=1表示二元信号量

函数接口

semget()函数 申请systemV信号量

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
功能:用来创建信号量所在的共享内存
原型int semget(key_t key, int nsems, int semflg);
参数key:ftok()函数返回值,是共享内存段名字,保证该块信号量的唯一性nsems:需要申请信号量的个数,>0 & <=最大申请值。为0时,就不申请semflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的IPC_CREAT 如果信号量不存在,就创建;存在,则返回地址IPC_EXCL 无法单独使用,要与IPC_CREATE一起用。如果信号量不存在,就创建;如果存在,就出错返回-->如果创建成功,就一定是一个新的信号量
返回值申请成功,返回信号量集标识符;申请失败,返回-1

semop()函数 PV操作-预定/释放资源

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
功能:用于预定/释放资源
原型int semop(int semid, struct sembuf *sops, unsigned nsops);
参数semid:semget函数的返回值sops:同时对几个信号量进行操作,就传几个指针nsops:同时对几个信号量进行操作,就为几
返回值成功返回0;失败返回-1
struct sembuf {unsigned short sem_num;  /* semaphore number 对你申请的多个信号量中的某一个进行操作*/short          sem_op;   /* semaphore operation 一般有2个值,1表示对信号量++;-1表示对信号量--*/short          sem_flg;  /* operation flags */
}

semctl()函数 释放/查看信号量

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
功能:用于控制信号量所在的共享内存
原型int semctl(int semid, int semnum, int cmd, ...);
参数semid:semget函数的返回值semnum:对某块信号量进行操作cmd:将要采取的动作IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值IPC_ET:在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值IPC_INFO:SEM_INFO:IPC_RMID:删除共享内存段
返回值成功返回对应的值;失败返回-1
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 */};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 */};

systemV-共享内存/消息队列/信号量这三个IPC方式,接口相似度非常高,申请都是shmget/msgget/semget,控制都是shmctl/msgctl/semctl,收发消息共享内存直接拷贝,消息队列有个msgsnd/msgrcv,信号量是pv操作semop。数据结构均是struct shmid_ds{ struct ipc_perm shm_perm; }/struct msgid_ds{ struct ipc_perm msg_perm; }/struct semid_ds{ struct ipc_perm sem_perm; },都是使用key来标识资源的唯一性。

故OS通过struct ipc_perm* perms[];`这个指针数组来维护,创建共享内存/消息队列/信号量后,把结构体struct …_ds{}中的第一个成员依次填到这个指针数组,又因为在数字上结构体的第一个成员地址和结构体对象本身的地址是一样的,只不过类型不一样。==>使用perms数组指向了不同类型的对象,也管理好了不同资源!拿出数组中的数据只要强制类型转换,就能访问其他属性。

IPC资源的组织方式,

信号量PV操作以及函数接口讲解相关推荐

  1. 多线程信号量PV操作初探

    直接上源码吧: 在主线程中创建一个信号量mutex(注意参数,当前值和最大值都设为1),开启总计PRODUCER_COUNT份producer线程,不停地对该信号量mutex进行PV操作:再开启COM ...

  2. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系

    文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...

  3. linux pv 信号量,pv操作与信号量(示例代码)

    在python同步编程部分,需要分析和思考多个线程之间同步互斥问题,因此pv操作和信号量作为基础和重中之重,特此回顾pv操作和信号量. PV操作由P操作原语和V操作原语组成(原语即不可在分割的操作), ...

  4. java信号量生产者_java信号量PV操作 解决生产者-消费者问题

    package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...

  5. linux pv 信号量,Linux信号量PV操作

    1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作. 2://利用信号量实现pv操作 3:#include 4:#include 5:#include ...

  6. Operating System-进程/线程内部通信-信号量和PV操作

    本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...

  7. 秒杀多线程第十二篇 多线程同步内功心法——PV操作上

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

  8. 【软考】PV操作同步互斥

    进程 在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源),一个进程能有多个线程. 临界资源 指一次只能有一个进程在占用的资源.如 ...

  9. 【详细讲解】某书店有一个收银员该书店最多允许n个购书者进入。将收银员和购书者看作不同的进程,其工作流程如下图所示。利用PV操作实现该过程,设置信号量S1,S2和Sn,初值分别为0,0,n.则图中a1

    某书店有一个收银员该书店最多允许n个购书者进入.将收银员和购书者看作不同的进程,其工作流程如下图所示.利用PV操作实现该过程,设置信号量S1,S2和Sn,初值分别为0,0,n.则图中a1和a2应填入( ...

最新文章

  1. taro 打包微信小程序运行失败(一)
  2. cd 地址 linux,Ubuntu10.10 CD/DVD下?地址+校??
  3. [Jobdu] 题目1337:寻找最长合法括号序列
  4. Linux: chmod 和 chown用法小结
  5. 带你探索CPU调度的奥秘
  6. 剑指offer之消息中间件ActiveMQ知识总结
  7. redis发布与订阅
  8. 【Matlab学习笔记】【函数学习】eps
  9. oracle 表复制 long,关于oracle的数据库的数据Long和Number的转化字段
  10. python selenium +firefox 扩展插件闪现并消失,没有运行
  11. 菜谱网 java 源码_基于JSP的美食网站食谱网站、javaweb源码
  12. 周易全文&白話翻譯(上)
  13. 云更新无盘计算机配置,云更新网吧管理系统
  14. iphone用计算机显示器,如何将iPhone屏幕投射到电脑上
  15. 美国旧金山共享单车数据分析
  16. MPU6050数据分析
  17. c语言大一期中考试知识点,大一期末考试复习计划
  18. FPGA实现贪吃蛇小游戏
  19. 新浪微博开发平台接入流程(1)---注册应用
  20. qpython3打开app_QPython3

热门文章

  1. Django数据库常用字段及参数
  2. While循环、Range函数、For循环
  3. IPAD 游戏开发方案,windows开发
  4. 黑马程序员——java基础--面向对象(篇一)
  5. 魔兽助手1.2--新增鼠标自动点击功能(抢英雄必备)
  6. centos7 搭建tinyproxy代理服务器
  7. 截取数组的方法slice()/splice()
  8. vb.net 软件7层设计的含义
  9. 计算机组成原理(6)总线 带宽 波特率 总线仲裁
  10. 第五人格服务器6月维护,第五人格6月14日更新维护公告 更新内容汇总