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

用iis浏览网站合肥做网站好的公司

用iis浏览网站,合肥做网站好的公司,网络系统架构师,万网商标在Linux中,共享内存是一种允许不同进程之间直接交换数据的高效机制。它是IPC(Inter-Process Communication,进程间通信)的一种方式,允许多个进程通过映射同一块物理内存区域来实现数据共享,而无需使用内核来…

在Linux中,共享内存是一种允许不同进程之间直接交换数据的高效机制。它是IPC(Inter-Process Communication,进程间通信)的一种方式,允许多个进程通过映射同一块物理内存区域来实现数据共享,而无需使用内核来中转数据,从而大大提高了效率。

本文将介绍Linux共享内存的基本概念、使用方法以及在实际开发中的应用。


1. 什么是共享内存

共享内存允许不同进程访问同一块物理内存。多个进程可以将这块共享内存映射到各自的地址空间,进而可以高效地交换数据。这种方式比通过管道、消息队列或套接字传递数据要高效,因为数据直接存在共享内存中,避免了内核的中间转发。

2. 共享内存的特点

  • 高效性:共享内存不经过内核转发,因此进程间通信速度极快,特别适合大规模数据交换。
  • 易于管理:共享内存通过标准的内存管理方法进行访问和控制,使用起来比较直观。
  • 同步问题:由于多个进程可以同时访问同一块内存,可能会出现竞争条件。因此,必须通过某种同步机制(如信号量)来保证数据的一致性。

3. Linux中共享内存的实现

在Linux中,共享内存通常通过shmgetshmatshmdt等系统调用来进行管理。使用这些调用可以创建、连接、分离和控制共享内存区。

创建共享内存段

首先,进程需要调用shmget来创建共享内存段。该函数的定义如下:

int shmget(key_t key, size_t size, int shmflg);
  • key: 一个标识共享内存段的键值,通常通过ftok函数生成。
  • size: 共享内存段的大小,单位为字节。
  • shmflg: 控制共享内存段创建的标志。常用的标志有:
    • IPC_CREAT: 如果共享内存段不存在,则创建一个新的共享内存段。
    • IPC_EXCL: 如果共享内存段已经存在,返回错误。
映射共享内存到进程地址空间

创建共享内存后,进程需要使用shmat来将共享内存映射到自己的地址空间:

void *shmat(int shmid, const void *shmaddr, int shmflg);
  • shmid: 通过shmget返回的共享内存段的标识符。
  • shmaddr: 可选,指定共享内存的映射地址,通常为NULL,由系统自动分配。
  • shmflg: 映射标志,常用值有SHM_RDONLY(只读)和0(读写)。

返回值是共享内存段的首地址,进程可以通过该地址进行数据读写。

分离共享内存

当进程不再需要访问共享内存时,可以调用shmdt将其从进程的地址空间中分离:

 
int shmdt(const void *shmaddr);

  • shmaddr: 共享内存段的首地址。
删除共享内存段

最后,如果共享内存段不再使用,可以调用shmctl删除它:

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

  • shmid: 共享内存段的标识符。
  • cmd: 操作类型,IPC_RMID表示删除共享内存段。
  • buf: 一个指向shmid_ds结构体的指针,通常传入NULL即可。

4. 共享内存的同步问题

共享内存本身并不提供同步机制,因此在多个进程同时访问共享内存时,必须显式地使用一些同步工具来避免数据竞争。

最常见的同步工具有:

  • 信号量(Semaphore):信号量用于控制多个进程对共享资源的访问。可以通过semgetsemop等系统调用来使用。
  • 互斥锁(Mutex):类似于信号量,但专门用于保证在任意时刻只有一个进程可以访问共享内存。

5. 共享内存的应用场景

  • 高速缓存:在多进程应用中,多个进程可能需要访问大量的共享数据。通过共享内存,可以避免数据的复制,从而提高系统性能。
  • 数据交换:在多个进程之间频繁交换大量数据时,共享内存能够提供比管道、消息队列更高的效率。
  • 分布式计算:多个计算进程可以通过共享内存交换计算结果,在高性能计算中尤为重要。

6. 示例代码:创建和使用共享内存

下面是一个简单的共享内存示例,演示了如何创建共享内存、写入数据、然后读取数据。

ShareMemory.hpp

