Linux共享内存

这篇具有很好参考价值的文章主要介绍了Linux共享内存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

linux 共享内存,Linux,linux,服务器,运维

博客内容:共享内存



一、认识共享内存结构

共享内存

共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。由于多个CPU需要快速访问存储器,这样就要对存储器进行缓存(Cache)。任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则不同的处理器可能用到不同的数据。共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。

linux 共享内存,Linux,linux,服务器,运维
解释比较官方,对于进程来说就是PCB,内存描述符(mm_struct)、页表,还有内存之间的关系。简单的描述后就是以下这样的方式。对于内存描述符类似于文件描述符。共享内存是为了让不同的进程实现通信,就必须先让不同的进程来看见同一份资源
linux 共享内存,Linux,linux,服务器,运维

二、如何创建共享内存?

1.创建共享内存

使用共享内存需要知道这些接口,创建函数接口

  #include <sys/ipc.h>
  #include <sys/shm.h>
  int shmget(key_t key, size_t size, int shmflg);

共享内存是哪块,有多大,权限设置。第一个参数就是对于内存位置来表示内存的key。ftok函数就是采用路径和项目名来生成一个不易于冲突的一个key值。

 #include <sys/types.h>
  #include <sys/ipc.h>

  key_t ftok(const char *pathname, int proj_id);

第二个参数就是设置大小。对于后面第3个参数shmflg就是设置权限,权限和文件操作的权限采用的都是位图的数据结构来表示。

2.关联进程,取消进程

共享内存的创建完成后还需要让进程看见,需要将进程与内存关联在一起,摩天大厦也需要和自己挂钩才是自己的。所以就有函数shmat、shmdt。


       void *shmat(int shmid, const void *shmaddr, int shmflg);

       int shmdt(const void *shmaddr);

分别实现对于进程的关联和去关联。关联同一块内需要同样的key才能看见同一块内存。shmat第二个参数一般设置为null,函数会自己找到合适的地址。函数使用时与C语言的malloc类似都需要进行内存的一个转换,shmdt去关联时函数需要传入的是空间地址。就是shmat的返回值。在shmat与shmat之间就是通信的内容。

3.释放共享内存

共享内存是一套类似于文件描述符的规则,它不会随着进程而销毁,它跟随的是OS。所以在使用完后还需要使用函数进行销毁内存空间。使用函数进行空间释放后对于需要传输的是shmid就是使用函数shmget后的返回值,第二个参数就是命令IPC_RMID ,第3个参数一般设置为null。

  int shmctl(int shmid, int cmd, struct shmid_ds *buf);

三、代码示例

创建一个共享内存,实现通信 “i am process A”

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>

#define SHM_SIZE 4096

int main()
{
    key_t key = ftok(".", 'a');
    int shmid = shmget(key, SHM_SIZE, IPC_CREAT | 0666);
    char *shmaddr = (char *) shmat(shmid, NULL, 0);

    pid_t pid = fork();
    if (pid < 0) {
        printf("Fork Error\n");
        return -1;
    } else if (pid == 0) {  // 子进程
        char *data = "i am process A";
        memcpy(shmaddr, data, strlen(data));
    } else {  // 父进程
        usleep(100000);  // 等待子进程写入数据
        printf("%s\n", shmaddr);
        shmdt(shmaddr);
        shmctl(shmid, IPC_RMID, NULL);
    }

    return 0;
}


总结

需要注意的就是函数的返回值需要进行判断。在通信时使用是字节流通信。相关查询命令文章来源地址https://www.toymoban.com/news/detail-702333.html

		ipcs -m//查询共享内存
		ipcs -q//消息队列
		ipcs -s         //查看信号量对象
       ipcrm -Q key :根据键值key,删除指定的消息对列

        ipcrm -q id     :根据ID,删除指定的消息对列

        ipcrm -M key :根据键值key,删除指定的共享内存

        ipcrm -m id     :根据ID,删除指定的共享内存

        ipcrm -S key :根据键值key,删除指定的信号量

        ipcrm -s id     :根据ID,删除指定的信号量

到了这里,关于Linux共享内存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux服务器配置指南:网络、用户管理、共享服务及DNS配置详解

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 设置虚拟机的网卡为仅主机模式,并要求服务器采用双网卡, ens33 IP地址设置为192.168. 5.x/24(其中x学号),

    2024年02月05日
    浏览(54)
  • 【Linux网络服务】Centos7搭建nfs文件共享服务器

    1.NFS介绍 2.环境准备 3.在A服务端机器安装nfs-utils和rpcbind包 4.启动rpcbind检查是否启动了rpcbind服务并监听111端口 5.配置NFS服务的配置文件,参数配置:vi /etc/exports 数据同步与数据异步的区别 数据同步:当系统从内存中向磁盘中持久化数据时,同步发送表示只有当内存中的数据

    2024年02月06日
    浏览(56)
  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(85)
  • Linux服务器增加虚拟交换内存

    使用dd命令创建名为swapfile 的swap交换文件(文件名和目录任意): dev/zero是Linux的一种特殊字符设备(输入设备),可以用来创建一个指定长度用于初始化的空文件,如临时交换文件,该设备无穷尽地提供0,可以提供任何你需要的数目。 bs=1024 :单位数据块(block)同时读入/输出

    2024年02月15日
    浏览(49)
  • linux服务器查看cpu和内存

    cat /proc/cpuinfo | grep \\\"physical id\\\" | sort | uniq | wc -l cat /proc/cpuinfo | grep \\\"cpu cores\\\" | uniq grep processor /proc/cpuinfo|wc -l cat /proc/cpuinfo |grep MHz|uniq less /proc/cpuinfo |grep model free -m free -h

    2024年02月05日
    浏览(69)
  • linux常用查看服务器内存的命令

    free 命令用来显示系统内存状态,包括系统物理内存、虚拟内存(swap 交换分区)、共享内存和系统缓存的使用情况,其输出和 top 命令的内存部分非常相似。   free 命令的基本格式如下: [root@localhost ~]# free [选项] 表 1 罗列出了此命令常用的选项及各自的含义。 表 1 free 命令

    2024年02月16日
    浏览(86)
  • Linux 查看服务器内存、CPU 命令

    1 查看物理CPU个数:         Procs(进程) 2 查看服务器CPU内核个数 1 linux查看系统内存(硬盘) 2 查看服务器硬盘(当前文件夹下)使用率: 3 查看服务器硬盘(所有文件占用率)使用率: 1 查看内存,不带单位 2 查看内存使用情况,带单位,显示查看结果 显示的参数:       

    2024年02月15日
    浏览(63)
  • linux服务器监控之内存、cpu、网络、磁盘

    一、服务器实时内存监控 1、Linux帮助命令 man:Linux下的函数手册命令,可以查看所有命令的使用方法 ls:  ls -al: ll: 2、实时监控命令 top:   能够实时监控系统的运行状态,并且可以按照cpu及内存等进行排序。            语法:top -hv|-bcHiOSs -d secs -n max -u|U user -p pid(s) -o file

    2024年02月09日
    浏览(63)
  • Linux下设置Tomcat服务器的内存大小

    Tomcat 是一个开源的 Java Servlet 容器,用于实现 Java Servlet 和 JavaServer Pages (JSP)。在 Linux 系统下,你可以通过调整 Tomcat 的内存大小来优化服务器的性能。本文将详细介绍如何在 Linux 系统下设置 Tomcat 服务器的内存大小。 打开 Tomcat 的配置文件 Tomcat 的配置文件通常位于 Tomcat 安

    2024年02月05日
    浏览(47)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包