共享内存

Golang: RobPike谈 并发Vs并行

≯℡__Kan透↙ 提交于 2019-12-01 21:55:30
很早的一个视频了, Rob Pike 演讲视频 《Concurrency Is Not Parallelism》。 Rob Pike 演讲 视频 : ‘Concurrency Is Not Parallelism’ — 一句话:并发更加复杂,更加优秀。(Go的并发可以利用多核&并行) Don’t communicate by shared memory. Instead, share memory by communicating. —— Rob Pike 很长的一段事件,我没有理解这句话。听了他的演讲,大致明白了: Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。 因为 go 底层帮你封装了这些细 大专栏 Golang: RobPike谈 并发Vs并行 节(十几个goroutines 可能对应4-5个线程,整体上是一个大的线程池),使得你可以不必在关心这些细节。(你要合作 & 竞争,那么直接通过 chan 通信即可,通信的过程中,自动使用了共享内存,锁等等这些等机制) Go语言层面上也简化并发编程了难度,goroutines封装了原来需要同步,协作等线程问题。 你可以不必再关心线程,只用关心任务执行体,或者相应的工作即可 (实际上这么说恐怕不准确,因为多核执行的时候也有可能存在震荡,需要绑定线程) 进一步的深入探究,可以参考我的这篇文章: 《Golang:

非阻塞算法

和自甴很熟 提交于 2019-12-01 20:37:44
原文地址 作者: Jakob Jenkov 译者:张坤 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法。在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的。 为了更好的理解阻塞算法和非阻塞算法之间的区别,我会先讲解阻塞算法然后再讲解非阻塞算法。 阻塞并发算法 一个阻塞并发算法一般分下面两步: 执行线程请求的操作 阻塞线程直到可以安全地执行操作 很多算法和并发数据结构都是阻塞的。例如, java.util.concurrent.BlockingQueue 的不同实现都是阻塞数据结构。如果一个线程要往一个阻塞队列中插入一个元素,队列中没有足够的空间,执行插入操作的线程就会阻塞直到队列中有了可以存放插入元素的空间。 下图演示了一个阻塞算法保证一个共享数据结构的行为: 非阻塞并发算法 一个非阻塞并发算法一般包含下面两步: 执行线程请求的操作 通知请求线程操作不能被执行 Java也包含几个非阻塞数据结构。 AtomicBoolean , AtomicInteger , AtomicLong , AtomicReference 都是非阻塞数据结构的例子。 下图演示了一个非阻塞算法保证一个共享数据结构的行为: 非阻塞算法 vs 阻塞算法 阻塞算法和非阻塞算法的主要不同在于上面两部分描述的它们的行为的第二步。换句话说

共享内存和消息队列原理详解

余生颓废 提交于 2019-12-01 16:06:33
操作系统内的并发执行进程可以是独立的也可以是协作的: 如果一个进程不能影响其他进程或受其他进程影响,那么该进程是独立的,换句话说,不与任何其他进程共享数据的进程是独立的; 如果一个进程能影响其他进程或受其他进程所影响,那么该进程是协作的。换句话说,与其他进程共享数据的进程为协作进程。 提供环境允许进程协作,具有许多理由: 信息共享:由于多个用户可能对同样的信息感兴趣(例如共享文件),所以应提供环境以允许并发访问这些信息。 计算加速:如果希望一个特定任务快速运行,那么应将它分成子任务,而每个子任务可以与其他子任务一起并行执行。注意,如果要实现这样的加速,那么计算机需要有多个处理核。 模块化:可能需要按模块化方式构造系统,即将系统功能分成独立的进程或线程。 方便:即使单个用户也可能同时执行许多任务。例如,用户可以并行地编辑、收听音乐、编译。 协作进程需要有一种 进程间通信机制(简称 IPC) ,以允许进程相互交换数据与信息。进程间通信有两种基本模型:共享内存和消息传递(消息队列): 共享内存模型会建立起一块供协作进程共享的内存区域,进程通过向此共享区域读出或写入数据来交换信息。 消息传递模型通过在协作进程间交换消息来实现通信。 图 1 给出了这两种模型的对比。 图 1 通信模型   上述两种模型在操作系统中都常见,而且许多系统也实现了这两种模型。消息传递对于交换较少数量的数据很有用