#pragma once
#include <iostream>
#include <string>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>const std::string gpath = "/home/an/code";
const int gprojId = 0x6666;
//
const int gshmsize = 4096;
mode_t gmode = 0600;std::string ToHex(key_t key)
{char buff[gshmsize];snprintf(buff, sizeof(buff), "0x%x", key);return buff;
}class ShareMemory
{
private:void CreatMemoryHelper(int shmflg){// 1.创建key// ftok()_key = ::ftok(gpath.c_str(), gprojId);if (_key < 0){std::cerr << "ftok error" << std::endl;return;}// 2.int _shmid = ::shmget(_key, gshmsize, shmflg);if (_shmid < 0){std::cerr << "shm get error." << std::endl;return;}}public:ShareMemory(): _shmid(-1),_key(0),_addr(nullptr){}~ShareMemory(){}void CreatMemory(){CreatMemoryHelper(IPC_CREAT | IPC_EXCL | gmode);}void GetShm(){CreatMemoryHelper(IPC_CREAT);}void AttachShm(){_addr = shmat(_shmid, nullptr, 0); // 为什么会失败???if ((long long)_addr == -1){std::cout << "attach error" << std::endl;return;}return;}void DetachShm(){if (_addr != nullptr)::shmdt(_addr);std::cout << "detach done: " << std::endl;}void DeleteShm(){shmctl(_shmid, IPC_RMID, nullptr);}void *GetAddr(){return _addr;}void ShmMeta(){}private:int _shmid;key_t _key;void *_addr;};//临时
ShareMemory shm;

Server.cc

#include <iostream>
#include <unistd.h>
#include "ShareMemory.hpp"int main()
{shm.CreatMemory();shm.AttachShm();std::cout << "server attach done" << std::endl;sleep(10);shm.DetachShm();std::cout << "server detach done" << std::endl;sleep(10);shm.DeleteShm();std::cout << "server delete done" << std::endl;sleep(10);return 0;
}

Client.cc

#include <iostream>
#include "ShareMemory.hpp"int main()
{shm.GetShm();shm.AttachShm();//在这里进行IPCshm.DetachShm();shm.DeleteShm();return 0;
}

7. 总结

Linux共享内存为进程间数据交换提供了一种高效、低延迟的方式。它通过直接映射内存区域来避免了数据的复制和内核的干预,是需要高性能通信的应用程序中不可或缺的技术。然而,共享内存也带来了同步和访问控制的挑战,开发者需要谨慎设计以保证数据一致性和安全性。

http://www.yayakq.cn/news/814072/

相关文章:

  • 网站建设什么一流的五屏网站建设
  • 外贸网站该怎么做广州网站公司推广建设
  • 美食网站建设的必要性了解营销型企业网站建设
  • 萍乡做网站的公司有哪些网页鉴赏
  • 太原制作网站郑州建设信息网是用来干什么的
  • 杭州模板建站软件南宁建站服务公司之
  • 万州哪里有做网站的郑州建站以来
  • 做网站的报价方案.net搭建企业网站
  • 网站开发技术参考文献wordpress个人博客安装
  • 山东兴华建设集团有限公司网站拼音福州网站开发fjfzwl
  • 做网站找浩森宇特wordpress如何导出
  • 做网站要用到哪些技术淘宝官网首页官网
  • 焦作会计做继续教育在哪个网站建筑工程网格化管理的目的和意义
  • 成都微信网站建设推广州seo网站策划
  • 科技设计网站建设石家庄营销型网站建设
  • 做旅游网站的意义软件下载大全免费安装
  • 佛山效果好上首页推广做网站优化推广的好处
  • vscode网站开发南通做外贸的公司网站
  • 制作一个网站大概要多少钱电商网站建设与运维需要的软件
  • 临沂网站模板网站搜索用户体验
  • 建设厅网站ca验证失败宝坻做网站哪家好
  • 张家界建设网站直播视频怎么录制
  • 移动端网站没有icp帝国视频网站模板
  • 首选大型网站建站公司医院网站建设联系方式
  • 家装行业网站建设天津网站建设推广服务
  • 朝阳公司做网站wordpress 国产插件
  • 备案成功后怎么做网站服装集团网站建设
  • 北京市建设工程安全质量监督总站网站wordpress留言板设置
  • 穷游 网站开发网站的后台管理员系统建设教程
  • 奇搜建设辽沈阳网站wordpress 用户角色插件