共享内存

进程与线程

核能气质少年 提交于 2020-01-10 13:26:26
文章目录 进程与线程 进程通信 无名管道: 命名管道:FIFO 消息队列: 信号量: 共享内存: Socket通信: 线程之间的同步 互斥锁:互斥锁就是一种锁机制 条件变量 读写锁 自旋锁 信号量 总结: 进程与线程 概念:什么是线程:是操作系统能够进行运算调度的最小单位。什么是进程:是计算机中某一次数据集合的运行活动,是操作系统分配资源的最小单位。线程依赖于进程,进程就是线程的容器。 上面的描述比较官方,我的理解就是:想要通过计算机来完成某件事件那么你就得有一个进程来帮助你完成这个任务,也就是说,进程等价于利用计算机完成任务的一种手段,操作系统会为进程去分配各种资源,内存什么的,那么线程就是把进程分配成一个个小任务去执行,也就是说是进程执行的最小单位。 两个问题: 进程就是一个个跑在操作系统上的程序,那么如果想让两个进程或者多个进程之间通信怎么办? 线程是进程运行的最小单位,那么如果两个线程用到了同一个资源,怎么进行同步,否则这个资源的使用就乱套了 也就是说:进程要解决通信问题,否则就是单击小程序,线程要解决同步问题,也就是资源共享在线程中的问题。 进程通信 在Linux中进程通信有六种基本的方式: 无名管道: 是一种不属于任何文件系统的特殊文件,可以使用read和write 原型 #include <unistd.h>2 int pipe(int fd[2]); // 返回值

sql查询10则小技巧

亡梦爱人 提交于 2020-01-09 16:52:40
1.不要使用in操作符,这样数据库会进行全表扫描, 推荐方案:在业务密集的SQL当中尽量不采用IN操作符 2.not in 使用not in也不会走索引 推荐方案:用not exists或者(外联结+判断为空)来代替 3<> 操作符(不等于) 使用<>同样不会使用索引,因此对它的处理只会产生全表扫描 推荐方案:用其它相同功能的操作运算代替,如 a<>0 改为 a>0 or a<0 a<>’’ 改为 a>’’ 4.IS NULL 或IS NOT NULL操作(判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。 推荐方案:用其它相同功能的操作运算代替,如 a is not null 改为 a>0 或a>’’等。 5.> 及 < 操作符(大于或小于操作符) 大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的 情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。 那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时 ORACLE则直接找到=3的记录索引。 6.LIKE操作符 LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询

线程同步机制的区别与比较及进程通信方法

非 Y 不嫁゛ 提交于 2020-01-07 12:59:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有关多线程的一些技术问题: 1、 何时使用多线程? 2、 线程如何同步? 3、 线程之间如何通讯? 4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域: 1、 offloading time-consuming task。由辅助线程来执行耗时计算,而使GUI有更好的反应。我想这应该是我们考虑使用线程最多的一种情况吧。 2、 Scalability。服务器软件最常考虑的问题,在程序中产生多个线程,每个线程做一份小的工作,使每个CPU都忙碌,使CPU(一般是多个)有最佳的使用率,达到负载的均衡,这比较复杂,我想以后再讨论这个问题。 3、 Fair-share resource allocation。当你向一个负荷沉重的服务器发出请求,多少时间才能获得服务。一个服务器不能同时为太多的请求服务,必须有一个请求的最大个数,而且有时候对某些请求要优先处理,这是线程优先级干的活了。 4、 Simulations。线程用于仿真测试。 我把主要的目光放在第一个领域,因为它正是我想要的。第二和第三个领域比较有意思,但是目前不在我的研究时间表中。 线程的同步机制: 1、 Event 用事件(Event

[更新中] 进程和线程

眉间皱痕 提交于 2020-01-04 04:49:15
   书籍的简称:   CSPPSE: Computer System: a programmer's perspective Second Edition    进程(process) 是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程, 而每个进程都好像在独占的使用硬件。 而并发运行, 则是说一个进程的指令和另一个进程的指令是交错运行的 。 在大多数系统中, 需要运行的进程数是多于可运行他们的CPU个数的。传统系统在一个时刻只能执行一个程序, 而先进的多核处理器同时能执行多个程序。 无论是在单核还是多核系统中, 一个CPU看上去都像是在并发地执行多个程序, 这是他 通过处理器在进程间切换来实现的 。 操作系统实现这种交错执行的机制成为 上下文切换 。(CSPPSE P11)   独立(independent)进程, 一个进程如果不影响其他正在系统中运行的进程也不受其影响, 那么这个进程就是独立进程 。 任何进程只要不与其他进程共享数据, 它就是独立进程 。   合作(cooperating)进程, 一个进程如果影响其他正在系统中运行的进程或受其影响, 那么这个进程就是合作进程 。 任何进程只要与其他进程共享数据, 它就是合作进程 。   进程间通信IPC(Interprocess Communication)有两种模型: 共享内存(Shared

操作系统之进程/线程通信

家住魔仙堡 提交于 2020-01-03 03:26:38
进程适用于多核、多机(socket)分布;线程适用于多核。 一、进程间通信 1、管道 1.1 半双工管道PIPE 1)半双工,数据只能在一个方向流动,具有固定的读端和写端 2)只能用于父子进程或者兄弟进程 3)不属于任何文件系统,只存在于内存中 1.2 命名管道FIFO 1)FIFO可以在无关的进程之间交换数据 2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中 2、系统IPC 2.1 消息队列 消息队列是消息的链接表,存放在内核中。特点: 1)消息队列是面向于记录的,其中的消息具有特定的格式以及特定的优先级 2)消息队列独立于发送和接收进程。进程终止时,消息队列及其内容并不会被删除 3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。 2.2 信号量semaphore 它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。特点: 1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。 2)信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。 3)每次对信号量的PV操作不仅限于对信号量的加1减1,可以加减任意正整数。 4)支持信号量组 2.3 信号signal 信号是比较复杂的通信方式,用于通知接收进程某个时间已经发生。 2.4

