linux共享内存打开的文件|linux下什么是共享内存怎么查看

linux共享内存打开的文件|linux下什么是共享内存怎么查看的第1张示图

❶ linux 如何查看 某块共享内存被哪些文件在用

使用ipcs命令的-m(内存)和-p(进程)选项: # ipcs -mp IPC status from /dev/mem as of Wed Jun 26 14:49:19 BEIDT 2002

❷ linux共享内存使用的过程

Linux共享内存使用的过程? 一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。二、共享内存的使用与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。1、shmget函数该函数用来创建共享内存,它的原型为:int shmget(key_t key, size_t size, int shmflg); 第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。第二个参数,size以字节为单位指定需要共享的内存容量第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。

❸ 一般来说,在linux中使用共享内存的流程应该怎样

可以使用samba协议。Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。具体配置步骤如下:步骤1:安装sambasudo apt-get install samba samba-common-bin步骤2:新建共享目录并设置权限sudo mkdir /home/sharesudo chmod 777 /home/share步骤3:修改配置文件sudo nano /etc/samba/smb.conf在smb.conf最后添加:[share]path = /home/sharebrowseable = yeswritable = yescomment = smb share testpublic = no#yes无需密码 no需要密码步骤4:添加远程访问用户sudo useradd smbusersudo smbpasswd -a smbuser步骤5:重新启动服务sudo service samba restart对于windows操作系统,在资源管理器里输入\\Linux的IP地址,会提示输入上述步骤设置的用户名和密码,输入正确后即可访问分享内容。

❹ 如何查看linux共享内存内容

可以使用samba协议。Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。具体配置步骤如下:步骤1:安装sambasudo apt-get install samba samba-common-bin步骤2:新建共享目录并设置权限sudo mkdir /home/sharesudo chmod 777 /home/share步骤3:修改配置文件sudo nano /etc/samba/smb.conf在smb.conf最后添加:[share]path = /home/sharebrowseable = yeswritable = yescomment = smb share testpublic = no#yes无需密码 no需要密码步骤4:添加远程访问用户sudo useradd smbusersudo smbpasswd -a smbuser步骤5:重新启动服务sudo service samba restart对于windows操作系统,在资源管理器里输入\\Linux的IP地址,会提示输入上述步骤设置的用户名和密码,输入正确后即可访问分享内容。

❺ 共享内存 linux下怎么跑

linux 共享内存实现

说起共享内存,一般来说会让人想起下面一些方法:1、多线程。线程之间的内存都是共享的。更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享;2、父子进程间的内存共享。父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其子孙进程之间就能共享这块内存。这种共享内存由于受到进程父子关系的限制,一般较少使用;3、mmap文件。多个进程mmap到同一个文件,实际上就是大家在共享文件pagecache中的内存。不过文件牵涉到磁盘的读写,用来做共享内存显然十分笨重,所以就有了不跟磁盘扯上关系的内存文件,也就是我们这里要讨论的tmpfs和shmem;

tmpfs是一套虚拟的文件系统,在其中创建的文件都是基于内存的,机器重启即消失。shmem是一套ipc,通过相应的ipc系统调用shmget能够以指定key创建一块的共享内存。需要使用这块内存的进程可以通过shmat系统调用来获得它。虽然是两套不同的接口,但是在内核里面的实现却是同一套。shmem内部挂载了一个tmpfs分区(用户不可见),shmget就是在该分区下获取名为"SYSV${key}"的文件。然后shmat就相当于mmap这个文件。所以我们接下来就把tmpfs和shmem当作同一个东西来讨论了。

tmpfs/shmem是一个介于文件和匿名内存之间的东西。一方面,它具有文件的属性,能够像操作文件一样去操作它。它有自己inode、有自己的pagecache;另一方面,它也有匿名内存的属性。由于没有像磁盘这样的外部存储介质,内核在内存紧缺时不能简单的将page从它们的pagecache中丢弃,而需要swap-out;(参阅《linux页面回收浅析》)

