共享内存

PyCuda学习三之--共享内存与Thread的同步

二次信任 提交于 2019-11-27 04:53:45
共享内存与Thread的同步 给出3072*3072大小的数组, 每一个元素都是整数, 现在要做的就是, 将每个元素的立方相加, 并求出最终的结果. 首先,我们先用PyCuda基础知识写出来一个可以运行的程序. import time import numpy as np import pycuda . autoinit import pycuda . driver as cuda from pycuda . compiler import SourceModule mod = SourceModule ( """ __global__ void sumOfSquares(int* num, int *result, size_t N) { int index = threadIdx.x + blockIdx.x * blockDim.x; int stride = blockDim.x * gridDim.x; int sum = 0; for (int i = index; i < N; i += stride) { sum += num[i]*num[i]*num[i]; } result[index] = sum; } """ ) def test ( N , np_seed ) : np . random . seed ( np_seed ) a = np .

进程间通信方式总结

一个人想着一个人 提交于 2019-11-27 03:53:33
如图片显示异常请前往掘金查看: https://juejin.im/post/5d515c7551882511ed7c273c 前言 进程间的通信方式,其实我们一直在用它,但是我们都不会去注意它。如果碰到面试官问你知道多少种进程间的通信方式,估计很多人都会有点懵。今天我们就来总结下进程间的通信方式有哪些。 管道 管道,英文为pipe。这是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期shell的发明人。他在发明了shell之后,发现系统操作执行命令的时候,经常有需求要将一个程序的输出交给另一个程序进行处理,也因此,管道应运而生了。 管道可以分为两类:匿名管道和命名管道。 常见的Linux命令 "|" 其实就是匿名管道,表示把一个进程的输出传输到另外一个进程,如: echo "Happyjava" | awk -F 'j' '{print $2}' # 输出 ava 另外,我们可以通过 mkfifo <pipename> 命令创建一个命名管道,如: mkfifo pipe 一个进程往管道输入数据,则会阻塞等待别的进程从管道读取数据: 如果我另外一个窗口没有执行 cat < pipe 命令,则左边的窗口(echo 'Happyjava' > pipe)会一直阻塞。 消息队列 注意,此消息队列不是我们常用的MQ

System V IPC 之共享内存

怎甘沉沦 提交于 2019-11-27 00:43:20
IPC 是 进程间通信(Interprocess Communication) 的缩写,通常指允许用户态进程执行系列操作的一组机制: 通过信号量与其他进程进行同步 向其他进程发送消息或者从其他进程接收消息 和其他进程共享一段内存区 System V IPC 最初是在一个名为 "Columbus Unix" 的开发版 Unix 变种中引入的,之后在 AT&T 的 System III 中采用。现在在大部分 Unix 系统 (包括 Linux) 中都可以找到。 IPC 资源包含 信号量 、 消息队列 和 共享内存 三种。IPC 的数据结构是在进程请求 IPC 资源时动态创建的。每个 IPC 资源都是持久的:除非被进程显式地释放,否则永远驻留在内存中(直到系统关闭)。IPC 资源可以由任一进程使用,包括那些不共享祖先进程所创建的资源的进程。 由于一个进程可能需要同类型的多个 IPC 资源,因此每个新资源都是使用一个 32 位的 IPC 关键字来标识的,这和系统的目录树中的文件路径名类似。每个 IPC 资源都有一个 32 位的 IPC 标识符,这与和打开文件相关的文件描述符有些类似。IPC 标识符由内核分配给 IPC 资源,在系统内部是唯一的,而 IPC 关键字可以由程序员自由地选择。 当两个或者更多的进程要通过一个 IPC 资源进行通信时,这些进程都要引用该资源的 IPC 标识符。

linux进程通信

