共享内存

Python Window下共享内存读写

人走茶凉 提交于 2020-02-17 13:09:21
# 导入win32的包 import win32event as w32e import mmapfile as mmf # 创建共享内存 fileMemory = mmf . mmapfile ( None , 'ai_and_imghandle_shareMem' , 1024 * 1024 * 2 ) # 创建读事件 hReadEvent 和 写时间 hWriteEvent:创建时判断系统是否已经有该事件 hReadEvent , hWriteEvent = None , None try : hReadEvent = w32e . OpenEvent ( w32e . EVENT_ALL_ACCESS , 0 , "Global\\readEventHandle" ) hWriteEvent = w32e . OpenEvent ( w32e . EVENT_ALL_ACCESS , 0 , "Global\\writeEventHandle" ) except Exception as e : print ( 'Excep: ' , e ) hReadEvent = w32e . CreateEvent ( None , 0 , 0 , "Global\\readEventHandle" ) hWriteEvent = w32e . CreateEvent ( None

共享内存实现父子进程通信

拟墨画扇 提交于 2020-02-15 06:33:50
父进程在内核空间创建了一个共享内存,通过fork函数,父子进程通过fork函数继承了shmid,所以父子进程可以对内核中同一个对象操作,刚开始父进程不断往对象里写,然后开始发信号SIGUSR1给子进程,让子进程读。对于子进程来说,刚开始睡眠,等待父进程写,然后被内核唤醒,读共享内存。此时父进程开始睡眠,当子进程读完后,将父进程唤醒,父进程唤醒后继续写……一直循环(父子进程都通过shmat映射到自己的空间) 代码开始执行时,因为父进程要等待从键盘接收信号,所以父子进程都是S+在后台睡眠状态 # include "stdio.h" # include "sys/types.h" # include "sys/shm.h" # include "signal.h" # include "unistd.h" # include "stdlib.h" # include "string.h" void myfun ( int signum ) { return ; } int main ( int argc , char * argv [ ] ) //从命令行输入3个参数,ipcrm -m pid号 { int shmid ; int key ; char * p ; int pid ; shmid = shmget ( IPC_PRIVATE , 128 , IPC_CREAT |

进程间的通信方式及线程间的通信方式

随声附和 提交于 2020-02-15 00:38:48
进程间的通信方式及线程间的通信方式 0X00 进程间的通信方式 0X01 总述 每个进程都有自己的地址空间,因此从资源占用上来看,不同进程是相互独立的,也就是存在着明显边界的。因此相比于线程,通信比较困难一点。现在比较常用的方式有: 管道 、 消息队列 、 信号量 、 信号 、 共享内存 、 套接字 0X02 管道 管道主要包括 无名管道 和 命名管道 管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信 普通管道PIPE 1、它是 半双工 的(即数据只能在一个方向上流动),具有固定的读端和写端 2、它只能用于 具有亲缘关系 的进程之间的通信(也是父子进程或者兄弟进程之间) 3、它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只 存在于内存 中。 命名管道FIFO 1)FIFO可以在无关的进程之间交换数据 2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。 0X03 消息队列 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列 克服了信号传递信息少 、 管道只能承载无格式字节流 以及 缓冲区大小受限 等缺点。 特点: 1)消息队列是 面向记录 的,其中的消息具有特定的格式以及特定的优先级。 2

[GO]channel实现同步

倖福魔咒の 提交于 2020-02-14 19:41:56
goroutine运行在相同的地址空间,因此访问共享内存必须 做好同步。goroutine奉行通过通信来共享内存,而不是共享内存通信 它跟map一样,使用make来创建,它是一个引用 ,而不是值传递 make(chan Type, capacity) channel <- value //发送value到channel <- channel  //接收并将其丢弃 x := <-channel //从channel中接收数据,并赋值给x x, ok := <-channel //功能同上,同时检查通道是否已关闭或者是否为空 package main import ( "fmt" //"time" ) var ch = make(chan int) func Printer(s string) { for _, data := range s { //fmt.Println(string(data)) fmt.Printf("%c", data) //time.Sleep(time.Second) } } //person1执行完成后才能到person2执行 func person1() { Printer("hello") ch <- 666//给管道定数据,发送,放在了打印的后面 } func person2() { <- ch //从管道取数据,接收 ,如果通道没有数据他就会阻塞

system V信号量和Posix信号量

五迷三道 提交于 2020-02-12 23:20:43
一、函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量。它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线。例如,应该是semget()而不是sem_get()。然而,所有的的POSIX信号量函数都有一个下划线。下面列出了它们提供的所有函数清单: Systm V POSIX semctl() sem_getvalue() semget() sem_post() semop() sem_timedwait() sem_trywait() sem_wait() sem_destroy() sem_init() sem_close() sem_open() sem_unlink() 二、使用上的区别 1、XSI system V的信号量是信号量集,可以包括多个信号灯(有个数组),每个操作可以同时操作多个信号灯 posix是单个信号灯,POSIX有名信号灯支持进程间通信,无名信号灯放在共享内存中时可以用于进程间通信。 2、POSIX信号量在有些平台并没有被实现,比如:SUSE8,而SYSTEM V大多数LINUX/UNIX都已经实现。两者都可以用于进程和线程间通信。但一般来说,system v信号量用于 进程间同步、有名信号灯既可用于线程间的同步,又可以用于进程间的同步、posix无名用于同一个进程的不同线程间