对tmpfs/shmem内存的读写,就是对pagecache中相应位置的page所代表的内存进行读写,这一点跟普通的文件映射没有什么不同。如果进程地址空间的相应位置尚未映射,则会建立到pagecache中相应page的映射;如果pagecache中的相应位置还没有分配page,则会分配一个。当然,由于不存在磁盘上的源数据,新分配的page总是空的(特别的,通过read系统调用去读一个尚未分配page的位置时,并不会分配新的page,而是共享ZERO_PAGE);如果pagecache中相应位置的page被回收了,则会先将其恢复;

对于第三个“如果”,tmpfs/shmem和普通文件的page回收及其恢复方式是不同的:page回收时,跟普通文件的情况一样,内核会通过prio_tree反向映射找到映射这个page的每一个pagetable,然后将其中对应的pte清空。不同之处是普通文件的page在确保与磁盘同步(如果page为脏的话需要刷回磁盘)之后就可以丢弃了,而对于tmpfs/shmem的page则需要进行swap-out。注意,匿名page在被swap-out时,并不是将映射它的pte清空,而是得在pte上填写相应的swap_entry,以便知道page被换出到哪里去,否则再需要这个page的时候就没法swap-in了。而tmpfs/shmem的page呢?pagetable中对应的pte被清空,swap_entry会被存放在pagecache的radix_tree的对应slot上。

等下一次访问触发pagefault时,page需要恢复。普通文件的page恢复跟page未分配时的情形一样,需要新分配page、然后根据映射的位置重新从磁盘读出相应的数据;而tmpfs/shmem则是通过映射的位置找到radix_tree上对应的slot,从中得到swap_entry,从而进行swap-in,并将新的page放回pagecache;

这里就有个问题了,在pagecache的radix_tree的某个slot上,怎么知道里面存放着的是正常的page?还是swap-out后留下的swap_entry?如果是swap_entry,那么slot上的值将被加上RADIX_TREE_EXCEPTIONAL_ENTRY标记(值为2)。swap_entry的值被左移两位后OR上RADIX_TREE_EXCEPTIONAL_ENTRY,填入slot。也就是说,如果${slot}&RADIX_TREE_EXCEPTIONAL_ENTRY!=0,则它代表swap_entry,且swap_entry的值是${slot}>>2;否则它代表page,${slot}就是指向page的指针,当然其值可能是NULL,说明page尚未分配。那么显然,page的地址值其末两位肯定是0,否则就可能跟RADIX_TREE_EXCEPTIONAL_ENTRY标记冲突了;而swap_entry的值最大只能是30bit或62bit(对应32位或64位机器),否则左移两位就溢出了。

最后以一张图说明一下匿名page、文件映射page、tmpfs/shmempage的回收及恢复过程:

❻ linux下什么是共享内存,怎么查看

我们可以修改shmmax内核参数,使SGA存在于一个共享内存段中。通过修改/proc/sys/kernel/shmmax参数可以达到此目的。[[email protected] root]# echo 1073741824 > /proc/sys/kernel/shmmax[[email protected] root]# more /proc/sys/kernel/shmmax1073741824这里设为1G。对于shmmax文件的修改,系统重新启动后会复位。可以通过修改 /etc/sysctl.conf 使更改永久化。在该文件内添加以下一行 kernel.shmmax = 1073741824 这个更改在系统重新启动后生效.1、设置 SHMMAXSHMMAX参数定义共享内存段的最大尺寸(以字节为单位)。在设置 SHMMAX 时,切记 SGA 的大小应该适合于一个共享内存段。 SHMMAX 设置不足可能会导致以下问题:ORA-27123:unable to attach to shared memory segment您可以通过执行以下命令来确定 SHMMAX 的值:# cat /proc/sys/kernel/shmmax33554432SHMMAX 的默认值是 32MB 。我一般使用下列方法之一种将 SHMMAX 参数设为 2GB :通过直接更改 /proc 文件系统,你不需重新启动机器就可以改变 SHMMAX 的默认设置。我使用的方法是将以下命令放入 /etc/rc.local 启动文件中:# >echo "2147483648" > /proc/sys/kernel/shmmax您还可以使用 sysctl 命令来更改 SHMMAX 的值:# sysctl -w kernel.shmmax=2147483648最后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf2、设置 SHMMNI我们现在来看 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改。您可以通过执行以下命令来确定 SHMMNI 的值:# cat /proc/sys/kernel/shmmni40963、设置 SHMALL最后,我们来看 SHMALL 共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:ceil(SHMMAX/PAGE_SIZE)SHMALL 的默认大小为 2097152 ,可以使用以下命令进行查询:# cat /proc/sys/kernel/shmall2097152SHMALL 的默认设置对于我们的 Oracle9 i RAC 安装来说应该足够使用。

