共享内存

进程间通信几种方式

一个人想着一个人 提交于 2019-12-04 07:40:45
一、进程间通信概述 进程通信有如下一些目的: A、数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 B、共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 C、通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 D、资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 E、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 Linux 进程间通信(IPC)以下以几部分发展而来: 早期UNIX进程间通信、基于System V进程间通信、基于Socket进程间通信和POSIX进程间通信。 UNIX进程间通信方式包括:管道、FIFO、信号。 System V进程间通信方式包括:System V消息队列、System V信号灯、System V共享内存、 POSIX进程间通信包括:posix消息队列、posix信号灯、posix共享内存。 现在linux使用的进程间通信方式: (1)管道(pipe)和有名管道(FIFO) (2)信号(signal) (3)消息队列 (4)共享内存 (5)信号量 (6)套接字(socket) 二、管道通信

Kmeans 的 CUDA 并行实现

寵の児 提交于 2019-12-04 01:28:14
1. Kmeans 步骤 常规的 Kmeans 步骤: 1. 初始化聚类中心 2. 迭代 1. 计算每个样本与聚类中心的欧式距离 2. 根据样本与聚类中心的欧式距离更新每个样本的类标签 3. 根据类标签更新聚类中心 本文中并行化的 Kmeans 的步骤: 初始化每个样本的类标签 迭代 统计每一类的样本和 统计每一类的样本个数 计算每一类的聚类中心:样本和 / 样本个数 计算每个样本与每个聚类中心的欧式距离 根据每个样本与聚类中心的欧式距离更新样本的类标签 如下所示: /* 样本聚类索引的初始化*/ KmeansCUDA_Init_ObjClusterIdx<<<>>>(); for ( int i = 0 ; i < maxKmeansIter; i++) { /* 统计每一类的样本和 */ KmeansCUDA_Update_Cluster<<<>>>(); /* 统计每一类的样本个数 */ KmeansCUDA_Count_objNumInCluster<<<>>>(); /* 聚类中心平均 = 样本和 / 样本个数 */ KmeansCUDA_Scale_Cluster<<<>>>(); /* 计算每个样本与每个聚类中心的欧式距离 */ KmeansCUDA_distOfObjAndCluster<<<>>>(); /* 根据每个样本与聚类中心的欧式距离更新样本的类标签 */

进程通信

耗尽温柔 提交于 2019-12-03 20:11:10
进程间通信 1.socket 2.共享内存 3.消息队列 什么是socket:   socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。 详情见: https://www.cnblogs.com/aaronLinux/p/7772027.html 什么是共享内存?   共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。 注:共享内存没有任何的同步与互斥机制,所以要使用信号量来实现对共享内存的存取的同步 。 详情见: https://www.cnblogs.com/wuyepeng/p/9748889.html 什么是消息队列 ? 详情见 : 来源: https://www.cnblogs.com/birdyw/p/11806245.html

Openresty 健康检查

允我心安 提交于 2019-12-03 17:08:05
## 指定共享内存 lua_shared_dict healthcheck 1m; ## 在worker初始化过程中,启动定时器,进行后端结点的检查 init_worker_by_lua_block { local hc = require "resty.upstream.healthcheck" local ok, err = hc.spawn_checker { -- shm 表示共享内存区的名称, shm = "healthcheck", -- type 表示健康检查的类型, HTTP or TCP (目前只支持http) type = "http", -- upstream 指定 upstream 配置的名称 upstream = "api.cargolist.xihuishou.bsdd.me", -- 如果是http类型,指定健康检查发送的请求的URL http_req = "GET /health.txt HTTP/1.0\r\nHost: api.cargolist.xihuishou.bsdd.me\r\n\r\n", -- 请求间隔时间,默认是 1 秒。最小值为 2毫秒 interval = 2000, -- 请求的超时时间。 默认值为:1000 毫秒 timeout = 5000, -- 失败多少次后,将节点标记为down。 默认值为 5 fall = 3,

进程和线程的对比和区别

天大地大妈咪最大 提交于 2019-12-03 04:31:37
一、什么是进程,什么是线程? 1.1 进程 进程中包括有多个线程,进程与进程之间是相对比较独立的。 进程中有一个 逻辑内存 ,每个进程都会有分配到一个独立的内存空间,还分配了一个文件/网络句柄, 句柄类似一个标识符,所有的进程所或多或少都有一定的句柄数的引用, 句柄实际上是一个指针,指向一块包含具体信息数据的内存, 所以句柄是当你要访问该进程时取得的,使用完必须释放。(打个比方,我要使用redis需要打开6379端口,这个时候需要访问句柄,获取到内存地址去访问获取对应的资源来执行该进程) 一个进程可以拥有多个句柄数目,但是只有一个进程ID 进程不同时刻所引用的句柄数目是不一定的 进程结构 1.2 线程 线程中有一个栈内存(很多人把它称为堆栈),主要用来存储局部变量资源或者内存地址 还有一个PC块,主要是存储下一条执行指令的地址,PC是指向一块共同的内存(进程里面的被系统分配到的逻辑内存)。 TCS : ThreadLocalStorage 主要存储线程自己定义的变量,不想和其他线程进行共享,理解为线程的私有变量。 线程共享进程的资源主要有: 进程代码块、进程的全局和静态变量、进程打开的文件描述符、信号的处理器、进程当前的目录、进程ID、进程组ID 。 二、进程和线程的区别 进程是程序资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的内存地址空间,线程包含在进程的地址空间中

共享内存

匿名 (未验证) 提交于 2019-12-03 00:29:01
共享内存的本质是让两个进程能够看到一块内存区域, 共享内存是最快的IPC形式 。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递 不再涉及到内核 ,也就是说,进程不再通过执行进入内核的系统调用来传递彼此的数据。 获取共享内存的方式和 消息队列 类似,下面来介绍一下。 shmget函数 :用来创建共享内存。 int shmget(key_t key, size_t size , int shmflg); //key共享内存段名字 //size共享内存的大小 //shmflg权限标志,与mode一样 //返回值:成功返回非负整数,失败返回-1 shmat函数 :将共享内存映射到进程地址空间 void *shmat( int shmid, const void * shmaddr, int shmflg); //shmid共享内存标识,shmget的返回值 //shmaddr指定连接的地址,一般为NULL,由操作系统自动加载 //shmflg读写权限,一般给0 //返回值:成功返回共享内存第一个地址,失败返回-1 shmdt函数 :将共享内存与进程脱离 int shmdt( const void * shmaddr); //shmaddr:由shmat返回的 地址 //返回值:成功返回0,失败返回-1 shmdt函数 :控制共享内存 int shmctl( int

IPC进程间通信(概念简介)

匿名 (未验证) 提交于 2019-12-03 00:22:01
进程间通信发展 Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的。而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间的通信方面的侧重点有所不同。前者是对UNIX早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。而Linux则把两者的优势都继承了下来。 进程间共享信息的三种方式 最左边的表示两个进程共享文件系统中某个文件的信息,为了访问其中的信息,必须通过内核。 中间的表示两个进程共享在内核中的某些信息,较为常见的有管道,消息队列,信号量。 最右边的表示在用户空间中有一个两个进程都能访问到的共享内存区,可不通过内核进行消息通讯,是速度最快的一种,其本质是对内核中的内存空间做了映射,映射到用户空间。 IPC对象的持续性 进程持续:一直存在直到打开的最后一个进程结束。(如pipe和FIFO)。 内核持续:一直存在直到内核自举或显式删除(如System V消息队列、共享内存、信号量)。 文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现)。 文章来源: IPC进程间通信(概念简介)