廉价感情. 提交于 2019-11-26 20:10:00
linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。 管道 管道是单向、先进先出的无结构的字节流。用于父子进程之间的通信。关键系统调用如下: int pipe( int fd[2] );fd数组用于返回两个fd,分别表示通道的两端。 int main(){ int pid; int fd[2]; if(pipe(fd)<0){//父进程创建管道 perror("Fail to pipe"); exit(EXIT_FAILURE); } if((pid=fork())<0){ perror("Fail to fork"); exit(EXIT_FAILURE); }else if(pid == 0){ close(fd[1]);//表示管道的方向,fd[1]用于写 child_read_pipe(fd[0]);//子进程读取管道 }else{ close(fd[0]);//fd[0]用于读 father_write_pipe(fd[1]);//父进程写入管道 } } 有名管道 有名管道以设备文件的形式存在,可被任意知道名字的进程使用,而不止在只有亲缘关系的进程之间。 要使用有名管道,必须先建立它,并与他的一段相连,才能打开进行读写。当文件不再需要时,要显示删除。系统调用: int mknod(

linux命令

荒凉一梦 提交于 2019-11-26 14:58:16
linux文件流 标准输入 0 标准输出 1 标准错误 2 重定向 管道 (pipe): | 管道可以将一个命令的输出导向另一个命令的输入,从而让两个(或者更多命令)像流水线一样连续工作,不断地处理文本流。 进程管理 ps 查看 进程创建:kernel并不提供直接建立新进程的 系统调用 。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。所有进程的PPID父进程都是指向init进程。 pstree 显示init进程树 进程关系 进程组 每个进程都会属于一个进程组(process group),每个进程组中可以包含多个进程。进程组会有一个进程组领导进程 (process group leader),领导进程的PID ,成为进程组的ID (process group ID, PGID),以识别进程组。领导进程可以先终结。此时进程组依然存在,并持有相同的PGID,直到进程组中最后一个进程终结。 会话 在shell支持工作控制(job control)的前提下,多个进程组还可以构成一个会话 (session)。bash(Bourne-Again shell)支持工作控制,而sh(Bourne shell)并不支持。

学习笔记之共享内存

流过昼夜 提交于 2019-11-26 13:50:55
共享内存 共享内存是进程间通信方式中效率最高的一种,因为进程可以对内存进行直接读写,而没有复制等其他操作,共享内存在内核中被创建,用时映射在用户空间,在用户空间操作。由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用 一、函数接口 申请key值,除创建共享内存以外的进程需要通过key值来获得内存的ID值,当key值为IPC_PRIVATE(0)时,共享内存为私有,只有当前进程可以访问。 1、key_t ftok(const char *path, int proj_id); 成功时返回合法的key值,失败时返回EOF path 存在且可访问的文件的路径 proj_id 用于生成key的数字,不能为0 2、 创建或者打开一个共享内存 int shmget(key_t key, int size, int shmflg); 成功时返回共享内存的id,失败时返回EOF key 和共享内存关联的key,IPC_PRIVATE 或 ftok生成 shmflg 共享内存标志位 IPC_CREAT|0666 3、共享内存映射 void *shmat(int shmid, const void *shmaddr, int shmflg); 成功时返回映射后的地址,失败时返回(void *)-1 shmid 要映射的共享内存id shmaddr 映射后的地址, NULL表示由系统自动映射

Linux进程间通信

。_饼干妹妹 提交于 2019-11-25 23:16:49
进程通信的概念 进程数据空间是相互独立的,不能相互访问的。但某些情况下进程之间需要互相通信,来完成系统的某项功能或交换数据。 进程通信的场景 1 )数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 2 )共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 3 )通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如通知进程退出)。 5 )进程控制:有些进程希望控制另一个进程的运行。 进程通信的方式 进程通信的方式 1 )无名管道(pipe)及有名管道(named pipe): 无名管道可用于具有父进程和子进程之间的通信。有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 2 )信号(signal): 信号用于通知接受进程有某种事件发生。 3 )消息队列(message): 消息队列是消息的链接表,进程可以向队列中添加消息,其它的进程则可以读走队列中的消息。 4 )共享内存: 使得多个进程可以访问同一块内存空间。 5 )信号灯(semaphore): 也叫信号量,主要作为进程之间对共享资源加锁的手段。 6 )套接字(socket): 可用于不同机器之间的进程间通信。 1、应用经验 管道和消息队列: 太过时了,实在没什么应用价值