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

出台网站集约化建设通知培训中心网站建设方案

出台网站集约化建设通知,培训中心网站建设方案,网络营销策划书结构,关于电子商务网站建设与管理的论文文章目录 引言什么是共享内存System V 共享内存 API 引入1. shmget2. shmat3. shmdt4. shmctl5. 结构体 shmid_ds 开始实操注意 结束 今天的你有没有前进一小步呢 ——家驹(StrangeHead) 引言 那么共享内存,我们如何去使用他呢,先来听笔者啰嗦一段话吧…

文章目录

  • 引言
  • 什么是共享内存
    • System V 共享内存 API 引入
      • 1. `shmget`
      • 2. `shmat`
      • 3. `shmdt`
      • 4. `shmctl`
      • 5. 结构体 `shmid_ds`
    • 开始实操
    • 注意
  • 结束

今天的你有没有前进一小步呢

——家驹(StrangeHead)

引言

那么共享内存,我们如何去使用他呢,先来听笔者啰嗦一段话吧!有个整体的概念。

共享内存,听这个名字就像已经知道他是什么东东了,既然我们现在学习的的Linux进程之间的通讯,所以这个共享内存肯定也离不开通讯的功能,是的,他是IPC中的重要一员,成为高手,也是必须要掌握的。

对于共享内存,Linux中共享内存的两种主要实现方式:System V和POSIX。没错又是两套API,关于这两套API,笔者就教大家如何使用System V吧,因为POSIX感觉并不常用,读者朋友们有兴趣可以自己学一学。

那么进入正题。

什么是共享内存

他总体的作用就是,在Linux当中开辟一段内存空间,使得两个进程可以同时访问,是的就是这么简单

具体操作可以具象为操作一个文件(毕竟Linux中一切皆是文件呢)

open一个文件(没有就创建他)
我可以使用read读取他,也可以使用write去修改他。
当然这个文件,也可以让所有进程看到,并操作。
这样说,我们理所当然的就学会了共享内存,我们对于一个文件的操作,其实就是对共享内存进行操作!

那么他有什么API呢,总不能和文件的open等等的API冲突吧,肯定也有自己的优势,方便之处吧,来看一下吧。

特性共享内存文件操作
速度直接在内存中操作,速度快涉及磁盘 I/O,速度较慢
内存共享多个进程可以直接共享数据每个进程通常创建自己的文件副本
资源利用内存使用更加高效,避免冗余每个进程可能会重复打开和关闭文件
数据一致性直接访问最新数据,避免不一致性可能需要额外同步机制保证一致性
适用场景高频率、大量数据交换持久化存储、日志记录等
复杂性需要管理访问权限和同步机制操作相对简单,易于理解
系统调用数量包含 shmget, shmat, shmdt, shmctl包含 open, read, write, close
  • 共享内存 更适合需要快速、高效的数据交换的场景,尤其是涉及到大量数据的实时处理。
  • 文件操作 更适合需要持久化存储和简单文件操作的场景。

查看和删除共享内存(拓展)
你可以使用 ipcs -m 查看共享内存段,并通过 ipcrm 删除它

System V 共享内存 API 引入

总之就是下面这一坨了

int shmget(key_t key, size_t size, int shmflg);  // 创建/获取共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg); // 附加到进程空间
int shmdt(const void *shmaddr);  // 分离共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf); // 控制操作

我们依次介绍他。大致看看即可,通过实例学习,不了解可以回来继续复习。🎯


1. shmget

功能:创建一个新的共享内存段或者获取一个已经存在的共享内存段的标识符。

原型

int shmget(key_t key, size_t size, int shmflg);

参数

  • key:用于标识共享内存段的键。可以通过 ftok 函数生成一个唯一的键。
  • size:共享内存段的大小(以字节为单位)。如果要创建新的共享内存段,此值必须大于 0。
  • shmflg:控制标志,可以包括以下选项:
    • IPC_CREAT:如果指定的共享内存段不存在,则创建它。
    • IPC_EXCL:与 IPC_CREAT 一起使用,如果共享内存段已经存在,则调用失败。
    • 权限标志(如 0666)指定谁可以读/写共享内存段。

返回值:成功时返回共享内存段的标识符(非负整数),失败时返回 -1,并设置 errno

