共享内存

android共享内存

限于喜欢 提交于 2019-11-28 08:10:03
在android下不能通过shm_open使用共享内存。 网上有好多关于android下使用Ashmem实现共享内存的,但经过尝试该方法可以mmap出内存,但是和另一个进程没有实现共享。 具体的使用方法: 1)fd = open("/dev/ashmem", O_RDWR); 2)ioctl(fd, ASHMEM_SET_NAME, region_name); 3) ioctl(fd, ASHMEM_SET_SIZE, region_size); 4) ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 上面方法没有实现两个进程间的内存共享。 使用以下方式实现了进程间的数据共享。 1>直接使用open("filename", O_RDWR|O_CREAT); 通过文件实现数据共享。 2>ParcelFileDescriptor和Ashmem结合使用。fd = open("/dev/ashmem", O_RDWR)创建出来的fd转化成ParcelFileDescriptor通过aidl传到另一进程。另个进程可以直接使用。 来源: http://www.cnblogs.com/Neu400753645/p/5541440.html

并发模型与IO模型梳理

坚强是说给别人听的谎言 提交于 2019-11-27 19:02:16
并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见。由于go语言的兴起,CSP模型也越来越受关注。基于锁的共享内存模型与后两者的主要区别在于,到底是通过共享内存来通信,还是通过通信来实现访问共享内存。由于actor模型和CSP模型,本人并不是特别了解,我主要说说最基本的并发模型,基于线程与锁的内存共享模型。 为什么要并发,本质都是为了充分利用多核CPU资源,提高性能。但并发又不能乱,为了保证正确性,需要通过共享内存来协调并发,确保程序正确运转。无论是多进程并发,还是多线程并发,要么通过线程间互斥同步(spinlock,rwlock,mutex,condition,信号量),要么通过进程间通信(共享内存,管道,信号量,套接字),本质都是为了协同。多线程和多进程本质类似,尤其是linux环境下的pthread库,本质是用轻量级进程实现线程。下面以网络服务为例,简单讨论下多线程模型的演进。 最简单的模型是单进程单线程模型,来一个请求处理一个请求,这样效率很低,也无法充分利用系统资源。那么可以简单的引入多线程,其中抽出一个线程监听,每来一个请求就创建一个工作线程服务,多个请求多个线程,这就是多线程并发模型。这种模式下,资源利用率是上去了,但是却有很多浪费,线程数与请求数成正比,意味着频繁的创建/销毁线程开销

python多任务编程---进程

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

说一说JMM(java内存模型)是什么

空扰寡人 提交于 2019-11-27 14:56:45
java内存模型 面试中,经常会被问到什么是java内存模型,有的人就会回答成JVM内存模型,这样是错误的,在面试中只要弄清楚问的是JMM还是JVM就好了。 什么是内存模型: Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。 Java内存模型的相关知识在 JSR-133: Java Memory Model and Thread Specification 中描述的。JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能得到一致效果的机制及规范。目的是解决由于多线程通过共享内存进行通信时,存在的原子性、可见性(缓存一致性)以及有序性问题。 那么,我们这里就先来说说什么是所谓的内存模型规范、这里提到的原子性、可见性以及有序性又是什么东西? 原子性 线程是CPU调度的基本单位。CPU有时间片的概念,会根据不同的调度算法进行线程调度。所以在多线程场景下,就会发生原子性问题。因为线程在执行一个读改写操作时,在执行完读改之后,时间片耗完,就会被要求放弃CPU

Linux 内存Cache和Buffer理解

谁说胖子不能爱 提交于 2019-11-27 13:14:06
在 Linux 系统中,我们经常用 free 命令来查看系统内存的使用状态。在一个 RHEL6 的系统上,free 命令的显示内容大概是这样一个状态: [root@tencent64 ~]# free total used free shared buffers cached Mem: 132256952 72571772 59685180 0 1762632 53034704 -/+ buffers/cache: 17774436 114482516 Swap: 2101192 508 2100684 这里的默认显示单位是 kb,我的服务器是 128G 内存,所以数字显得比较大。这个命令几乎是每一个使用过 Linux 的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少)。一般情况下,对此命令输出的理解可以分这几个层次: 不了解。 这样的人的第一反应是:天啊,内存用了好多,70个多 G,可是我几乎没有运行什么大程序啊?为什么会这样? Linux 好占内存! 自以为很了解。 这样的人一般评估过会说:嗯,根据我专业的眼光看的出来,内存才用了 17G 左右,还有很多剩余内存可用。buffers/cache 占用的较多,说明系统中有进程曾经读写过文件,但是不要紧,这部分内存是当空闲来用的。 真的很了解。 这种人的反应反而让人感觉最不懂 Linux,他们的反应是:free

CRIU介绍

