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

刷粉网站推广免费编程软件下载

刷粉网站推广,免费编程软件下载,wordpress注册文件,微商做网站网站共享内存 共享内存是一种进程间通信#xff08;IPC#xff09;机制#xff0c;它允许多个进程访问同一块内存区域。这种方法可以提高效率#xff0c;因为数据不需要在进程之间复制#xff0c;而是可以直接在共享的内存空间中读写。 使用共享内存的步骤通常包括#xff1a… 共享内存 共享内存是一种进程间通信IPC机制它允许多个进程访问同一块内存区域。这种方法可以提高效率因为数据不需要在进程之间复制而是可以直接在共享的内存空间中读写。 使用共享内存的步骤通常包括 创建共享内存一个进程shmget()创建共享内存区域。映射共享内存其他进程将该共享内存映射到自己的地址空间中的共享区中。读写数据进程可以在共享内存中读写数据进行通信。解除映射和删除使用完后进程解除映射并清理共享内存。 shmget()创建共享内存 获取标识符 int shmget(key_t key, size_t size, int shmflg);#include sys/shm.h 参数 key: 一个唯一的标识符用于区分不同的共享内存段。可以使用 ftok 函数生成。size: 请求的共享内存段的大小以字节为单位。shmflg: 位图 控制标志用于指定权限和其他选项。常见的选项包括 IPC_CREAT: 如果共享内存段不存在则创建它。如果存在就获取它IPC_EXCL| IPC_CREAT :一起使用表示如果共享内存段不存在就创建它反之存在则返回错误。返回成功一定是创建新的共享内存权限标志例如 0666 表示可读可写。 返回值 成功时返回共享内存标识符非负整数。(相当于FILE*)失败时返回 -1并设置 errno 以指示错误类型。 key作为标识符但不能由系统创建分配给进程而是由用户自己创建并给进程但要确保key是唯一的。 我们知道key是不同进程找到同一个内存空间的关键要确保它们的key是一样的。如果是系统分配feyA进程先创建了共享内存获得一个kegB进程如果想访问A创建的共享内存就要获取到key但A B进程相互独立不可能从A进程中获取到key。 但如果是用户给可以让用户先生成唯一的key再把key作为全局变量写在AB进程的源代码中这样AB进程就可以通过同一个key访问到同一个共享内存了。 如何生成唯一的key? ftok() key_t ftok(const char *pathname, int proj_id); key_t key ftok(/path/to/file, R); // R 是一个项目标识符ftok()函数是一个用于生成唯一键值的系统调用,它接受一个文件路径和一个项目标识符也可以是数字通常是一个字符并返回一个唯一的key。这个方法基于文件的 inode 号因此只要文件存在且未被删除返回的key就会是唯一的。 ipcs -m命令 显示所有的共享内存信息 ipcs -m 用于显示系统中当前存在的共享内存段的信息。 ipcs -m key shmid owner perms bytes nattch status 0x12345678 12345 user 666 1024 2 这条命令会列出所有的共享内存段包括它们的 shmid、键值、大小和其他信息。 bytes 1024 操作系统申请空间是按块为单位4kb...来申请空间的4096*x。假设该操作系统块的大小为4kb如果你申请4097字节还是会申请8kb空间但只让你用4097字节的空间越界就报错。 ipcrm -m命令删除共享内存段 ipcrm -m shmidshmctl() 控制共享内存 IPC_RMID删除 int shmctl(int shmid, int cmd, struct shmid_ds *buf);参数 shmid共享内存段的标识符通常是通过 shmget 函数获取的。cmd命令用于指定要执行的操作可以是以下常用值之一 IPC_STAT将共享内存段的信息填充到 buf 指向的结构中。IPC_RMID标记共享内存段以便删除。SHM_LOCK锁定共享内存段。SHM_UNLOCK解锁共享内存段。SHM_INFO获取共享内存的统计信息POSIX扩展。buf指向 shmid_ds 结构的指针用于存储共享内存的元数据。成功时返回 0。失败时返回 -1并设置 errno 以指示错误原因。 shmat() 将共享内存挂接到自己的地址空间中 void* shmat(int shmid, const void* shmaddr, int shmflg);参数说明 shmid: 共享内存段的标识符通常通过 shmget() 获取。shmaddr: 指定共享内存挂接到虚拟地址空间的起始地址。如果为 NULL系统会选择一个合适的地址。shmflg: 标志位: 0默认附加模式进程可以读写共享内存。 SHM_RDONLY: 只读模式进程只能读取数据不能写入。 返回值 成功时返回指向共享内存挂接到虚拟地址空间的起始地址。失败时返回 (void*) -1并设置 errno 指示错误类型。 注意共享内存也是有权限的进程如果没有对应的权限是不能完成挂接的。 shmid shmget(IPC_PRIVATE, size, IPC_CREAT | 0666); // 创建共享内存权限为可读可写在shmget创建共享内存时我们就可以设置权限0666:所有用户都可以读写。 如果不设置权限默认权限是0600:创建者可读写 其他人无权限 shmdt()取消挂载 int shmdt(const void *shmaddr);const void *shmaddr挂载到进程的虚拟地址空间的起始地址  shmdt()于从进程的地址空间分离已经附加的共享内存段。它不会删除共享内存段本身。 shmctl(IPC_RMID) :用于标记共享内存段为删除等待所有附加的进程分离后释放资源。 共享内存通信速度最快 1.直接访问共享内存允许多个进程直接访问同一块内存区域避免了数据复制的开销。这与其他通信方式如管道、消息队列等不同后者通常需要在进程之间复制数据 管道数据从外设读取到进程A的内核空间然后通过系统调用将数据写入管道。B通过系统调用从管道中读取数据再将其拷贝到自己的内存中。 这种方式总共涉及四次拷贝一次从外设到进程A的内核空间一次从内核空间写入管道一次从管道读取到进程B的内核空间最后一次从内核空间到进程B的内存。 共享内存 数据从外设读取到内核空间后进程A和进程B可以直接访问共享的内存区域避免了多次拷贝。 因此总的拷贝次数减少为两次一次从外设读取到内核空间另一次是进程B直接从共享内存读取数据。 2.低延迟由于不涉及操作系统内核的上下文切换共享内存通信的延迟较低特别适合需要高频率、低延迟的数据交换的场景。 3.高吞吐量共享内存能够支持大量数据的快速传输适合处理大规模数据或高并发的情况。 4.减少系统调用其他通信机制往往需要进行系统调用而共享内存可以减少这种需求从而提升性能。 消息队列 os提供一个队列A B进程都可以看到这个队列把结构体struct data作为结点放入队列再让另一个进程拿该节点实现通信。 怎么知道这个节点是其他进程放的呢 用户要自己创建struct data里面有int type标识符定义A进程标识符1 B为2这样就可以区分拿与自己标识符不同的节点。 msgget() msgctl()  这两个函数用法和shmget() shmctl() 差不多 int msgget(key_t key, int msgflg);参数说明 key: 消息队列的键值可以通过 ftok() 函数生成。msgflg: 控制消息队列的行为通常使用以下标志 IPC_CREAT: 如果消息队列不存在则创建一个。IPC_EXCL: 如果消息队列已经存在调用失败。权限位如 0666控制访问权限。 返回值 成功时返回消息队列的标识符非负整数。失败时返回 -1。 int msgctl(int msqid, int cmd, struct msqid_ds *buf);参数说明 msqid: 消息队列的标识符。cmd: 控制命令可以是以下之一 IPC_STAT: 获取消息队列的状态信息。IPC_SET: 设置消息队列的属性。IPC_RMID: 删除消息队列。buf: 指向 msqid_ds 结构的指针用于存放或设置属性。 返回值 成功时返回 0。失败时返回 -1。 ipcs -q  ipcrm -m ipcs -q 用于显示当前系统中所有的消息队列的信息。 ------ Message Queues -------- key msqid owner perms used-bytes 0x12345678 12345 user1 666 0 0x87654321 12346 user2 666 0ipcrm -m删除共享内存段 ipcrm -m shmidmsgsnd() msgrcv() 特有 msgsnd() msgrcv()是消息队列特有的函数 msgsnd() 发送消息 int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);参数说明 msqid: 消息队列的标识符。msgp: 指向要发送的消息节点的指针消息的结构体struct msgbuf要以标识符long mtype开头 msgsz: 消息内容的字节数不包括 mtype。msgflg: 自己的标识符常用值包括 IPC_NOWAIT如果队列已满则不等待直接返回错误。0: 默认行为发送或接收消息时会阻塞直到操作成功。 返回值 成功时返回 0。失败时返回 -1。 msgrcv() 接收消息 int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);参数说明 msqid: 消息队列的标识符。msgp: 指向接收消息的缓冲区的指针。指向struct datamsgsz: 消息内容的最大字节数不包括 mtype。msgtyp: 指定接收消息的标识符mtype可以是特定类型的消息如 1也可以是 0接收任何类型的消息或 -1接收队列中最早的消息。msgflg: 控制接收行为的标志常用值包括 IPC_NOWAIT如果队列为空则不等待直接返回错误。 返回值 成功时返回接收到的消息字节数。失败时返回 -1。 信号量 信号量是一种用于进程间同步和互斥的机制主要用于控制多个进程对共享资源的访问。它通过维护一个整型计数器来实现计数器的值表示可用资源的数量或状态。 我们之前学过管道我们把管道的资源看作一个整体要写整个资源所有地方都可以写要读都可以读。 现在我们把整个资源分成多份一个进程访问一份。整个资源有部分可能在写入还有部分可能在读不同进程访问共享资源有一定并发性。 1.但是我们怎么知道整个资源里面还有多少份没有进程占用 我们可以用一个计算器count来记录里面剩余个数count16 每进入一个进程count--这种操作称作P操作出去countV操作。 P操作等待 当线程或进程希望访问某个共享资源时它会执行P操作。这个操作的作用是检查信号量的值 如果信号量的值大于0表示资源可用线程可以继续执行并且信号量的值减1。如果信号量的值为0表示资源不可用线程会被阻塞直到信号量的值变为正。 V操作释放 当线程或进程完成对共享资源的使用后会执行V操作。这个操作的作用是将信号量的值增加1表示资源现在可用。如果有其他线程在等待这个资源执行V操作后会唤醒其中一个等待的线程。 2.现在有出现一个问题怎么让不同进程看到同一个count呢 可以用共享内存 管道 让进程与进程间建立联系就可以 3.但这样又有一个新问题count这种操作并不是原子性的多个线程同时修改同一数据引发数据竞争。 使用二进制信号量或互斥锁可以确保在任何时刻只有一个线程或进程能够访问临界区共享资源。当一个线程进入临界区时它会调用 P 操作等待如果信号量值为 0其他线程会被阻塞直到该线程调用 V 操作释放将信号量值加 1。 信号量可以分为两种类型 1.二进制信号量。count1 2.计数信号量。count1 1.semget() 可以创建nsems个信号量一个信号量管理count个资源。 int semget(key_t key, int nsems, int semflg);key: 唯一标识符。nsems: 信号量的数量。semflg: 权限标志如 IPC_CREAT、0666。 2.semctl() 控制信号量集的操作如获取、设置信号量值或删除信号量。 int semctl(int semid, int semnum, int cmd, ...);semid: 信号量集标识符。semnum: 信号量在集合中的索引。cmd: 操作命令如 SETVAL、GETVAL、IPC_RMID 等。 semnum:信号量集合允许我们同时管理多个信号量semnum 就是用来指定我们想要操作的具体信号量。在一个信号量集合中每个信号量都有一个唯一的索引从 0 开始编号。例如如果一个信号量集合中有三个信号量索引将是 0、1 和 2。 3.semop() 执行对信号量的操作如 Pwait和 Vsignal。 int semop(int semid, struct sembuf *sops, size_t nsops);struct sembuf {unsigned short sem_num; // 信号量在集合中的索引short sem_op; // 要执行的操作正数表示 V 操作负数表示 P 操作short sem_flg; // 操作标志如 IPC_NOWAIT };semid: 信号量集标识符。sops: 指向 sembuf 结构数组的指针定义了要执行的操作。nsops: 数组中操作的数量。对nsops个信号量进行PV操作 ipcs -s  显示当前系统中所有的信号量信息包括信号量的标识符、拥有者、权限和其他相关信息。 ------ Semaphore Arrays -------- KEY ID OWNER PERMS NSEMS 0x12345678 12345 user 666 1System V怎么实现IPC的 1.应用角度看IPC属性 struct shmid_ds里面是共享内存的属性第一个成员变量就是struct ipc_prem结构体。而消息队列 信号量同样也是以struct ipc_prem结构体开头struct ipc_prem结构体里面就保存着key值。也就是说不同 IPC 机制可以通过相同的方式来管理和控制访问权限不同的IPC机制都有自己的一套key值所以共享内存 消息队列 信号量的key可能重复但在一种IPC机制中key是唯一的。 2.从内核角度看IPC结构 有全局的结构体ipc_ids里面有struct ipc_id_ary* entries指向结构体ipc_id_ary。 结构体ipc_id_ary最后一个成员变量是柔性数组也就是说它可以动态保存kern_ipc_perm指针。kern_ipc_perm结构体里面保存的是IPC不同机制共同的属性。 为什么说kern_ipc_perm结构体里面保存的是IPC不同机制共同的属性 因为在不同PC机制的属性中第一个成员变量就是kern_ipc_perm结构体其他成员变量都是根据不同IPC的实现机制特别增加的。 为什么不同IPC机制的属性中第一个成员变量一定是kern_ipc_perm结构体 因为结构体ipc_id_ary中柔性数组保存的是kern_ipc_perm指针如果共享内存 消息队列 信号量它们属性第一个成员变量是kern_ipc_perm那么就可以指向他们的结构体属性。 这样ipc_id_ary数组就可以找到每个创建的共享内存 消息队列 信号量的属性进而进行管理。 其实我们shmget() msgget() semget()获取的id就是它们在ipc_id_ary数组的下标。 和key值一样id在一种IPC机制中是唯一的但在不同IPC机制中可能相同。 也就是说一个ipc_id_ary数组中指向的全是相同IPC机制的属性。 其实共享内存是一种文件 在共享内存的属性中有struct file*的指针它指向一个文件文件有inode知道它的数据块的物理地址。vm_start vm_end是共享内存在虚拟地址空间的起始地址 结束地址把它与指向文件的内存块的物理地址建立映射关系进程可以通过这个映射直接访问文件内容。
http://www.hkea.cn/news/14446637/

