共享内存

linux共享内存

余生颓废 提交于 2021-01-05 10:03:46
本文使用system v api,利用共享内存实现了简单的IPC通信。 头文件svshm_xfr.h #include <stdio.h> #include <sys/shm.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #define SHM_KEY 0x1234 #define OBJ_PERMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) #define WRITE_SEM 0 #define READ_SEM 1 #ifndef BUF_SIZE #define BUF_SIZE 1024 #endif struct shmseg { int cnt; char buf[BUF_SIZE]; }; 写程序svshm_xfr_writer.c,从标准输入写入共享内存。 #include "svshm_xfr.h" int main(int argc, char **argv) { int shmid, bytes, xfrs; struct shmseg *shmp; shmid = shmget(SHM_KEY, sizeof(struct shmseg), IPC_CREAT | OBJ_PERMS); if (shmid == -1)

go goroutine

99封情书 提交于 2020-03-27 05:51:54
goroutine goroutine 是由 Go 运行时环境管理的轻量级线程。 go f(x, y, z) 开启一个新的 goroutine 执行 f(x, y, z) f , x , y 和 z 是当前 goroutine 中定义的,但是在新的 goroutine 中运行 `f`。 goroutine 在相同的地址空间中运行,因此访问共享内存必须进行同步。sync 提供了这种可能,不过在 Go 中并不经常用到,因为有其他的办法。(在接下来的内容中会涉及到。) 共享内存说的是 两个字符串 "world" "hello" 传入函数后 来源: https://www.cnblogs.com/songhuan999999/p/11195407.html

线程、进程间通信

