linux学习笔记-进程间通信(共享内存)和信号量的引入

进程间通信的重点 – 要让不同的进程看到同一块内存


一. system V共享内存的接口
    // 1. 创建公共的Key值
    key_t k = ftok(PATH_NAME, PROJ_ID);
    // 2. 创建共享内存 -- 建议要创建一个全新的共享内存 
    int shmid = shmget(k, SHM_SIZE, IPC_CREAT | IPC_EXCL | 0666); // 0666是操作权限-perms
    // 3. 将指定的共享内存,挂接到自己的地址空间
    char *shmaddr = (char *)shmat(shmid, nullptr, 0);  // 类似于malloc
    // 4. 将指定的共享内存,从自己的地址空间中,去关联
    int n = shmdt(shmaddr);  
    // last. 删除共享内存,IPC_RMID非常强势,即使是有简称和当前的shm挂接,依旧删除共享内存
    n = shmctl(shmid, IPC_RMID, nullptr);
二. 结论
  1. 申请到的共享内存在堆栈间,属于用户空间,则不经过系统调用,也可以直接访问(与之相对的管道经过文件通信,文件是内核的一种数据结构,需要经过系统接口访问)
  2. 则共享内存减少了很多拷贝,加快了访问速度,却缺乏访问控制!(server一直在读–与管道通信不同) 二者甚至都不知道对方的存在。

信号量的引入

一. 相关概念
  1. 把多个进程(执行流)看到的公共的一份资源看做 临界资源
  2. 把自己的代码访问临界资源的代码称为 临界区
  3. 为了更好的进行对临界区的保护,可以让多执行流在任何时刻,只能有一个进程进入临界区 – 互斥
  4. 要么不做,要么做,没有中间状态,就是 原子的
二. 信号量(电影票类比)
  • 买票:对座位的预定机制
    座位:临界资源
    预定:申请信号量
  • 不准确的认为 – 信号量为计数器 int count = n;
    1. 申请信号量成功count --;,临界资源内部,预留了想要的资源(P操作)
    2. 访问临界资源 – 执行自己的临界区代码
    3. 释放信号量count ++;(V操作)
  • 因为在CPU执行时,count --;至少有三步,而进程会随时被切换出去。则即使是定义了所有进程都看得到的内核级的全局count,也无法保证对 count加减操作的不受外界干扰。此方法不行,我们要保证P,V操作的原子性。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值