进程间通信—system V
前言:
之前所提的管道通信是基于文件的,OS没有做过多的设计工作。
system V 进程间通信:OS特地设计的通信方式。想尽一切办法让不同的进程看到同一份资源(由OS提供)。
system V通信方式为:共享内存、消息队列、信号量。
共享内存、消息队列是以传送数据为目的;信号量是为了保证进程同步与互斥而设计的,属于通信范畴。
以下是 System V IPC 的三种主要组件的详细讲解:
1. System V 共享内存(Shared Memory)
在进程间通信(IPC进程间通信)中,共享内存(Shared Memory)是一种非常高效的方式,它允许不同的进程直接访问同一块内存区域,从而避免了数据复制和大量的上下文切换。使用共享内存,多个进程可以直接访问同一份内存资源,使得它们之间的通信速度非常快,通常用于高性能的系统和应用中。故共享内存允许多个进程共享同一块物理内存区域。所有进程都可以直接读写共享内存,这样就能避免复制数据,提高效率。它是 System V IPC 中速度最快的通信方式。
共享内存的工作原理基于内存映射:
系统创建一个特定的内存区域,并将该区域映射到多个进程的地址空间。每个进程可以通过直接访问这块内存区域来读写数据。共享内存区域通常会在进程的地址空间中作为一个特殊的内存区域被映射,可以由多个进程并发访问。为了使得多个进程能够看到同一份资源,需要通过操作系统提供的 API 来创建、映射和访问共享内存区域。
上图所示讲解:
1、物理内存映射到进程的地址空间中
现代操作系统使用虚拟内存技术,让每个进程有独立的虚拟地址空间,而不直接使用物理内存的地址。这使得进程在访问内存时,只知道自己的虚拟地址,而操作系统会负责将这些虚拟地址映射到实际的物理内存地址。这个过程叫做 内存映射。
2、如何实现——修改页表,在虚拟地址空间中开辟空间
在现代操作系统中,每个进程都拥有一张页表,用于记录虚拟地址与物理地址之间的映射关系。页表将虚拟地址空间划分为一个个页,每一页有对应的物理内存页。
虚拟地址:这是程序运行时使用的地址,进程看到的地址。
物理地址:这是实际内存中数据的存储位置。
当一个进程需要访问某个虚拟地址时,操作系统通过页表查找该虚拟地址对应的物理地址。如果映射已经建立,硬件可以直接访问物理内存。如果没有映射,操作系统会触发 页面错误(Page Fault),并负责加载数据或分配新的物理内存页。
修改页表 就是指操作系统在管理虚拟内存时,动态地更新页表,将某个虚拟地址映射到一个物理地址。这种修改通常发生在操作系统进行内存分配、程序加载时,或者进程在运行过程中需要更多内存时。
3、有没有能力?——用系统接口,完成所谓的开辟空间,建立映射
操作系统通过一组 系统调用(System Calls) 来提供管理虚拟内存的能力。这些系统调用允许程序请求操作系统为其分配虚拟内存,并为该内存区域建立物理内存的映射。
内存分配:当一个程序或进程需要更多的内存时,它会调用操作系统提供的内存分配函数(比如 malloc(),brk(),mmap() 等),操作系统根据进程的请求,为它分配一块 虚拟内存。
映射物理内存:操作系统会在物理内存中找到一块可用区域,然后通过更新页表,将这块虚拟内存区域与物理内存页进行映射。操作系统通过页表来管理这些映射关系,确保进程访问虚拟地址时能正确地映射到物理地址。
4、用系统接口,完成所谓的开辟空间,建立映射,开辟虚拟空间后返回给用户,都是OS做的
在操作系统中,进程无法直接操作硬件或内存。所有关于虚拟内存的管理和分配都由操作系统负责。操作系统为进程提供了 系统调用接口,通过这些接口,进程可以请求内存分配、释放内存等操作。
例如,mmap() 是一种常用的内存映射系统调用,能够请求操作系统将一个文件或一块物理内存映射到进程的虚拟地址空间中。操作系统收到这些请求后,会根据需要分配或映射合适的内存块,并更新页表。
开辟虚拟空间:操作系统根据进程请求开辟虚拟内存空间,将这些虚拟地址空间通过页表映射到物理内存。
返回给用户:当操作系统完成内存分配和映射后,会将这块分配好的虚拟内存区域的地址返回给进程,进程可以在此区域进行读写操作。
这些内存管理和映射的过程都是由操作系统通过系统调用来实现的,程序员无需直接操作物理内存,而是通过系统接口请求内存。
1.1 共享内存的建立过程
1、申请共享内存(开辟好物理内存)
2、将共享内存挂接(建立映射关系)到地址空间
3、上述1、2完成即开始通信
4、去关联(修改页表,取消映射关系)共享内存
4、释放共享内存(将内存归还给OS)
shm 是 共享内存(Shared Memory) 的简称,是操作系统中一种用于进程间通信(IPC,Inter-Process Communication)的机制。通过共享内存,多个进程可以访问同一块物理内存区域,从而在进程间快速交换数据。
共享内存(Shared Memory)是什