Linux给我们提供了丰富的内部进程通信机制,包括共享内存、内存映射文件、先入先出(FIFO)、接口(sockets)以及多种用于同步的标识。在本文中,我们主要讨论一下共享内存和内存映射文件技术。
一般来说,内部进程通信(interprocess communication)也就是IPC,是指两个或两个以上进程以及两个或者两个以上线程之间进行通信联系。每个IPC机制都有不同的强项或者弱点,不过没有一个IPC机制包含内建的同步方法。因此程序员不但需要自己在程序中实现同步,而且还需要为了利用IPC机制而自己开发通信协议。
共享内存
使用共享内存和使用malloc来分配内存区域很相似。使用共享内存的方法是:
1.对一个进程/线程使用shmget分配内存区域。
2.使用shmat放置一个或多个进程/线程在共享内存中,你也可以用shmctl来获取信息或者控制共享区域。
3.使用shmdt从共享区域中分离。
4.使用shmctl解除分配空间
下面是个例子:
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>
//建立共享内存区域
intshared_id;
char *region;
const intshm_size = 1024;
shared_id = shmget(IPC_PRIVATE,//保证使用唯一ID
shm_size,
IPC_CREAT | IPC_EXCL |//创建一个新的内存区域
S_IRUSR | S_IWUSR);//使当前用户可以读写这个区域
//交叉进程或生成进程.
//将新建的内存区域放入进程/线程
region = (char*) shmat(segment_id, 0, 0);
//其他程序代码
...
//将各个进程/线程分离出来
shmdt(region);
//破坏掉共享内存区域
shmctl(shared_id, IPC_RMID, 0);
|
共享内存是Linux中最快速的IPC方法。他也是一个双向过程,共享区域内的任何进程都可以读写内存。这个机制的不利方面是其同步和协议都不受程序员控制,你必须确保将句柄传递给了子进程和线程。
内存映射文件
内存映射文件不仅仅用于IPC,在其他进程中它也有很大作用。如果你需要将一个分配的缓冲区初始化为零,只要记住/dev/zero 。你也可以通过将文件映射到内存中以提高其性能。它使你可以像读写字符串一样读写文件。下面是个例子:
<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code>
const char filename[] = "testfile";
intfd;
char *mapped_mem;
const intflength = 1024;
fd = open(filename, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
lseek(fd, flength + 1, SEEK_SET);
write(fd, "/0", 1);
lseek(fd, 0, SEEK_SET);
mapped_mem = mmap(0,
flength,
PROT_WRITE, //允许写入
MAP_SHARED,//写入内容被立即写入到文件
fd,
0);
close(fd);
//使用映射区域.
...
munmap(file_memory, flength);
|
利用内存映射来处理IPC的好处是在整个过程中你不需要处理句柄:只要打开文件并把它映射在合适的位置就行了。你可以在两个不相关的进程间使用内存映射文件。
使用内存映射的缺点是速度不如共享内存快。如果凑巧文件很大,所需要的虚拟内存就会很大,这样会造成整体性能下降。
分享到:
相关推荐
Linux内存映射机制是一种操作系统内核管理内存的方式,它涉及到虚拟地址到物理内存地址的转换过程...此外,内核版本的选取、内核代码的阅读工具以及与内存映射相关的技术细节都为深入研究Linux内存管理提供了重要参考。
4. **非实时Linux进程访问共享内存**:对于普通的Linux进程,需要使用`open()`、`mmap()`等函数将物理地址映射到进程的虚拟地址空间,才能访问共享内存。这通常涉及到对`/dev/mem`设备文件的操作。 5. **同步与互斥...
本文旨在深入解析Linux设备驱动中的内存映射机制,涵盖其概念、原理及具体实现方式,帮助读者全面理解并掌握这一重要知识点。 #### 二、内存映射的概念 内存映射是指将物理内存地址映射到进程的虚拟地址空间的过程...
内存映射是Linux系统中的一项关键技术,它允许进程直接访问物理内存或文件,而不必通过传统的I/O操作。本文将深入探讨Linux下内存映射的原理及其在不同内存区域的应用。 首先,Linux系统中的内存管理依赖于MMU...
Linux内核内存管理的核心在于内存映射,它确保了CPU能够高效、安全地访问内存。在Linux中,尤其是在较早的版本如2.6.20.6中,内存映射通常采用三级映射机制,这在CPU访问内存的过程中扮演着关键角色。内存映射不仅...
在嵌入式Linux操作系统中,研究内存映射技术在硬件驱动程序中的应用,使处理能力一般的嵌入式系统也可以高效地利用高速数据收发设备。 内存映射技术可以实现用户态和内核态之间的快速切换。用户态和内核态之间的...
### ARM Linux 内存映射知识点详解 #### 一、概览 《ARM Linux 内存映射》是一篇深入探讨ARM架构下Linux系统如何管理内存映射的文章。该文档由作者张俊岭编写,发布于2009年8月5日。文档主要介绍了在ARM Linux环境...
内存映射(Memory Mapping)是一种高效处理大文件的技术,它允许程序通过操作系统将磁盘上的文件映射到进程的虚拟地址空间中,从而实现对文件的读写操作如同操作内存一样简便快速。这种方式大大提升了超大文件的读写...
Linux内核中的内存映射(Memory Mapping)是一种高效的数据访问技术,它允许用户空间程序直接与物理内存交互,而无需通过系统调用和页表复制。这种机制在处理大文件、设备驱动、共享内存以及多进程通信等方面尤其...
本文以RHEL5.8 i686内核源码版本2.6.18-308(源码下载地址ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Server/en/os/SRPMS/),在IA-32架构CPU为基础,分析CPU架构下的地址映射过程及Linux内核中的实现,并...
总的来说,嵌入式Linux的物理内存映射和管理是一个复杂的过程,涉及到内存的分块、分配、回收以及碎片控制等多个方面。理解这些机制对于优化嵌入式系统的性能和稳定性至关重要,特别是对于资源受限的设备而言。...
Linux ARM架构下的高端内存映射是一个复杂而关键的议题,主要涉及到系统如何处理超过低端内存直接映射范围的物理内存。低端内存,也被称为直接映射,是指可以直接通过虚拟地址和物理地址之间的简单偏移来访问的内存...
Linux共享内存是一种高效的进程间通信(IPC)方式,允许多个进程访问同一块内存区域,从而实现数据的快速共享。文件映射则是将磁盘文件直接映射到内存中,使得对文件的操作就像对内存进行读写一样高效。两者在Linux...
### Linux下的内存映射 #### 一、内存映射概述 内存映射是Unix/Linux操作系统中一种非常高效的进程间通信(IPC)方式。通过内存映射,不同进程能够共享同一块物理内存,从而实现了进程间的数据共享。这种共享内存...
Linux虚拟内存的实现需要6种机制的支持:地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制和内存共享机制。 在Linux中,虚拟内存管理是通过地址映射机制把用户程序的逻辑地址映射到物理地址...
本文将详细阐述Linux操作系统的内存管理机制,包括物理内存和虚拟内存的管理机制、地址映射机制、内存碎片和内存不连续的问题解决等。 Linux操作系统的内存管理机制旨在解决进程需要使用的代码和数据都放在内存中,...
内存映射文件是一种特殊的文件映射技术,它允许程序将一个或多个文件映射到进程的虚拟地址空间内,这样就可以像访问内存一样访问文件中的数据。这种方法特别适合于处理大文件,因为它避免了传统文件I/O操作中的频繁...
这一系统通过映射技术,将进程的虚拟地址转换为实际物理地址,使得多个进程可以共享同一物理内存,提高了系统的并发能力。下面将详细介绍Linux虚拟内存管理的关键概念和技术。 首先,我们讨论一下虚拟内存的基本...
Linux 内存映射实例分析 Linux 内存管理是操作系统中最重要的部分之一,而内存映射是内存管理的核心内容。本文主要分析 Linux 内存映射实例,讨论虚拟地址空间和物理地址的映射关系,包括内核虚拟地址空间的映射...
内存映射文件(Memory-Mapped File)是一种在操作系统层面上高效读写大文件的技术,它允许应用程序将文件的内容直接映射到进程的虚拟地址空间中,使得数据的读写如同操作内存一样快速。这种方式在处理大数据量时尤其...