共享内存

Windows进程间通信

假装没事ソ 提交于 2020-01-21 20:07:27
  Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指 不同进程间进行数据共享和数据交换 。进程间通信的方式有: 1、文件映射   文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。   Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。 应用程序有三种方法来使多个进程共享一个文件映射对象:   (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。   (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。   (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等

进程,线程通信与同步

谁都会走 提交于 2020-01-21 00:04:48
原文链接 1.0 Linux进程间通讯 管道/FIFO:管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式 消息队列:消息队列是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据. 需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!! 信号量:信号量,它与WINDOWS下的信号量是一样的,所以就不用多说了 共享内存:共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写 信号:signal 套接字socket IPC比较 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 4.信号量:不能传递复杂消息,只能用来同步 5.共享内存

进程间通信(IPC)

流过昼夜 提交于 2020-01-17 01:03:50
进程间通信(Interprocess communication) 一、概述: 进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。进程间通信是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。 二、目的: (1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 (2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 (3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 (4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 (5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通过与内核及其它进程之间的互相通信来协调它们的行为。Linux支持多种进程间通信(IPC)机制

c++共享内存通信如何实现

萝らか妹 提交于 2020-01-15 04:36:52
c++共享内存通信如何实现 前言 mmap机制-对应cyber中共享内存通信模式中的PosixSegment 小结 System V共享内存-对应cyber中XsiSegment 小结 参考链接 前言 现在很多对性能要求高的项目都会支持共享内存的进程间通信(IPC)方式,本文会以百度Apollo自动驾驶项目为例,展示两种c++中实现共享内存通信的方式(对应linux中两种不同的机制)。 共享内存实际上就是两个不相关的进程访问同一块逻辑内存,相应的肯定需要额外的同步机制来保证读写正确。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 mmap机制-对应cyber中共享内存通信模式中的PosixSegment 内存映射机制mmap是POSIX标准的系统调用,mmap(

oracle 11安装教程 linux

℡╲_俬逩灬. 提交于 2020-01-15 01:55:18
系统环境: CentOS Linux release 7.4.1708 (Core) Oracle版本: Oracle Database 11g R2 注意事项:安装的过程可能遇到假死现象,直接回车即可 如果遇到中文乱码: 新建一个目录,上传字体包zysong.ttf到新建的目录,命令如下: #mkdir –p /usr/share/fonts/zh_CN/TrueType #cd /usr/share/fonts/zh_CN/TrueType #chmod –R 75 zysong.ttf 配置系统变量为zh_CN.UTF-8,如下图所示: 一:准备工作 1、关闭selinux 查看selinux状态:getenforce 或者sestatus -v 临时关闭:setenforce 0 永久关闭:vim /etc/selinux/config 设置SELINUX=disabled 2、关闭firewalld 安装iptables systemctl stop firewalld.service systemctl disable firewalld.service yum -y install iptables-services systemctl restart iptables.service systemctl enable iptables.service 二

linux各种IPC机制

别等时光非礼了梦想. 提交于 2020-01-13 19:50:47
linux各种IPC机制   docker中的资源隔离,一种就是IPC的隔离。IPC是进程间通信。 下面的文章转载自https://blog.csdn.net/yyq_9623/article/details/78794775 原帖发表在IBM的developerworks网站上,是一个系列的文章,作者郑彦兴,通过讲解和例子演示了Linux中几种IPC的使用方式,我觉得很好,在这里做一个保留,能看完的话Linux IPC的基础是没有问题的了。 一)Linux环境进程间通信(一)管道及有名管道 http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 二)Linux环境进程间通信(二): 信号 上: http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html 下: http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html 三)Linux环境进程间通信(三)消息队列 http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 四)Linux环境进程间通信(四)信号灯 http://www.ibm.com/developerworks

(1)IPC简介

笑着哭i 提交于 2020-01-13 19:20:27
Unix/Linux IPC简介 简述 1. 消息传递演变过程 2. 同步形式演变 进程、线程与信息共享 IPC对象的持续性 名字空间 fork、exec和exit对IPC对象的影响 总结 参考资料 简述 IPC是进程间通信(interprocess communication)的简称。用来描述运行在一个操作系统之上的不同进程间各种消息传递的方式。 IPC在使用过程中需要同步参与一起运行。 1. 消息传递演变过程 管道(pipe):只能在具有共同祖先(指父子进程关系)的进程间使用,有名管道fifo可以在任意进程间使用 System V消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 Posix消息队列:可在同一主机上有亲缘关系或无亲缘关系的进程间使用。 远程过程调用: 2. 同步形式演变 使用文件系统特性同步 记录上锁(record-locking) System V信号量 Posix信号量和Posix共享内存区 互斥锁(mutex)和条件变量(condition variable):主要用于线程间同步,也能提供进程间的同步 读写锁(read-write-lock) 进程、线程与信息共享 unix/linux间信息共享的三种方式 两个进程共享存储在文件系统中的某个文件上的信息。访问该文件,每个进行都要经过内核(如read,write,lseek等)

Tensor创建:直接创建

时光毁灭记忆、已成空白 提交于 2020-01-13 08:19:39
Tensor创建:直接创建 2.Tensor:直接创建 (1)torch,tensor() import torch import numpy as np torch.manual_seed ( 1 ) #通过创建torch.tensor创建张量 arr = np.ones (( 3 , 3 )) print ( "ndarray的数据类型:" ,arr.dtype ) t = torch.tensor ( arr ) print ( t ) 输出结果: 如果想对张量加速 需要将tensor的device改为cuda t = torch.tensor ( arr,device = 'cuda' ) (2)torch.from_numpy(ndarray) //从numpy创建tensor 注意:从torch.from_numpy创建的tensor与原ndarray共享内存,当修改其中一个数据时,另一个也会变动 arr = np.array ( [ [ 1,2,3 ] , [ 4,5,6 ] ] ) t = torch.from_numpy ( arr ) 修改arr的数据 arr [ 0,0 ] = 0 改变tensor t [ 0,0 ] = 100 来源: CSDN 作者: Major_s 链接: https://blog.csdn.net/qq_41375318

Linux基础入门--进程间通信--共享内存

非 Y 不嫁゛ 提交于 2020-01-12 23:56:55
Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限,大小和最近访问的时间等。该数据结构定义如下: //include /usr/include/bit/shm.h struct shmid_ds { struct ipc_perm shm_perm; //操作权限 int shm_segsz; //段长度大小 _kernel_time_t shm_atime; //最近attach时间 _kernel_time_t shm_dtime; //最近detach时间 _kernel_time_t shm_ctime; //最近change时间 _kernel_ipc_pid_t shm_cpid; //创建者pid _kernel_ipc_pid_t shm_lpid; //最近操作pid unsigned short shm_nattch; unsigned short shm_unused; void *shm_unused2; void *shm_unused3; } 两个进程在使用此共享内存空间之前,需要在进程地址空间与共享内存空间之间建立联系,即将共享内存空间挂载到进程中。

IPC---共享内存的使用

丶灬走出姿态 提交于 2020-01-11 14:53:33
1 #include < stdio . h > 2 #include < stdlib . h > 3 #include < sys / mman . h > 4 #include < unistd . h > 5 #include < fcntl . h > 6 #include < string . h > 7 8 int main ( ) 9 { 10 int fd = open ( "mytest.txt" , O_RDWR | O_CREAT , 0644 ) ; 11 if ( fd == - 1 ) 12 { 13 perror ( "open error" ) ; 14 exit ( 1 ) ; 15 } 16 17 int len = ftruncate ( fd , 4 ) ; 18 if ( len == - 1 ) 19 { 20 perror ( "ftruncate error" ) ; 21 exit ( 1 ) ; 22 } 23 char * p = NULL ; 24 p = mmap ( NULL , 4 , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 ) ; 25 if ( p == MAP_FAILED ) 26 { 27 perror ( "mmap error" ) ; 28 exit (