相关文章:

  • 济南网站制作公司排名国外域名 网站备案
  • 工信部网站 备案时间成都自适应网站建设
  • 如何做vip电影解析网站网站建设哪种好
  • 如何创建一个站点wordpress 评论栏
  • 简洁企业网站源码手机版网站如何建设
  • sns网站开发企信查
  • seo网站推广是什么网站怎么优化到首页
  • 吐鲁番网站建设建筑学院官网
  • 北京康迪建设监理咨询有限公司网站6江门网站推广深圳公司
  • 重庆璧山网站制作公司推荐做p2p网站费用
  • 树莓派上怎么做网站视频制作软件排行榜
  • c2c网站设计茅台酒国内营销网络
  • 可以做相册的网站海南网站建设获客
  • 如何搭建自己的网站服务器地址河南网站制作公司
  • 网站开发外包一个建设电商网站多少钱
  • 手机网站设计制作公司网址链接查询
  • dedecms 模版网站推广渠道有哪些
  • 腾讯云网站搭建教程做网站需要看的书
  • 增长超人做网站多少钱保健品网站建设案例
  • 建筑八大员报名网站网渠道
  • 建设银行信用卡进度查询官方网站网站开发 js
  • 网站建设中建设通app免费版
  • 网络公司做机场网站seo免费推广
  • 网站建设 千助简洁物流网站模板免费下载
  • 哪个网站有做烘焙蛋糕专业的配方做什么网站赚钱
  • 建设电影网站论文三亚政策最新消息
  • 中卫企业管理培训网站wordpress 自动升级
  • 长春建设网站公司设计网页代码源代码
  • 做公司网站要走哪些流程网站建设 目的
  • 城建设投资公司网站网站广告制作