Linux进程间通信

一曲冷凌霜 提交于 2020-01-01 16:10:02
写在前面 为什么 要进行进程间通信? 因为进程间具有独立性(每一个进程都有自己的虚拟地址空间,进程A并不知道进程B的虚拟地址空间中的内容),因此导致了进程之间协作的问题 进程间通信的 目的 : 数据传输:一个进程需要将它的数据发送给另一个进程 数据共享:多个进程间需要共享同样的数据、资源 进程控制:一个进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变 进程间通信 分类 : 管道 System V IPC POSIX IPC 网络 是当前最大的进程间通信 本篇文章中只针对管道及System V中的共享内存、消息队列和信号量进行解释 管道 概念: 我们把从一个进程连接到另一个进程的一个数据流称为一个管道 管道是Unix中最古老的进程间通信的形式。它本质是一个内核中的内存,也可以将这块内存称为缓冲区,当其中的数据被读走后,管道就为空 管道是半双工的,即数据只能由一个流向 匿名管道 # include <unistd.h> int pipe(int fd[2]); 功能:创建一个匿名管道 参数:fd[]:文件描述符数组,fd[0]表示读端,fd[1]表示写端,使用这一对文件描述符访问内存 返回值:成功返回0,失败返回-1 【注】: 1、pipe()函数的参数是 输出型参数 ,也就是意味着需要传入一个int类型数组,数组大小为2

Python多进程multiprocessing(二)

被刻印的时光 ゝ 提交于 2019-12-31 17:06:17
紧接上文 在上文 Python多进程multiprocessing(一) 中我们介绍了多进程multiprocessing的部分基础操作,在本文中,我们将继续介绍关于多进程的一些知识,比如进程池Pool这个有用的东东。马上开始吧! 使用实例 实例1 import multiprocessing as mp def job(x): return x*x def multicore(): pool = mp.Pool(processes=2) res = pool.map(job,range(10)) print('map res:',res) multi_res = [pool.apply_async(job,(i,)) for i in range(10)] print('apply_async res:',[res.get() for res in multi_res]) if __name__ == '__main__': multicore() 运行结果: map res: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] apply_async res: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 解释一下: 这个例子演示了进程池pool的用法,创建Pool对象并指定使用2个核(默认使用全部)。