❼ linux fork 会共享哪些东西

fork()不仅创建出与父进程代码相同的子进程,而且父进程在fork执行点的所有上下文场景也被自动复制到子进程中,包括:—全局和局部变量—打开的文件句柄—共享内存、消息等同步对象 由于pipe调用相当于创建了2个文件句柄,因此在fork后这两个句柄也被自动复制到子进程中,对这两个句柄的操作效果与在主进程中的操作效果是一致的,这就使父子进程之间很容易通过该机制实现数据交换,如: 假设pipe产生的句柄为P[0],P[1],在fork后父子进程都拥有了P[0],P[1]句柄,那么:—父进程可向自己的P[1]中写入数据,子进程从P[0]中即可读出该数据;切记此时父进程不能也从P[0]读数据,否则自己写入的数据可能先被自己读走了—反之亦然,子进程向P[1]中写入数据后,父进程从P[0]中可读出该数据;切记此时子进程不要从P[0]读走数据 你可能难以理解为什么进程内部的数据读写会被传递到另一个进程,但别忘了,pipe匿名管道和文件,socket等一样是属于操作系统的管理对象,对其进行读写都是由OS的内核代码来进行控制的。在父进程调用pipe创建出管道后,该管道对象是存储在OS内部的,父进程得到的P[0]和P[1]都只是对该对象的引用(相当于指针);在fork出子进程后,子进程复制出的也只是同一个指针,所指向的还是OS中的同一个对象,这就是为什么父子进程能通过其进行互相通信的原因。

❽ linux共享内存和mmap的区别

共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所内以是最快的一容种进程间通信机制。共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制共同使用。mmap的机制如:就是在磁盘上建立一个文件,每个进程存储器里面,单独开辟一个空间来进行映射。如果多进程的话,那么不会对实际的物理存储器(主存)消耗太大。shm的机制:每个进程的共享内存都直接映射到实际物理存储器里面。1、mmap保存到实际硬盘,实际存储并没有反映到主存上。优点:储存量可以很大(多于主存);缺点:进程间读取和写入速度要比主存的要慢。2、shm保存到物理存储器(主存),实际的储存量直接反映到主存上。优点,进程间访问速度(读写)比磁盘要快;缺点,储存量不能非常大(多于主存)使用上看:如果分配的存储量不大,那么使用shm;如果存储量大,那么使用mmap。

❾ linux查看共享内存命令

共享内存查看使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:[[email protected] ~]# ipcs -m —— Shared Memory Segments ——–key shmid owner perms bytes nattch status 0x00000000 1867776 root 600 393216 2 dest 0x00000000 1900545 root 600 393216 2 dest 0x00030021 1703938 zc 666 131104 1 0x0003802e 1736707 zc 666 131104 1 0x00030004 1769476 zc 666 131104 1 0x00038002 1802245 zc 666 131104 1 0x00000000 1933318 root 600 393216 2 dest 0x00000000 1966087 root 600 393216 2 dest 0x00000000 1998856 root 600 393216 2 dest 0x00000000 2031625 root 600 393216 2 dest 0x00000000 2064394 root 600 393216 2 dest 0x0014350c 2261003 cs 666 33554432 2 0x00000000 2129932 root 600 393216 2 dest 0x00000000 2162701 root 600 393216 2 dest 0x00143511 395837454 root 666 1048576 1 其中:第一列就是共享内存的key;第二列是共享内存的编号shmid;第三列就是创建的用户owner;第四列就是权限perms;第五列为创建的大小bytes;第六列为连接到共享内存的进程数nattach;第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。

未经允许不得转载:山九号 » linux共享内存打开的文件|linux下什么是共享内存怎么查看

赞 (0)