[nginx] nginx源码分析--健康检查模块

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-07 21:08:03
健康检查模块 见前文: [nginx] nginx源码分析--健康检查模块 其中有一张框架图, 接下来的内容,将会利用到这个图中的内容。 [classic_tong @ https:////www.cnblogs.com/hugetong/p/12274125.html ] 描述 我们知道nginx是多进程的,每个进程都保存了相同的配置。但是实际上, 并不需要每一个进程对每一个后端服务器进行。 于是健康检查模块在这里需要一个进程间同步机制,用来协商哪一个进程对 哪一个后端服务器进行检查。 接下来,我们将描述这个机制。 分析 该模块采用了owner的概念。在nginx的全局,对每一个后端服务器抽象了一个 “后端服务器检测”的实体,该实体有一个owner属性。该属性的写操作有一个用来 保护临界区的互斥锁。 健康检测是一次次的,所有进程都是设置了timer来激活对每一个后端服务器的健康 检查。timer时间达到后,所有进程会同时来抢锁,抢到锁的进程变得到了对该实体 的本次健康检查权限。随后将自己的PID信息写入owner内。 该实体的数据结构和它的owner放置在共享内存中,由所有进程共享。 数据结构 该锁的数据结构如下: typedef struct { ngx_shmtx_t mutex; ngx_atomic_t lock; ... ... ngx_pid_t owner; ...

Linux-0.11操作系统实验6-地址映射与共享

最后都变了- 提交于 2020-02-07 02:37:35
实验环境: 地址映射与共享 实验理论: Linux-0.11操作系统实验6理论-地址映射与共享 实验任务: 用 Bochs 调试工具跟踪 Linux 0.11 的地址翻译(地址映射)过程,了解 IA-32 和 Linux 0.11 的内存管理机制; 在 Ubuntu 上编写多进程的生产者—消费者程序,用共享内存做缓冲区; 在信号量实验的基础上,为 Linux 0.11 增加共享内存功能,并将生产者—消费者程序移植到 Linux 0.11。 跟踪地址翻译过程 这节实验的目的是用 Bochs 的调试功能获取变量的虚拟地址映射的物理地址。实验过程跟着实验楼的描述进行即可。此处简单记录需要注意的几点: 根据实验中变量 i 保存在 ds:0x3004 这个地址,通过查询6.3段表,注意要使用自己本机实验环境的LDT表的物理地址: 实验楼中数据: “0x a2d0 0068 0x000082 fa ” 将其中的加粗数字组合为“0x00faa2d0”,这就是 LDT 表的物理地址 本机实验环境数据: 得到线性地址为 0x10003004 后,接下来通过页表将线性地址映射到物理地址,注意要使用自己本机实验环境的页框号,得到变量i的物理地址: 实验楼中数据: 线性地址 0x10003004 对应的物理页框号为 0x00fa7,和页内偏移 0x004 接到一起,得到 0x00fa7004,这就是变量

Python实现共享内存通信方式

佐手、 提交于 2020-02-06 14:49:51
创建共享内存python文件: import mmap import contextlib import time with contextlib.closing(mmap.mmap(-1, 100, tagname='SASU', access=mmap.ACCESS_WRITE)) as m: for i in range(1, 10001): m.seek(0) m.write(str(i).encode()) m.flush() time.sleep(1) 读取共享内存python文件: import mmap import contextlib import time while True: with contextlib.closing(mmap.mmap(-1, 100, tagname="SASU", access=mmap.ACCESS_READ)) as m: m.tell() s = m.read() print(s) 通过创建运行以上两个文件,可以简单实现共享内存通信。并且相同环境下,还可以与C#进行共享内存通信。测试可行。 来源: https://www.cnblogs.com/ming-4/p/12268359.html

C语言 NOTE32

邮差的信 提交于 2020-02-06 00:39:33
系统编程之共享内存 1.创建键值: 头文件: #include <sys/types.h> #include <sys/ipc.h> 函数原型: key_t ftok ( const char * pathname , int proj_id ) ; 参数分析: pathname ---->一般设为当前文件路径"."。 proj_id ---->编号,主要是为了区分不同的键值。 两个进程只要是使用相同的键,那么他们就指向同一个通信模块 使用ipcs -m 查看系统的共享内存: 2.创建共享内存shmid 功能 获取共享内存的 ID 头文件 #include <sys/ipc.h> #include <sys/shm.h> 函数原型 int shmget ( key_t key , size_t size , int shmflg ) ; 参数 分析 key 共享内存的键值 size 共享内存的尺寸(PAGE_SIZE 的整数倍) shmflg 标志位如下 IPC_CREAT 如果 key 对应的共享内存不存在,则创建之 IPC_EXCL 如果该 key 对应的共享内存已存在,则报错 SHM_HUGETLB 使用“大页面”来分配共享内存 SHM_NORESERVE 不在交换分区中为这块共享内存保留空间 mode 共享内存的访问权限(八进制,如 0644) 返回值 成功 该共享内存的

线程

北城以北 提交于 2020-02-05 19:34:50
1.线程介绍 1.什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 2. 有了进程为什么要有线程   进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 3.进程和线程的关系 线程与进程的区别可以归纳为以下4点 地址空间和其他资源:进程间相互独立,统一进程的歌线程间共享,某进程内的线程在其他进程不可见。 通信:进程间通信IPC,线程间可以直接读写进程进程数据段(如全局变量)来进行通信,需要进程同步和互斥手段的辅助,以保住数据的一致性。 调度和切换:线程上下文切换比进程上下文切换要快的多。 在多线程操作系统中,进程不是一个可执行的实体。  4.线程的特点