共享内存

Android 属性property_get/property_set

老子叫甜甜 提交于 2019-11-28 22:27:35
每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在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。

Swoole进程模型

北城余情 提交于 2019-11-28 19:59:45
进程 什么是进程 进程 Process 是计算机中的程序关于某数据集合上的一次运行活动,是系统分配资源和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体。在当代面向线程设计的计算机结构中,进程是线程的容器。简单来说,程序是指令、数据以及其组织形式的描述,而进程则是程序的实体。 在操作系统中,进程表示正在运行的程序,例如在终端中使用PHP命令运行PHP脚本,此时就相当于创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间和系统资源,并且运行相应的程序。 $ php build.php <?php //获取当前进程的PID echo posix_getpid(); //修改所在进程的名称 swoole_set_process_name("swoole process master"); //模拟持续运行100秒的程序 sleep(100);//持续运行100秒的目的是为了在进程中可以查看而不至于很快结束 运行程序 $ php build.php 71 查看进程 $ ps aux | grep 71 root 1 0.0 0.1 18188 1712 pts/0 Ss+ 11:07 0:00 /bin/bash root 71 0.0 3.0 340468 30788 pts/2 S+ 13:41 0:00 swoole

进程间通信方式

99封情书 提交于 2019-11-28 16:19:01
进程间通信 Inter-Process Communication,IPC 1) 匿名管道 int pipe(int fd[2]); 产生一个管道,两端各自用一个文件描述符表示,其中读端的文件描述符保存在fd[0]中,写端的文件描述符保存在fd[1]中。 只能用于父子进程间通信。在两个进程中只保留个描述符,一个保留写,另一个保留读,反之亦然。 2) 命名管道 named pipe (mkfifo) int mkfifo(const char *pathname, mode_t mode); //按指定的权限去创建管道文件 打开是不应使用O_CREAT; 打开操作会等待同时存在读写双方时才继续; 可以用于任意进程间单向通信。 3) 匿名本地网络 socketpair(AF_LOCAL, SOCK_STREAN, 0, int fd[2]); //产生一对相互连接的网络套接字,可以用于两进程间相互通信 用于fork的父子进程中通信,每个进程中只保留个套接字就好,读写都用它。 4)专业的进程间通信方式: 共享内存、消息队列、信号量 共享内存: int shmget(key_t key, size_t size, int shmflg); //创建或获取一块共享内存对象,返回对象id,同一个可以返回同一个共享内存id, 当key是IPC_PRIVATE的时候例外,总是创建一片新的共享内存

如何查看共享内存?

不打扰是莪最后的温柔 提交于 2019-11-28 15:36:40
查看共享内存:ipcs -m 删除共享内存:ipcrm -m shmid 查看信号量:ipcs -s 删除信号量:ipcrm -s semid 查看消息队列:ipcs -q 删除消息队列:ipcrm -q queueid 来源: https://blog.csdn.net/qq_35210580/article/details/100079818

浅析Volatile关键字

跟風遠走 提交于 2019-11-28 12:56:48
浅析Volatile关键字 在java中线程并发中,线程之间通信方式分为两种:共享内存和消息传递。共享内存指的是多个线程之间共享内存的属性状态;消息传递指的是线程之间发送信息来通信。在介绍volatile,我们先了解一下共享内存一些基本概念。 JMM Java内存模型(简称JMM)控制线程通信,可以分为主内存和本地内存,每个线程拥有一个本地内存。 如图,一般主存只有一个,根据线程数不同,本地内存(又称工作内存)数目也不同,本地内存是抽象出来的概念,实际上不存在。 线程之间通过内存来同步状态可以分为以下几个步骤: 1、 线程1从主存获取变量x=1,假设此时其他线程x都为1 2、 线程1将本地内存中x值修改为2 3、 线程1将本地内存中x值放回主存 4、 其他线程同步主存数据 以上,就是理想状态线程之间通过主存通信状态,保证了内存的 可见性 。 指令重排序 java程序在运行时,并不会严格按照程序代码编写的顺序执行代码,会对其进行重排序。例如以下例子: 在程序执行代码的时候,步骤1和步骤2可能被重排序,导致2可能在1之前先执行,但是重排序的前提是 在单线程情况下不会改变运行结果, 因此1和2可以重排序,但是3引用了1和2中的变量,因此3不会被重排序到1或者2之前。在单线程情况下,重排序不会影响,但在多线程中会导致结果不可预见,可以使用其他方法来保证 有序性 。 原子性操作 前面提到了

python多任务编程---进程