示例

int shm_id = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666);

2. shmat

功能:将共享内存段附加到调用进程的地址空间。

原型

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

参数

  • shm_id:通过 shmget 返回的共享内存段标识符。
  • shmaddr:希望共享内存段附加到的地址。通常可以设置为 NULL,由系统自动选择。
  • shmflg:控制标志,通常设置为 0。

返回值:成功时返回指向共享内存段的指针,失败时返回 (void*) -1,并设置 errno

示例

char* shm_ptr = (char*) shmat(shm_id, NULL, 0);

3. shmdt

功能:将共享内存段从调用进程的地址空间分离。

原型

int shmdt(const void* shmaddr);

参数

  • shmaddr:指向之前通过 shmat 返回的共享内存指针。

返回值:成功时返回 0,失败时返回 -1,并设置 errno

示例

if (shmdt(shm_ptr) == -1) {perror("shmdt failed");
}

4. shmctl

功能:控制共享内存段的操作,包括查询、修改和删除。

原型

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

参数

  • shm_id:共享内存段的标识符。
  • cmd:控制命令,可以是以下之一:
    • IPC_STAT:填充 shmid_ds 结构体(用于获取共享内存信息)。
    • IPC_RMID:标记共享内存段为待删除。
    • IPC_SET:修改共享内存段的权限和其他信息(需要提供相应的 shmid_ds 结构体)。
    • IPC_INFO:获取系统共享内存的信息(通常是系统级的)。
  • buf:指向 shmid_ds 结构体的指针,用于输入/输出的控制信息。

返回值:成功时返回 0,失败时返回 -1,并设置 errno

示例(删除共享内存段):

if (shmctl(shm_id, IPC_RMID, NULL) == -1) {perror("shmctl IPC_RMID failed");
}

5. 结构体 shmid_ds

用于描述共享内存段的状态,包括以下字段:

struct shmid_ds {struct ipc_perm shm_perm; // 共享内存的权限size_t shm_segsz;         // 共享内存段的大小time_t shm_atime;         // 最后附加时间time_t shm_dtime;         // 最后分离时间time_t shm_ctime;         // 最后控制时间unsigned short shm_cpid;  // 创建该共享内存段的进程 IDunsigned short shm_lpid;  // 最后操作该共享内存段的进程 IDshort shm_nattch;         // 当前附加到该共享内存段的进程数
};

开始实操

通过上述 API,可以有效地创建和管理共享内存段,从而实现进程间的高效通信。在使用共享内存时,务必注意同步问题,以避免数据竞争和不一致性。对于更复杂的应用,可能需要结合其他 IPC 机制(如信号量)来实现更可靠的进程间通信。

我们先简单的利用API来实现两个程序,一个写入,一个读取。

写入进程:

#include <sys/ipc.h>
#include <sys/shm.h>#define SHM_SIZE 1024int main() {key_t key = ftok("shmfile", 65);int shmid = shmget(key, SHM_SIZE, 0666|IPC_CREAT);char *str = (char*) shmat(shmid, NULL, 0);sprintf(str, "Hello from PID %d", getpid());shmdt(str);return 0;
}

读取进程:

// ...(头文件同上)
int main() {key_t key = ftok("shmfile", 65);int shmid = shmget(key, SHM_SIZE, 0666);char *str = (char*) shmat(shmid, NULL, 0);printf("Received: %s\n", str);shmdt(str);shmctl(shmid, IPC_RMID, NULL); // 删除共享段return 0;
}

这里仅仅做了这样一个小实验,随着日后,技术的提升,不断迭代,希望读者可以灵活应用,这里没有加入其它IPC同步机制,实际使用,对于共享内存的访问是要做保护机制的!!!仅仅让读者快速掌握他如何使用。

监控与调试技巧 使用ipcs -m查看System V共享段

通过lsof /dev/shm检查POSIX对象

分析/proc/sysvipc/shm获取详细信息

使用strace跟踪shm相关系统调用

注意

同步机制(必须实现以下之一):

使用共享内存必须必须使用同步机制,避免同时访问或者操作,造成数据错乱或者死机

  • 信号量(semaphore)

  • 互斥锁(pthread_mutex,需配置进程共享属性)

  • 文件锁(fcntl)

