一、共享内存相关知识
所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的。由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要像消息队列那样进行复制,所以共享内存的效率很高。共享内存可以通过mmap()映射普通文件机制来实现,也可以System V共享内存机制来实现,System V是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信,也就是说每个共享内存区域对应特殊文件系统shm中的一个文件。
二、共享内存原理
System V共享内存把所有共享数据放在共享内存区,任何想要访问该数据的进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。System V共享内存通过shmget函数获得或创建一个IPC共享内存区域,并返回相应的标识符,内核在保证shmget获得或创建一个共享内存区,初始化该共享内存区相应的shmid_kernel结构,同时还将在特殊文件系统shm中创建并打开一个同名文件,并在内存中建立起该文件的相应的dentry及inode结构,新打开的文件不属于任何一个进程,所有这一切都是系统调用shmget函数完成的。
三、sysctl.conf 配置文件
以上两段说明部分是从互联网中找到的理解的内容。而做为Linux系统维护人员,能接触到的与共享内存相关的设置主要在/etc/sysctl.conf中的几个配置项。具体如下:
- kernel.shmmax = 4398046511104
- kernel.shmall = 1073741824
- kernel.shmmni = 4096
以下是redhat6官方提供的一份安装oracle的文档关于共享内存的部分介绍,如下:
ipcs是linux/uinx上提供关于一些进程间通信方式的信息,包括共享内存,消息队列,信号
ipcs用法
ipcs -a 是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息
ipcs -m 打印出使用共享内存进行进程间通信的信息
ipcs -q 打印出使用消息队列进行进程间通信的信息
ipcs -s 打印出使用信号进行进程间通信的信息
输出格式的控制
ipcs -t 输出信息的详细变化时间
ipcs -u 输出当前系统下ipc各种方式的状态信息(共享内存,消息队列,信号)
ipcrm 命令
移除一个消息对象。或者共享内存段,或者一个信号集,同时会将与ipc对象相关链的数据也一起移除。当然,只有超级管理员,或者ipc对象的创建者才有这项权利啦
ipcrm用法
ipcrm -M shmkey 移除用shmkey创建的共享内存段
ipcrm -m shmid 移除用shmid标识的共享内存段
ipcrm -Q msgkey 移除用msqkey创建的消息队列
ipcrm -q msqid 移除用msqid标识的消息队列
ipcrm -S semkey 移除用semkey创建的信号
ipcrm -s semid 移除用semid标识的信号
进程间通信概述
进程间通信有如下的目的:1、数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间;2、共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到;3、通知事件,一个进程需要向另一个或一组进程发送消息,通知它们发生了某件事情;4、资源共享,多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制;5、进程控制,有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
Linux进程间通信由以下几部分发展而来:
早期UNIX进程间通信:包括管道、FIFO、信号。
基于System V的进程间通信:包括System V消息队列、System V信号灯(Semaphore)、System V共享内存。
基于Socket进程间通信。
基于POSIX进程间通信:包括POSIX消息队列、POSIX信号灯、POSIX共享内存。
Linux中,与IPC相关的命令包括:ipcs、ipcrm(释放IPC)、
具体的用法总结如下:
1、显示所有的IPC设施
# ipcs -a
2、显示所有的消息队列Message Queue
# ipcs -q
3、显示所有的信号量
# ipcs -s
4、显示所有的共享内存
# ipcs -m
5、显示IPC设施的详细信息
# ipcs -q -i id
id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。
6、显示IPC设施的限制大小
# ipcs -m -l
-m对应设施类型,可选参数包括-q、-m、-s。
7、显示IPC设施的权限关系
# ipcs -c
# ipcs -m -c
# ipcs -q -c
# ipcs -s -c
8、显示最近访问过IPC设施的进程ID。
# ipcs -p
# ipcs -m -p
# ipcs -q -p
9、显示IPC设施的最后操作时间
# ipcs -t
# ipcs -q -t
# ipcs -m -t
# ipcs -s -t
10、显示IPC设施的当前状态
# ipcs -u
Linux上的ipcs命令,不支持UNIX上的-b、-o指令,同样UNIX中不支持-l、-u指令,所以在编写跨平台的脚本时,需要注意这个问题。
相关推荐
Linux中的`ipcs`和`ipcrm`是两个非常重要的命令,它们主要用于管理和监控进程间的通信(IPC,Inter-Process Communication)。在多进程环境中,进程间通信是必不可少的,它允许不同进程之间交换数据和协调工作。下面...
- **ipcs命令**:解释如何使用ipcs命令查看和管理共享内存段、消息队列和信号量集。 - **ipcrm命令**:介绍如何使用ipcrm命令删除IPC对象。 - **消息队列**: - **有关的数据结构**:说明消息队列涉及的关键数据...
1. **Linux操作系统管理**:`ipcs`和`ipcrm`命令用于管理Linux中的进程间通信(IPC)资源,如共享内存。当应用如Oracle数据库异常关闭时,可能遗留共享内存段,这时可以使用`ipcrm`命令来释放这些资源。 2. **系统...
### Linux网络编程技巧详解 #### 一、网络编程概览 **1.1 网络的历史** 网络的历史可以追溯到20世纪60年代,最初是为了满足远程数据传输的需求而发展起来的。随着计算机技术的进步,特别是互联网的普及,网络技术...
- 掌握ipcs和ipcrm命令的使用方法。 - 学习消息队列、信号量和共享内存的具体应用。 **4.7 消息队列(Message Queues)** - **概述:** 消息队列是一种高效的进程间通信方式。 - **学习要点:** - 了解消息队列...
- **ipcrm 命令**: 说明了用于删除IPC对象的命令。 - **消息队列**: 详细讲解了消息队列的使用方法和数据结构。 - **信号量**: 介绍了信号量的实现机制及其在进程间通信中的作用。 - **共享内存**: 解释了共享内存的...
- **ipcs和ipcrm命令**: 介绍了用于管理和控制System V IPC对象的命令。 - **消息队列**: 讲解了消息队列的使用方法,包括创建、发送和接收消息的操作。 - **信号量**: 介绍了信号量的概念及其在进程间同步中的作用...
### Linux网络编程知识点详解 #### 一、网络编程概论 **1.1 网络的历史** - **起源与发展**:从最早的ARPANET到今天的互联网,网络经历了漫长而复杂的发展过程。早期的网络主要服务于军事和科研目的,随着时间的...