和自甴很熟 提交于 2019-11-28 12:49:23
多任务编程 意义:充分利用计算机CPU的多和资源,同时处理多个应用程序任务,一次提高程序的运行效率. 实现方案:多进程,多线程 进程(process) 进程理论基础 定义:程序在计算机中的一次运行. 程序是一个可执行的文件,是静态的战友磁盘. 进程是一个动态的过程描述,占有计算机运行资源,有一定的生命周期 系统中如何产生一个进程 用户空间通过调用程序接口或者命令发起请求 操作系统接受用户请求,开始创建进程 操作系统调配计算机资源,确定进程状态等 操作系统将创建的进程提供给用户使用 进程基本概念 CPU时间片:如果一个进程占有CPU内核则称这个进程在cpu时间片上. PCB(进程控制块):在内存中开辟的一块空间,用于存放进程的基本信息,也用于系统查找识别进程 进程ID(PID):系统为每个进程分配的一个大于0的整数,作为进程ID.每个ID不重复     Linux查看进程ID:ps - aux 父子进程:系统中每一个进程(除了系统初始化进程)都有唯一的父进程,可以有0个或者多个子进程.父子进程关系便于进程管理     查看进程树: pstree 进程状态 三态 就绪态:进程具备执行条件,等待分配CPU资源 运行态:进程占有CPU时间片正在运行 等待态:进程暂时停止运行,让出CPU 五态(在三态基础上增加新建和终止) 新建: 创建一个进程,获取资源过程 终止:进程结束,释放资源过程

共享内存

一世执手 提交于 2019-11-28 08:11:00
我们知道,如果我们模块需要一块共享的内存,需要调用ngx_share_memory_add来创建共享内存,而该函数不会马上创建一个共享内存,它是先登记一下共享内存的信息,例如名称,大小,然后在进程初始化时再进行共享内存的创建和初始化. ngx_shared_memory_add这个函数是将共享内存的分配登记在哪里,在ngx_cycle_s这个结构体中有一个成员,即ngx_cycle_s->shared_memory,它是个list,用来保存所有登记的共享内存,这个list中保存的ngx_shm_zone_t类型的数据, ngx_shm_zone_t的结构体: struct ngx_shm_zone_s { // 这里可以指向自定义的一个数据结构,主要是为了在数据初始化的时候使用到,或通过共享内存直接拿到与共享内存相关的数据,它不一定指向共享内存中的地址 void *data; // 实际的共享内存 ngx_shm_t shm; // 共享内存的初始化函数 ngx_shm_zone_init_pt init; // 标记 void *tag; }; 研究一下ngx_shared_memory_add这个函数的实现,该函数先检查要添加的共享内存是否存在,如果存在,直接返回.如果不存在,创建一个新的. 1. 两个相同名字的共享内存大小要一样。 2. 两个相同名字的共享内存tag要一样。

共享内存

时光毁灭记忆、已成空白 提交于 2019-11-28 08:10:41
所有函数所需的头文件请用man手册查阅,这里都不写了 使用 共享内存步骤: ① 开辟一块共享内存shmget ② 允许本进程使用共某块共享内存shmat ③ 写入/读取 删除共享内存步骤 ①禁止本进程使用这块共享内存shmdt ②删除这块共享内存shmctl或者命令行下ipcrm 1、创建共享内存 任务描述: 使用shmget函数创建共享内存,并输出创建的shmid 判断创建的shmid是否成功,失败返回-1,成功打印共享内存的id号 相关知识:   共享内存函数由 shmget、shmat、shmdt、shmctl 四个函数组成。   ①shmget函数   作用:得到一个共享内存标识符或创建一个共享内存对象   原型:int shmget(key_t key, size_t size, int shmflg)      ②shamat函数   作用: 连接共享内存标识符为 shmid 的共享内存,连接成功后把共享内存区对象 映射到调用进程的地址空间,随后可像本地空间一样访问   原型:void *shmat(int shmid, const void *shmaddr, int shmflg)   ③shmdt函数   作用: 断开与共享内存附加点的地址,禁止本进程访 问此片共享内存   原型:int shmdt(const void *shmaddr)     

共享内存

亡梦爱人 提交于 2019-11-28 08:10:29
共享内存: 共享内存区域是被多个进程共享的一部分物理内存. 不同的进程可以通过共享内存通信,是进程间共享数据的一种最快的方法. 一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容 (比如你把你家的保险箱密码告诉我,那我们就可以通过保险箱共享money,你一放进去money,我就可以 立马收到你的money了!!!!) 实现: ->创建共享内存,使用shmget函数 ->映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数 当一个进程不再需要共享的内存段时,它将会把内存段从其地址空间中脱离,调用shmdt函数 Example: sharedMemory.c #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #define BUFSZ 2048 int main() { int shmid; char *shmadd; if((shmid=shmget(IPC_PRIVATE,BUFSZ,0666))<0) { perror("shmget"); exit(1); } else { printf("created shared-memory: %d\n",shmid);

共享内存

谁说我不能喝 提交于 2019-11-28 08:10:17
  共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。   采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。   默认情况下通过fork派生的子进程并不与父进程共享内存区。通过一个程序来验证,程序功能是让父子进程都给一个名为count的全局变量加1操作,程序如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include