进程间通信----------共享内存

匿名 (未验证) 提交于 2019-12-03 00:22:01
共享内存就是借助同一块 物理内存 映射不同的虚拟地址空间,不同的虚拟地址空间代表着不同的进程,所以多个进程都能看到这一块内存,那么就可以同时对这块内存读写操作。 我们画张图感受一下: 共享内存是一块内存,它的数据结构中都有以下数据 shmget函数:用来创建共享内存 int shmget(key_t key,size_t size , int shmflg); //key共享内存段的名字 //size:共享内存大小(返回的大小等于size向上取整到4k的整数倍例如size=4097,那么返回的内存大小为8k即为两页) //shmflg:权限 //返回值:成功返回一个非负整数(内存标识码),失败返回-1; shmat函数:将共享内存连接到进程地址空间 void * shmat(int shmid,const void* shmaddr,int shmflg); //shmid:共享内存标识码 //shmaddr:连接的地址 //shmflg:有两个取值可能是SHM _RND和SHM_ RDONLY //返回值:成功返回一个指针,指向共享内存第一个字节,失败返回-1 ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ** 说明 1、shmaddr为NULL,内核自动选择一个地址 2

如何提高服务器并发处理能力

匿名 (未验证) 提交于 2019-12-03 00:22:01
什么是服务器并发处理能力 一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强 有什么方法衡量服务器并发处理能力 1. 吞吐率 吞吐率,单位时间里服务器处理的最大请求数,单位req/s 从服务器角度,实际并发用户数的可以理解为服务器当前维护的代表不同用户的文件描述符总数,也就是并发连接数。服务器一般会限制同时服务的最多用户数,比如apache的MaxClents参数。 这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望等待最少的时间,显然,双方不能满足,所以双方利益的平衡点,就是我们希望的最大并发用户数。 2. 压力测试 有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗?实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求,服务器的网卡接收缓冲区最多有100个等待处理的请求,显然这时的服务器压力更大。 压力测试前提考虑的条件 并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(HttpWatch) 总请求数 请求资源描述

VS C++ 共享内存 CreateFileMapping

匿名 (未验证) 提交于 2019-12-03 00:20: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>