狂风中的少年 提交于 2019-11-27 13:06:48
CRIU介绍 CRIU(Checkpoint/Restore In Userspace)运行在linux操作系统上的一个软件工具,其功能是在用户空间实现Checkpoint/Restore功能。使用这个工具,你可以冻结一个正在运行的程序,并且checkpoint它到一系列的文件,然后你就可以使用这些文件在任何主机重新恢复这个程序到被冻结的那个点。 Checkpoint/Restore介绍 checkpoint程序严重依赖**/proc**文件系统,它从/proc收集的信息包括: 文件描述信息(通过**/proc/ p i d / f d ∗ ∗ 和 ∗ ∗ / p r o c / pid/fd** 和 **/proc/ p i d / f d ∗ ∗ 和 ∗ ∗ / p r o c / pid/fdinfo**) 管道参数信息 内存表(通过**/proc/ p i d / m a p s ∗ ∗ 和 ∗ ∗ / p r o c / pid/maps** 和 **/proc/ p i d / m a p s ∗ ∗ 和 ∗ ∗ / p r o c / pid/map_files/**) 监控进程做的checkpoint由如下步骤组成: 1、收集并且冻结被监控程序的进程树 监控程序使用被监控程序的主进程 pid 遍历**/proc/%pid/task/ 路径收集线程tid,并且递归遍历

Oracle SQL的优化规则解析

被刻印的时光 ゝ 提交于 2019-11-27 13:00:40
以下的文章主要介绍的是Oracle SQL的优化规则的推荐方案,如果你是 Oracle SQL的优化规则实际应用方面的新手,你就可以通过以下的文章对Oracle SQL的优化规则的推荐方案的实际操作有个更好的了解,介绍以下就是文章的详细内容的介绍。 用其它相同功能的操作运算代替,如: 1)a is not null 改为 a>0 或a>’’等。 2)不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。 3) 建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使性能下降,多人更新操作会增加数据块锁的现象) 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用 对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。 Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。 对数据类型不同的列进行比较时,会使索引失效。 > 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行Oracle SQL优化,如一个表有100万记录,一个数值型字段A, 30万记录的A=0,30万记录的A=1

进程、线程以及IPC---linux

牧云@^-^@ 提交于 2019-11-27 07:08:05
进程(标识pid) <unistd.h> <sys/types.h> 资源集合:内存 文件 时间片 协处理器 完全复制:复制前执行什么,复制后执行什么 fork() 系统调用函数fork()是创建一个新进程的唯一方式 一次复制一个进程 返回值-1,创建失败; 返回值 0,进入子进程; 一般来说,fork()成功之后,父进程与子进程的执行顺序是不确定的。这取决于内核所使用的调度算法,如果要求父子进程相互同步,则要求某种形式的进程间通信。 vfork() 执行次序: fork():对父子进程的调度室由调度器决定的; vfork():是先调用子进程,等子进程的exit(1)被调用后,再调用父进程; 对数据段的影响: fork():父子进程不共享一段地址空间,修改子进程,父进程的内容并不会受影响。 vfork():在子进程调用exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。即共享代码区和数据区,且地址和内容都是一样的。 IPC机制(6种) 管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal): 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身

Go 语言初级教程之八[并发]

拟墨画扇 提交于 2019-11-27 06:10:59
并发 Go的作者选择了消息传递模型来作为推荐的并发编程方法。该语言同样支持共享内存,然后作者自有道理: 不要通过共享内存来通信,相反,通过通信来共享内存。 该语言提供了两个基本的构件来支持这一范型:goroutines和channels。 Go例程 Goroutine是轻量级的并行程序执行路径,与线程,coroutine或者进程类似。然而,它们彼此相当不同,因此Go作者决定给它一个新的名字并 放弃其它术语可能隐含的意义。 创建一个goroutine来运行名为DoThis的函数十分简单: go DoThis() // but do not wait for it to complete 匿名的函数可以这样使用: go func() { for { /* do something forever */ } }() // Note that the function must be invoked 这些goroutine将会通过Go运行时而映射到适当的操作系统原语(比如,POSIX线程)。 通道类型 有了goroutine,代码的并行执行就容易了。然而,它们之间仍然需要通讯机制。Channel提供一个FIFO通信队列刚好能达到这一目的。 以下是使用channel的语法: /* Creating a channel uses make(), not new - it was also

Linux内核调优参数

安稳与你 提交于 2019-11-27 05:16:47
Linux内核调优参数 #接收套接字缓冲区大小的默认值(以字节为单位)。 net.core.rmem_default = 262144 #接收套接字缓冲区大小的最大值(以字节为单位)。 net.core.rmem_max = 16777216 #发送套接字缓冲区大小的默认值(以字节为单位)。 net.core.wmem_default = 262144 #发送套接字缓冲区大小的最大值(以字节为单位)。 net.core.wmem_max = 16777216 #用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。 net.core.somaxconn = 262144 #当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。 net.core.netdev_max_backlog = 262144 #表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击。此值不能太小。 net.ipv4.tcp_max_orphans = 262144 #表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数。 net