Java线程之间通信方式

两盒软妹~` 提交于 2019-12-31 13:41:21
通信方式: 1.同步 a.同步是指多个线程之间通过synchronize关键字这种方式来实现线程间的通讯。 b.这种方式本质上就是共享内存式的通讯。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。 2.while轮询的方式 a.这种方式比较浪费资源,是因为JVM將调度器交给轮询线程执行时,它只是在不断地测试某个条件是否成立。 b.线程都是先把变量读取到本地线程栈空间,然后再去修改本地变量。另一线程每次都在取本地的条件变量,可能造成死循环。 3.wait/notify机制 a.调用wait()放弃CPU,并进入阻塞状态。调用notify(),唤醒其他线程。 b.这种方式的好处是CPU的利用率提高了。 4.管道通讯 使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信。 分布式系统中说的两种通信机制:共享内存机制和消息通信机制。前面的synchronized关键字和while轮询 “属于” 共享内存机制, 由于是轮询的条件使用了volatile关键字修饰时,这就表示它们通过判断这个“共享的条件变量“是否改变了,来实现进程间的交流。 而管道通信,更像消息传递机制,也就是说:通过管道,将一个线程中的消息发送给另一个。 来源: CSDN 作者: jacljh 链接: https://blog.csdn

sqlite之WAL模式

别来无恙 提交于 2019-12-29 02:59:25
链接 概述 在3.7.0以后,WAL(Write-Ahead Log)模式可以使用,是另一种实现事务原子性的方法。 WAL的优点 在大多数情况下更快 并行性更高。因为读操作和写操作可以并行。 文件IO更加有序化,串行化(more sequential) 使用fsync()的次数更少,在fsync()调用时好时坏的机器上较为未定。 缺点 一般情况下需要VFS支持共享内存模式。(shared-memory primitives) 操作数据库文件的进程必须在同一台主机上,不能用在网络操作系统。 持有多个数据库文件的数据库连接对于单个数据库时原子的,对于全部数据库是不原子的。 进入WAL模式以后不能修改page的size。 不能打开只读的WAL数据库(Read-Only Databases),这进程必须有"-shm"文件的写权限。 对于只进行读操作,很少进行写操作的数据库,要慢那么1到2个百分点。 会有多余的"-wal"和"-shm"文件 需要开发者注意 checkpointing 原理 回滚日志的方法是把为改变的数据库文件内容写入日志里,然后把改变后的内容直接写到数据库文件中去。在系统crash或掉电的情况下,日志里的内容被重新写入数据库文件中。日志文件被删除,标志commit着一次commit的结束。 WAL模式于此此相反。原始为改变的数据库内容在数据库文件中

Linux程序设计 Beginning_Linux_Programming

£可爱£侵袭症+ 提交于 2019-12-28 00:01:25
好文: https://blog.csdn.net/qq_29996285/article/details/94191750 2019-06-17 21:48:55 终于知道为啥C语言开头要include<stdio.h> 了! Write系统调用: OPEN系统调用: Close 系统调用: ioctl系统调用: 一个文件复制程序: 改进版: 一个目录扫描程序:P103 改进main函数,使其变成一个更有用的目录浏览器。 输出结果将分页显示,用户可以通过翻页查看其输出。 可以说,用户现在有了一个非常方便,通用的目录树浏览器。 3.10 /proc文件系统 该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问 查看CPU: 查看内存: 查看内核版本信息: 查看网络套接字的使用统计 查看系统中所有运行的程序同时能打开的文件总数: ps命令会给出当前正在运行进程的列表。 第四章: Linux环境: 4.1程序参数 这个程序利用计数参数argc建立一个循环来检查所有的程序参数。 4.2 环境变量 4.2.2 environ变量。 程序可以通过environ变量直接访问这个字符串数组。 这个程序遍历environ遍历,并打印出整个环境。 4.3 时间和日期 这个程序演示了time函数的用法 以从1970年开始计算的秒数来表示时间和日期。 为了提供(对人类)更有意义的时间和日期