我的梦境 提交于 2020-03-22 18:17:06
线程 在无线程的系统中,进程是: 存储器、外设等资源的分配单位 处理机调度的对象 在引入线程后: 线程 是 处理机调度 的对象 进程 作为 资源分配 单位 同一进程内可包含 多个线程 ,他们 共享进程的资源 线程的使用 引入线程的原因: 并行实体 共享同一个地址空间和所有可用数据 的能力 比进程更容易创建、撤销 性能的提高。如果存在着大量的计算和大量的IO处理,多线程允许这些活动 彼此重叠进行 ,加快应用程序执行的速度 多处理机系统,多线程可以真正地并行 例子:文字处理软件 如果程序只有一个线程,那么只要已启动磁盘备份,键盘和鼠标输入的命令都会不予理睬,知道备份结束,用户将感觉到程序反应迟钝 使用三个线程: 一个线程和用户交互 第二个线程在后台重新进行格式处理 第三个线程处理磁盘备份 例子:万维网服务器 Web服务器:接受用户请求,将所请求的页面发回给客户机 多线程实现: 一个线程(分配程序)从网络中读入工作请求,检查请求后,提交给一个工作线程(唤醒睡眠的工作线程) while (true) { get_next_request(&buf); handoff_work(&buf); } 工作线程负责调入页面(读高度缓存或磁盘) while (true) { wait_for_work(&buf); look_for_page_in_cache(&buf, &page); if

计算机操作系统基础知识-2

旧街凉风 提交于 2020-03-21 01:22:16
Shell Shell是操作系统与用户交互的界面。表现为通过控制台执行用户命令。本身不执行命令,仅仅是组织和管理命令。 脚本:类似程序的方式执行一系列的逻辑顺序的命令序列完成复杂的功能和人机交互。保存在文件中,是shell命令的集合。 系统调用 定义:操作系统内核为应用程序提供的服务/函数 特点: 一般涉及核心操作和硬件资源 运行于核态 函数具有唯一ID 产生中断,且为自愿中断 进程管理 定义:是程序在某个数据集合上的一次运行活动。程序的一次运行即为一个进程。 特性: 动态性 并发性 异步性 独立性 分类: 按使用资源权限 系统进程:系统内核相关进程 用户进程:运行于用户态的进程 按对CPU依赖性 偏CPU进程:计算型 偏I/O进程: 进程状态 就绪态:获得了除CPU之外所有资源,通常有多个进程处于就绪态,有一个就绪队列。 运行态:获得CPU,正在运行 等待态: 进程控制块 进程由程序、数据、进程控制块组成。 进程控制块是描述和管理进程的一种数据结构,包括以下内容: 进程描述信息 控制和调度信息 资源信息 现场信息 进程互斥和同步 同步:进程通过协作共同完成同一任务而造成的直接制约关系,如生产者-消费者模式 互斥:进程间竞争系统资源而造成的间接制约关系,同一时间内只有一个进程可以访问系统资源。 临界资源和临界区 临界资源:同一时间只能有一个进程访问的资源 临界区

分布式内存文件系统:Tachyon

↘锁芯ラ 提交于 2020-03-20 21:58:10
3 月,跳不动了?>>> Tachyon 是一个分布式内存文件系统,可以在集群里以访问内存的速度来访问存储在 Tachyon 里的文件。Tachyon是架构在最底层的分布式文件系统和上层的各种计算框架之间的一种中间件,其主要职责是将那些不需要落地到DFS里的文件,落地到分布式内存文件系统中,来达到共享内存,从而提高效率,减少内存冗余,减少GC时间等。 Tachyon架构 Tachyon的架构是传统的Master—Slave架构,这里和Hadoop类似,TachyonMaster里WorkflowManager是 Master进程,因为是为了防止单点问题,所以通过Zookeeper做了HA,可以部署多台Standby Master。Slave是由Worker Daemon和Ramdisk构成。Ramdisk使用off heap memory。Master和Worker直接的通讯协议是Thrift。 下图是Tachyon的架构 : Fault Tolerant Tachyon的容错机制是怎么样的呢? Tachyon使用lineage这个我们在Spark的RDD里已经很熟悉的概念,通过异步的向Tachyon的底层文件系统做Checkpoint。 当我们向Tachyon里面写入文件的时候,Tachyon会在后台异步的把这个文件给checkpoint到它的底层存储,比如HDFS,S3..

Linux进程间通讯(2)——共享内存

五迷三道 提交于 2020-03-17 01:52:03
共享内存 共享内存是进程间通讯最简单最快速的方式 访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其他需要切入内核的过程来完成。同时也避免了对数据的各种不必要的复制。 使用步骤: (1)首先要分配一块共享内存,使用shmget函数 函数定义: int shmget(key_t key,size_t size, int shmflg); 第一个参数——由程序提供一个key,为创建的共享内存段命名,shmget()函数成功时返回一 个与key相关的共享内存标识符,若调用失败则返回1。不相关的进程可以通过该函数的返回值访问 共享内存。 第二个参数——size是要建立共享内存的长度 第三个参数——shmflg是权限标志,比如IPC_CREAT和IPC_EXCL,它们的功能与open()中的O_CREAT和O_EXCL一样。通常情况下我们会使用0644|IPC_CREAT来作为shmflg的值。 (2)要访问这个共享内存块的每一个进程都必须将这个共享内存绑定到自己的地址空间中,我们使用shmat函数 函数定义: char *shmat(int sh_mid,char*shm_addr,int flag); 第一个参数——shmid是由shmget()函数返回的内存共享标识。 第二个参数——shmaddr指定共享内存连接到当前进程中的地址位置,通常为NULL

进程间通信(管道、共享内存、消息队列、信号量)

随声附和 提交于 2020-03-07 04:59:20
进程间通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间考到内核缓存区,进程2再内核缓存区把数据读走,内核提供这种机制称为进程间通信。通信方式有:管道、共享内存、消息对列、信号量等 管道 什么是管道呢? 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”, 管道的本质是内核中的一块缓冲区。 管道的特性 ① 半双工通信 :半双工通信(Half-duplex Communication)可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。在这种工作方式下,发送端可以转变为接收端;相应地,接收端也可以转变为发送端。但是在同一个时刻,信息只能在一个方向上传输。因此,也可以将半双工通信理解为一种切换方向的单工通信。 ②: 管道的生命周期随进程 ,进程关闭,对应的管道端口关闭,两个进程都关闭,则管道关闭。 ③: 管道自带同步与互斥 :管道为空时读取,read 阻塞;管道满时写入,write 阻塞。 ④: 管道提供字节流传输服务 管道的分类 ①:匿名管道 ②:命名管道 匿名管道 什么是匿名管道? 匿名管道之所以可以通信的本质在于,父进程frok子进程,父子进程各自拥有一个文件描述符表

Windows 建立共享内存 索引查找更新

半城伤御伤魂 提交于 2020-03-02 06:39:05
需求: 电力监控行业,常需要对一些仪表\仪器进行数据采集和远程控制,采集数据的方式常用串口、以太网,一般情况下使用MOBUS RTU TCP/IP。仪表、仪器数据内容不同。一般情况下都会使用组态软件来开发,但是对一些公司来说,没有必要使用一个大的平台,而且在价格方面也不低。而且不易控制。 分析: 把采集数据单独进程,设计成通用的数据采集,通过共享内存来实现进程间数据交互 设计: 共享内存 把每一种类型的仪表数据设计成一个结构体,然后每一个仪表,一个唯一标识,设定一个统一的规则生成唯一标识的方式。每一个唯一标识对应一个偏移长度,当需要读写内存里,可以通过唯一标识访问数据。 其实这样就实现一个简单内存关系数据库,在后台更新数据和网络这种比较耗时的操作做成一个通用模块,而又不影响人机交互界面的设计,这样子就相对独立。UI进程与后台数据采集进程共同使用唯一标识生成规则,则可以方便的读数据用于数据分析。 数据采集 对于数据采集,一般都是有采集命令,数据采集作为主站发送采集命令,仪表、仪器作为从站返回数据,很有典型的代表就是modbus协议,  后台数据采集 生成过程: 读取用户配置文件(得到仪表仪器)-->按规则排序-->生成采集命令队列,依次发送命令采集数据。其中有一些控制命令,如远程序操作仪表。就有了两种命令,一种采集命令,一种控制命令。控制命令是在用户使用时发生

6种Linux进程间的通信方式

淺唱寂寞╮ 提交于 2020-02-29 11:32:34
进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。 进程通信的概念 进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。 进程通信的应用场景 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通信的方式 1.管道 管道分为有名管道和无名管道 无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端

学习:Linux之共享存储

醉酒当歌 提交于 2020-02-29 11:17:06
涉及的书籍:《UNIX环境高级编程_第二版中文》、《操作系统精髓与设计原理第7章》 一、共享内存介绍 1.共享存储(共享内存)—》最快的IPC,共享存储是不属于任何一个进程的; 2.管道是通过文件描述符指向内存上的空间,消息队列是通过内核对象指向内存上的空间,无论是管道还是消息队列,涉及的进程都需要维护一份数据,这就涉及拷贝操作。 3.共享存储是通过指向内核空间中的内核对象所指向的内存空间实现的,这个共享空间叫做临界资源。(见图) 二、共享内存有关的函数 题:A进程读取用户数据,B进程将读取的数据全部转换为大写,然后输出 三、分类比较 四、操作系统的内存管理方案介绍----》参考书籍:《操作系统精髓与设计原理第7章》 来源: CSDN 作者: 飞流直下 链接: https://blog.csdn.net/weixin_44737923/article/details/102719160