QNX手册学习笔记——IPC(4)

我只是一个虾纸丫 提交于 2019-11-30 10:57:08
读QNX_Neutrino_RTOS_System_Architecture的IPC的POSIX message queues和shared memory部分。 QNX不仅提供了前面介绍了进程或线程间的同步传输所采用的默认消息传送机制,也提供了非阻塞的队列消息传送机制。 相对于默认的传送数据地址的消息传送方式,什么情况下采用数据队列传送方式呢?队列消息传送方式,发送方不需要被阻塞。由于消息队列独立于进程,因此当各种进程超时操作多个带名字的对列时,采用消息队列传送的设计方式(我对此场景还是有疑惑)。注意,采用消息队列的传送方式由于有拷贝过程,速度更慢。 当进程之间需要传递大块数据时,可以选择共享内存的方式。此方式是带宽最大的消息传递方式。由于对共享内存的访问是异步的方式,因此多个进程需要采用信号同步的方式。对于颗粒度小的共享内存块,如果采用此种共享的方式,由于引入了信号同步机制,则将会使得传送带宽变小,得不偿失。Sermaphore通常用于不同进程之间的共享内存同步;而mutex则用于不同线程之间的共享内存同步。 共享内存可以与前面所讲的同步消息传送结合使用。二者结合使用的有点是,既利用了同步消息传送的同步机制,又用到了共享内存的不需要在消息传送过程中的数据拷贝的优势。值得注意的是共享内存的方式不能用于网络间不同的主机,而同步消息传送机制却可以。实际应用中

IPC 三种通信机制

我们两清 提交于 2019-11-30 10:56:44
最近看了,IPC三种通信机制,OK,小写自己的收获吧。 IPC三种通信机制是指:信号量、共享内存、消息队列,一开始看得时候感觉有点吃力,当我模仿书上的程序写了写代码之后,就慢慢的理解了。 信号量:通过操作系统中的PV操作来实现; 共享内存:申请一块内存,进程A往共享内存中写,其他的进程就可以通过读出共享内存中的内容来获取进程A所传送的信息; 消息队列:创建一个消息队列,进程A往队列里面写,那么进程B通过读队列中的容来获取进程A传送的信息。 具体的实现其实就是用三组函数来实现的,而且形式都是很有相似性的。 信号量: #include<sys/sem.h> int semget(key_t key,int num_sems,int sem_flgs); int semctl(int sem_id,int sem_num,int command...); int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops); 每个函数的功能和参数的意义在手册中都能找到。 1、semget 创建一个信号量或者获取一个已知信号量的键 key:不相关的进程可以通过他来访问同一个信号量 num_sems:需要的信号量数目。几乎总是1 sem_flags:一组标志,例如IPC_CREAT; 返回值是信号量标志符,给其他信号量函数使用 2

php Zend Opcache,xcache,eAccelerator缓存优化详解及对比

て烟熏妆下的殇ゞ 提交于 2019-11-30 10:38:28
XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接使用缓冲区已编译的代码从而提高速度. 通常能够提高您的页面生成速率 2 到5 倍, 降低服务器负载. XCache 是一个又快又稳定的 PHP opcode 缓存器. 经过良好的测试并在大流量/高负载的生产机器上稳定运行. 经过(在 linux 上)测试并支持所有现行 PHP 分支的最新发布版本, 如 PHP_4_3 PHP_4_4 PHP_5_0 PHP_5_1 PHP_5_2 HEAD(6.x), 并支持线程安全/Windows. 与同类 opcode 缓存器相比更胜一筹, 比如能够快速跟进 PHP 版本. XCache 工程由 mOo 领队, 他也是 Lighttpd 的开发成员之一. Lighttpd 是最快的 Web 服务器应用程序之一, 并且超越 Apache 以及许多其他 Web 服务器. XCache 努力达到类似的效果. XCache 的INI配置详解 载入 XCache 模块 引用 ;; 安装成 zend extension (推荐), 路径一般是 “$extension_dir/xcache.so” zend_extension = /usr/local/lib

