共享内存

共享内存的疑惑

匿名 (未验证) 提交于 2019-12-02 22:56:40
共享内存的疑惑 上一篇文章中” .net remoting和wcf自托管――一个bug引发的警示 ”,我稍微提了下c++的共享内存,当时我有一个推测,就是在客户端读取共享内存前,谁修改过共享内存。但是我经过了好多次调试,发现只有一次写内存,其它的都是读取内存,这个值是怎么变的呢?目前还不清楚。当共享内存刚刚写完后,立即读出来的值是正确的,等过“一小会”,可能就是多少毫秒吧。再次读取的值就变了。这正是我百思不得其解的地方。 代码是前辈写的,可能擅长c++,继续上一篇的文章,我把c++的代码贴出来: static ShareDataRW() { Handle = CreateFileMappingA ( new IntPtr(- 1 ), IntPtr.Zero, 0x04 , 0 , 1024 , " Local\\NoteFirstShare_Memory " ); if (Handle == IntPtr.Zero) return ; ShareDataMemoryPoint = MapViewOfFile (Handle, SECTION_ALL_ACCESS, 0 , 0 , 1024 ); ShareDataType = typeof (ShareData); if (OfficeAddinServicesPort == 0 )

Python--多线程 threading

匿名 (未验证) 提交于 2019-12-02 22:56:40
简单使用 import threading def thread_job () : print ( 'This is a thread of %s' % threading . current_thread ()) def main () : thread = threading . Thread ( target = thread_job ,) # 定义线程 thread . start () # 让线程开始工作 thread . join () 可以使用的API 当前活跃线程数 threading . active _count () 查看所有线程信息 threading . enumerate () 查看当前运行的线程 threading . current _thread () join功能 thread.join() 表示 当前主线程要等待所有带 join的子线程结束以后才能接着执行。 用队列管理多线程返回结果的例子 import threading import time from queue import Queue def job ( l , q ) : for i in range ( len ( l )): l [ i ] = l [ i ]** 2 q . put ( l ) def multithreading () : q = Queue ()

计算机操作系统基础知识-2

匿名 (未验证) 提交于 2019-12-02 21:56:30
Shell Shell是操作系统与用户交互的界面。表现为通过控制台执行用户命令。本身不执行命令,仅仅是组织和管理命令。 脚本:类似程序的方式执行一系列的逻辑顺序的命令序列完成复杂的功能和人机交互。保存在文件中,是shell命令的集合。 定义:操作系统内核为应用程序提供的服务/函数 特点: 一般涉及核心操作和硬件资源 运行于核态 函数具有唯一ID 产生中断,且为自愿中断 定义:是程序在某个数据集合上的一次运行活动。程序的一次运行即为一个进程。 特性: 动态性 并发性 异步性 独立性 分类: 按使用资源权限 系统进程:系统内核相关进程 用户进程:运行于用户态的进程 按对CPU依赖性 偏CPU进程:计算型 偏I/O进程: 进程状态 就绪态:获得了除CPU之外所有资源,通常有多个进程处于就绪态,有一个就绪队列。 运行态:获得CPU,正在运行 等待态: 进程由程序、数据、进程控制块组成。 进程控制块是描述和管理进程的一种数据结构,包括以下内容: 进程描述信息 控制和调度信息 资源信息 现场信息 同步:进程通过协作共同完成同一任务而造成的直接制约关系,如生产者-消费者模式 互斥:进程间竞争系统资源而造成的间接制约关系,同一时间内只有一个进程可以访问系统资源。 临界资源和临界区 临界资源:同一时间只能有一个进程访问的资源 临界区:进程访问临界资源的程序片段 实现同步互斥的方法:原子操作、锁

oracle学习篇:四、内存管理

Deadly 提交于 2019-12-02 21:26:52
4 内存管理 4.1 SGA管理 4.1.1 SGA的组成 buffer cache,shared pool,redo log buffer,large pool,java pool,streams pool select * from v$sgainfo; 4.1.2 SGA与共享内存 SGA的设置在Linux/UNIX上和一个操作系统内核参数有关,这个参数是shmmax。 在Solaris上,该参数由/etc/system文件中shmsys:shminfo_shmmax定义;在linux上,该参数由/proc/sys/kernel/shmmax参数定义。 shmmax内核参数定义的是系统运行的单个共享内存段的最大值,如果该参数设置小于SGA设置,那么SGA仍然可以创建成功,但是会被分配到多个共享内存段。 在windows系统中,由于系统采用多线程服务器(所有oracle进程实际上都是一个进程中的线程),所以不存在共享内存的问题,无需进行特殊设置。 shmmax内核参数定义的是系统运行的单个共享内存段的最大值,如果该参数设置小于SGA设置,那么SGA仍然可以创建成功 查看shmmax值: more /porc/sys/kernel/shmmax 查看操作系统版本: cat /etc/redhat-release 查看操作系统发行版号: uname -r ipcs查看共享内存的分配

Linux进程间通信 --- IPC机制(转)

余生颓废 提交于 2019-12-02 12:27:58
在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。在linux下有多种进程间通信的方法:半双工管道、命名管道、消息队列、信号、信号量、共享内存、内存映射文件,套接字等等。使用这些机制可以为linux下的网络服务器开发提供灵活而又坚固的框架。 1. 管道 (PIPE) 管道实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。 管道的特点: 1、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 2、只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。比如fork或exec创建的新进程,在使用exec创建新进程时,需要将管道的文件描述符作为参数传递给exec创建的新进程。当父进程与使用fork创建的子进程直接通信时,发送数据的进程关闭读端,接受数据的进程关闭写端。 3、单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 4、数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾

Linux 的 进程/线程 通信方式总结

旧城冷巷雨未停 提交于 2019-12-02 05:44:29
linux 系统中的进程通信方式主要以下几种: PIPE(FIFO) 消息队列 信号量(Semaphore) 共享存储 SOCKET 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory) 网络主机间的进程通信方式 * RPC: Remote Procedure Call 远程过程调用 * Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通信方式. 各自的特点: 管道(PIPE):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(父子进程)的进程间使用。另外管道传送的是无格式的字节流,并且管道缓冲区的大小是有限的(管道缓冲区存在于内存中,在管道创建时,为缓冲区分配一个页面大小)。 有名管道 (FIFO): 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号(Signal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 信号量(Semaphore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此

Golang学习笔记--channel基础

安稳与你 提交于 2019-12-02 05:02:17
go在语言层面支持并发编程,也就是goroutine,可以看做一种轻量级的线程。程序启动时,其主函数即在一个单独的goruntine中运行,叫做main goruntine,在程序中通过关键字go跟上函数(支持匿名函数)就可以启动一个新的goroutine,可以叫做sub goruntine。 在基于多线程设计的并发编程模型中,线程间的通信往往通过共享数据来实现,而保证共享数据的一致性非常关键。如果线程间有竞争条件,那么对共享数据的访问往往需要加锁来保证一致性,而针对不同的访问竞争,比如读/读、读/写、写/写,需要用不同的锁机制,要想兼顾性能和一致性保证需要煞费苦心,尤其是线程间共享数据比较多的时候。 为了更简单的并发编程,go语言提出了自己的信仰:用通信来共享内存,而不要用共享内存来通信。对于goroutine之间的通信,channel是最好的选择,铭记这句原则: 用通信来共享内存,而不要用共享内存来通信 ,可以帮助我们更好的理解channel。 channel状态 channel作为go的一种基本数据类型,它有3种基本状态:nil、open、closed: /* nil channel */ var ch = chan string // A channel is in a nil state when it is declared to its zero value ch =

动态链接库与共享内存:

那年仲夏 提交于 2019-12-01 23:52:24
动态链接库与共享内存: 我们知道,动态链接库(在windows上表现为.dll,在linux下表现为.so)采用的是延迟加载机制,即程序在运行的过程中在被调用的时候才会被加载。一个动态库在内存中只存在一份,可以被多个进程共享。这样做很明显可以节省内存空间。   那么问题来了:共享内存在内存中也是只存在一份,也可以被多个进程共享。在不同的进程中,共享的那段内存的被分配的地址会有所不同。那么,同样是在内存中只存在一份,同样是可以被其他进程共享,动态链接库和共享内存的区别在哪呢?   区别就在于:多个程序虽然可以共享同一个动态链接库中的相同代码,但每一个进程都为动态链接库使用的全部数据分配了自己的地址空间。而共享内存是代码和数据均被多个程序所共享。动态链接库只是实现了代码的复用,对于数据,各个程序要自己保存。共享内存用于进程间通信,主要用于数据的内存共享。这也从侧面反映出动态链接库并不能用于实现进程之间通信。 来源: https://www.cnblogs.com/tongyishu/p/11722004.html

共享内存

故事扮演 提交于 2019-12-01 22:27:19
from multiprocessing import Manager,Value m = Manager() num = m.dict({键 : 值}) num = m.list([1,2,3]) 来源: https://www.cnblogs.com/god-for-speed/p/11719097.html