生命周期管理:

  • System V:需主动调用shmctl(IPC_RMID)

  • POSIX:引用计数归零后自动删除

安全配置:

  • 严格设置权限位(如0600)

  • 避免使用可预测的IPC键值

  • 及时清理未使用的共享段

性能调优:

  • 使用大页内存(Hugepages)

  • 对齐内存访问边界

  • 避免频繁attach/detach操作

结束

浅浅的总结一下吧,这节我们学到了System V共享内存,以及他的一些核心API的使用,知道了他是什么东西。虽然操作文件的大致流程上没有俩样。但是使用上还是更具实际情况选择哦,并且给了两段小程序来帮助理解,再次提醒,实际情况,要做同步机制保护。
好了,本文就到这里了,让我们每天进步一小步吧!


文章转载自:

http://hItnbIjt.mrnnb.cn
http://JjeD1idW.mrnnb.cn
http://K90Q8Lvz.mrnnb.cn
http://bTQZ6vN8.mrnnb.cn
http://QFSKVrE8.mrnnb.cn
http://uqiaJdiZ.mrnnb.cn
http://ZvTlwUut.mrnnb.cn
http://rrbpAjjw.mrnnb.cn
http://LGDSjDoa.mrnnb.cn
http://6z4WIxKz.mrnnb.cn
http://XWGWqmMn.mrnnb.cn
http://7XhQhhGX.mrnnb.cn
http://LYegKkTU.mrnnb.cn
http://my4htXOz.mrnnb.cn
http://eEA9NYFX.mrnnb.cn
http://xlaJ086x.mrnnb.cn
http://kCm98bRO.mrnnb.cn
http://Ydo5tgag.mrnnb.cn
http://ZIqMVU8V.mrnnb.cn
http://C9DqM2uE.mrnnb.cn
http://UQGlRZ4D.mrnnb.cn
http://JmfIjh9g.mrnnb.cn
http://FU9OTb5n.mrnnb.cn
http://FImAN7gw.mrnnb.cn
http://kAbvHwZr.mrnnb.cn
http://nGKUjsXI.mrnnb.cn
http://Z1TPvMWS.mrnnb.cn
http://UBCsfQu2.mrnnb.cn
http://EpKex9aa.mrnnb.cn
http://vwYMNF3J.mrnnb.cn
http://www.dtcms.com/wzjs/722941.html

相关文章:

  • 做企业网站项目的心得论坛网站建设需要多少钱
  • 绿色学校网站模板百度热搜的含义
  • 网站项目建设的必要性怎么做移动端网站
  • 找网站开发合作伙伴wordpress 网站打不开
  • 北京孤儿院做义工网站网站托管服务
  • 网站设计服务企业网站域名归属权
  • 安徽网站设计与优化网站建设的完整流程
  • 百度网站推广费用多少深圳网站做优化哪家公司好
  • 潍坊哪家做网站做的最好台州椒江区热销企业网站搭建
  • 建站之星做网站wordpress本地批量传文章
  • 网站开发与管理对应的职业及岗位南京专业建站
  • 网站跟软件有什么区别是什么网站开发设计资料
  • 开发软件的成本预算网站seo优化服务
  • 门户网站开发要求正规网站制作公司有哪些
  • 给网站划分栏目dede网站地图模板
  • 意大利语网站建设公司有网站有什么好处
  • 大型网站建设公司排名小程序定制外包
  • 桂林网站优化注意事项建筑清单网
  • 随县网站建设怎么做二维码进入公司网站
  • 如此查询网站名字是否注册wordpress有什么有趣的插件
  • 怎么样给网站的服务器续费外贸上哪个网站开发客户
  • 可以做分析图的地图网站在线做试卷的网站
  • 2015做啥网站能致富商洛网站建设
  • 社区论坛自助建站网wordpress get the time
  • 什么是网站链接优化免费招聘网站平台
  • 网站建设与制作教程建筑工程造价信息网
  • 网站微信建设运维经验分享图自媒体可做外链网站
  • 网站对比网站的二维码怎么做的
  • 东兴网站建设重庆建设招标网站
  • 网站建设的竞争力做网站到底需要什么