【Android进阶】浅析Android Binder机制

北城余情 提交于 2019-11-30 10:32:32
在Android开发过程中,Binder的身影无处无处不在,我们编写的程序都使用过Binder机制(例如startActivity的执行过程)但是请问你知道什么是Binder么?在开发过程中你察觉到它的存在了么? 什么是Binder Biner翻译过来是“胶水“的意思,这个翻译分形象。Binder的主要工作就是淡化了进程边界,淡化了进程间通信的过程。要是想更好的理解Binder就必须从Linux进程谈起。 Linux进程 为了保护进程空间不被别的进程破坏或者干扰,Linux中的进程是相互独立的,也就是所谓的进程隔离。(而且一个进程的内存空间还被分为了用户空间和内核空间,二者也是相互隔离的。这里不做探讨)所以在Linux中,进程与进程之间是相互隔离的,而且进程中的用户和内核空间也是隔离的。 也就是说为了安全和独立,一个进程是不能直接操作或者访问另外一个进程的内存空间的。他们之间既然是隔离的,在需要通信、协作的时候就需要使用进程间通信技术(即IPC,也称跨进程通信),我们都知道Android框架是建立在Linux之上的,当然也会面对进程间通讯的问题。 为什么使用Binder 在Linux系统中为了达到进程间通讯的目的,我们可以选用诸如管道、Socket等技术手段,那么为什么Android选用了Binder这种新型的IPC技术,放弃了原有成熟的技术呢? 主要有如下两个方面: 1.

app性能

 ̄綄美尐妖づ 提交于 2019-11-30 08:39:33
性能获取办法 appium+webview context + execute script +perfmance api appium/selenium的ExecuteScript Api 注入js: return JSON.stringify(window.performance.timing) JSON.stringify(window.performance.getEntriesByName(document.querySelector("img").src[0],null,2) { "name": "https://testerhome.com/system/letter_avatars/2/A/226_95_81/64.png", "entryType": "resource", "startTime": 277.4149999895599, "duration": 0, "initiatorType": "img", "nextHopProtocol": "", "workerStart": 0, "redirectStart": 0, "redirectEnd": 0, "fetchStart": 277.4149999895599, "domainLookupStart": 277.4149999895599, "domainLookupEnd": 277

Linux进程间的通信方式

感情迁移 提交于 2019-11-30 06:58:19
管道 管道是Linux支持的最草的IPC(进程间通信)方式,可以分为有名管道和无名管道 无名管道 1. 管道是半双工,只能支持单向流动,两个进程需要建立两个通道来进行通信 2. 无名管道通过pipe()函数创建,只能用于父子进程或者兄弟进程之间 3. 一个进程向管道中写数据,加入到管道缓冲区的尾部,另一个进程读的时候从缓冲区的头部读取 有名管道 有名管道也是半双工,但是它允许任何两个进程之间的通信,有名管道提供一个路径名与之进行关联,以FIFO的方式存在于文件系统中 信号量 提到信号量,就能想到P/V操作,也就是wait()和sinal()操作。信号量是一种计数器,可以控制进程间多个线程或者多个进程之间对共享资源的访问,实现为一种锁的机制。 信号 操作系统可以根据信号的不同来进行不同的处理方式,采用默认的处理方式,即进程中断或退出 ,也可以采用另一种机制,即忽略该信号,另外的就是自定义处理函数,执行相应的操作 消息队列 消息队列是一种链表的形式,允许一个或这多个进程来写数据,一个或多个进程进行读数据, 共享内存 共享内存映射为一段可以被其他进程访问的内存。该内存被一个进程所创建,然后其他进程可以挂载到该共享内存中。,共享内存是最快的进程间通信方式,但是不支持并发控制,所以通常配合信号量机制实现进程间的通信 socket socket也是一种进程间的通信方式