共享内存

VS C++ 共享内存 CreateFileMapping

匿名 (未验证) 提交于 2019-12-03 00:19:01
创建共享内存 HANDLE CreateFileMapping( // optional security attributes, 是否被继承 ); hFile // (HANDLE)0xFFFFFFFF 不指定共享内存句柄 lpFileMappingAttributes // 是否被继承 flProtect // 读写权限 dwMaximumSizeHigh dwMaximumSizeLow // 共享内存大小 lpName // 名字 返回值: 成功:共享内存句柄 失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。 映射共享内存地址空间 LPVOID MapViewOfFile( ); hFileMappingObject : CreateFileMapping 和 OpenFileMapping 返回的句柄 dwDesiredAccess : 存取模式 返回值: 成功:返回映射的地址 失败:GetLastError function returns ERROR_ALREADY_EXISTS;或 NULL。 解除映射 BOOL UnmapViewOfFile( ); 返回值: 成功:返回非0 失败:返回0 关闭打开的句柄 BOOL CloseHandle( ); #include <Windows.h>

C++共享内存实现

匿名 (未验证) 提交于 2019-12-03 00:18:01
服务端:(1) 创建 写入数据 #include "stdafx.h" #include <windows.h> #include <iostream> using namespace std; #define BUF_SIZE 4096 int main() { // 定义共享数据 char szBuffer[] = "我姓易,却发现爱你不易。"; // 创建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默认安全级别 PAGE_READWRITE, // 可读可写 0, // 高位文件大小 BUF_SIZE, // 低位文件大小 L"ShareMemorySZHC" // 共享内存名称 ); // 映射缓存区视图 , 得到指向共享内存的指针 LPVOID lpBase = MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 可读写许可 0, 0, BUF_SIZE ); // 将数据拷贝到共享内存 strcpy((char*)lpBase, szBuffer); cout <<"服务:"<< (char*)lpBase << endl; // 线程挂起等其他线程读取数据 Sleep

浅析Go中的MPG模式(二)――channel通讯

匿名 (未验证) 提交于 2019-12-03 00:09:02
首先拓展一下额外的内容: runtime包介绍 (图片来自Go语言中文网) 一些较为重要的函数介绍 func NumCPU () int 使用NumCPU方法能够获得一个本地机器的逻辑CPU个数的int类型数值 func GOMAXPROCS ( n int ) int GOMAXPROCS设置可同时执行的最大CPU数,并返回先前的设置。 若 n < 1,它就不会更改当前设置。本地机器的逻辑CPU数可通过 NumCPU 查询。本函数在调度程序优化后会去掉。 一般来说,在go1.8版本之后,系统会默认使用全部逻辑CPU进行并行操作。而在go1.8之前的版本,则需要自己设置(即使用GOMAXPROCS)。有的时候设计者需要保留一些CPU的功能占用,也会自主设定GOMAXPROCS比最大可用CPU数量少一些。 拓展完毕。接下来进入正题 那么不同的Goroutine之间如何通讯呢?有两种方式: 1、全局变量互斥锁 2、管道Channel 在Go语言中倡导: “不要以共享内存的方式来通信,相反,要通过通信来共享内存。” 首先看一下传统的并发形式: 多线程共享内存,这也是Java、C#或者C++等语言中的多线程开发的常规方法,其实golang语言也支持这种传统模式。 另外一种是Go语言特有的: CSP(Communicating Sequential Processes)并发模型

Golang channel

匿名 (未验证) 提交于 2019-12-03 00:02:01
channel channel是goroutine进行通信的管道,数据从一端发送到另一端,通过通道接收。 不要通过共享内存来通信,而应该通过通信来共享内存 go语言中,要传递某个数据给另一个goroutine,可以把这个数据封装成一个对象,然后把这个对象的指针传入某个channel中,另外一个goroutine从这个channel中读出这个指针,并处理其指向的内存对象。Go从语言层面保证同一个时间只有一个goroutine能访问channel中的数据,所以go的做法就是使用channel来通信,通过通信来传递内存中的数据,是的内存数据在不同的goroutine中传递,而不是使用共享内存来通信。 注意点 1.用于goroutine,传递消息的 2.通道,每个都有相关联的数据类型,nil chan无法使用,类似于nil map,不能直接储存键值对 3.使用通道传递数据:<-,根据箭头方法进行数据传递 4.阻塞: 发送数据: chan <- data ,阻塞的,直到另一条goroutine读取数据来解除阻塞 读取数据: data <- chan ,阻塞的,直到另一条goroutine写出数据来解除阻塞 5.本身channel就是同步的,意味着同一时间,只能有一条goroutine来操作 最后:通道是goroutine之间的连接,所以通道的发送和接收必须处在不同的goroutine中。

Android 属性property_get/property_set

匿名 (未验证) 提交于 2019-12-02 23:56:01
每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。 在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:device/system/init。“init”守护进程将启动一个属性服务。 属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device/libs/cutils。API函数是: int property_get(const char *key, char *value, const char *default_value); int property_set(const char *key, const char *value); 而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位于:device/system/bionic。

进程之间的通信方式

匿名 (未验证) 提交于 2019-12-02 23:52:01
进程之间的通信方式有管道、消息队列、共享内存、信号量和Socket。 管道 来看一条Linux的指令: netstat - tulnp | grep 8080 学过Linux命名的估计都懂得这条指令的含义,其中的【|】就是管道的意思,作用是把前一条命令的输出作为后一条命令的输入。在这里就是把netstat -tulnp的输出结果作为grep 8080这条指令的输入。如果两个进程要进行通信的话,就可以用这种管道进行通信了,并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命名的输入,如果进程之间想要互相通信的话,就需要创建两个管道。 另外我们可以知道,这条竖线是没有名字的,我们把这种通信方式称之为匿名管道。既然有匿名管道,那就意味着有命名管道,下面我们来创建一个命名管道: mkfifo test 这条命令创建了一个名字为test的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后会有另外一个进程把里面的数据读出来。 echo "this is a pipe" > test // 写入数据 这个时候管道的内容没有被读出来的话,那么这个命令就会一直停在这里,只有当另一个进程把test里面的内容读出来的时候,这条命令才会结束。 cat < test // 读数据 我们可以看到,test里面的数据被读出来了,上一条命令也就执行结束了。 从上面的例子可以看出

进程间通信――共享内存(Shared Memory)

匿名 (未验证) 提交于 2019-12-02 23:42:01
原文:https://blog.csdn.net/ypt523/article/details/79958188 共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。 特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。 下面就 Shared Memory 的IPC作以阐述与分析。 共享内存的通信原理 在Linux中,每个进程都有属于自己的进程控制块(PCB)和地址空间(Addr Space),并且都有一个与之对应的页表,负责将进程的虚拟地址与物理地址进行映射,通过内存管理单元(MMU)进行管理。两个不同的虚拟地址通过页表映射到物理空间的同一区域,它们所指向的这块区域即共享内存。 共享内存的通信原理示意图: 对于上图我的理解是:当两个进程通过页表将虚拟地址映射到物理地址时

并行数据库体系

匿名 (未验证) 提交于 2019-12-02 23:34:01
并行数据库要求尽可能的并行执行所有的数据库操作,从而在整体上提高数据库系统的性能。 根据所在的计算机的处理器(Processor)、内存(Memory)及存储设备(Storage)的相互关系,并行数据库可以归纳为三种基本的体系结构(这也是并行计算的三种基本体系结构),即: 1. 共享内存结构(Shared-Memory)、 2. 共享磁盘结构(Shared-Disk) 3.无共享资源结构(Shared-Nothing)。 1、共享内存(Shared-Memory)结构 =多个处理 + 一个全局共享的内存(主存储器)和多个磁盘存储,各个处理器通过高速通讯网络(InterconnectionNetwork)与共享内存连接,并均可直接访问系统中的一个、多个或全部的磁盘存储,在系统中,所有的内存和磁盘存储均由多个处理器共享。 (1)提供多个数据库服务的处理器通过全局共享内存来交换消息和数据,通讯效率很高,查询内部和查询间的并行性的实现也均不需要额外的开销; (2)数据库中的数据存储在多个磁盘存储上,并可以为所有处理器访问; (3)在数据库软件的编制方面与单处理机的情形区别也不大。 这种结构由于使用了共享的内存,所以可以基于系统的实际负荷来动态地给系统中的各个处理器分配任务,从而可以很好地实现负荷均衡。 2、共享磁盘(Shared-Disk)结构 该结构由多个具有独立内存(主存储器

KVM总结-KVM性能优化之CPU优化

匿名 (未验证) 提交于 2019-12-02 23:04:42
任何平台根据场景的不同,都有相应的优化。不一样的硬件环境、网络环境,同样的一个平台,它跑出的效果也肯定不一样。就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同… 所以,我们做运维工作,也是如此。首先你得充分了解你所用的软件平台,然后根据你现有的生产环境去充分的测试,最后得出结果,做最优的调整。 KVM也是一样,首先要做的是充分的了解它,看看有哪些参数和设置我们可以做出调整,最终应用以求发挥最高的性能。 那么KVM的性能调优,我们可以从四个方面入手 ―― CPU、内存、磁盘IO、网络。 CPU这块我们是针对NUMA这块的调优,那么什么是NUMA呢?NUMA是英文 Non Uniform Memory Access Architecture 的缩写,意思就是非统一内存访问,它是一种解决多CPU共同工作的解决方案。我们知道现在的服务器配置都比较高了,CPU很多都是多路多核的,而且CPU是需要跟存储器进行数据交互的,以往的年代,那时候的CPU运算速率不高,而且都是单CPU模式,那么存储器里的数据要放到CPU里进行运算这是完完全全跟得上的。但是现在的CPU运算速度大大增强了,而且都是多CPU模式,于是就出现了不平衡,那就是存储器里的数据完全不够让CPU消化,并且还会出现多个CPU抢食存储器的情况… 这种情况下CPU就表现得非常的饥渴… 数据不够享用,而且存储器还不够分配。

4.共享内存shm

匿名 (未验证) 提交于 2019-12-02 22:56:40
版权声明:guojawee https://blog.csdn.net/weixin_36750623/article/details/83384612 1.最快的IPC通信方式 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这 些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调 用来传递彼此的数据。 图:用管道或者消息队列传递数据 图:用共享内存传递数据 2.相关API [1]shmget int shmget(key_t key, size_t size, int shmflg); //创建或打开 [2]shmat:将共享内存段连接到进程地址空间 [说明]shmget创建/打开共享内存后,必须使用shmat将该共享内存连接到 进程的地址空间,以便进程使用。不适用shmat,进程无法使用该共享内存。 (每个进程shmat以后得到的地址不一样--属于自己的共享内存地址) p=shmat(shm_id,NULL,0);//让本进程链接到共享内存会得到一个共享内存的首地址p,可 以直接通过指针p去操控共享内存。 ----------------------------------- void *shmat(int shmid, const void *shmaddr, int shmflg); 参数: shmaddr:指定连接的地址