linux 进程学习笔记-共享内存】的更多相关文章

如果能划定一块物理内存,让多个进程都能将该内存映射到其自身虚拟内存空间的话,那么进程可以通过向这块内存空间读写数据而达到通信的目的.另外,和消息队列不同的是,共享的内存在用户空间而不是核空间,那么就不存在“用户空间和内核空间之间数据复制”的问题,这会减少不少开销. 由于不同进程都可能向同一个空间读写数据,所以其需要一些同步机制来防止混乱,可以使用的机制有“信号量”“文件锁”等. 共享内存有mmap和System V Shared Memory, 下面说的是后者. 创建或打开共享内存: int s…
shmget int shmget(key_t key, size_t size, int flag); key: 标识符的规则 size:共享存储段的字节数 flag:读写的权限 返回值:成功返回共享存储的id,失败返回-1 key_t key key标识共享内存的键值: 0/IPC_PRIVATE. 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存:如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存…
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. kmalloc()的底层依赖于__get_free_pages()来实现,分配标志的前缀GFP正好是这个底层函数的缩写. GFP_ATOMIC:在中断处理函数.底半部.tasklet.定时器处理函数以及URB完成函数中,在调用者持有自旋锁或读写锁时以及当驱动将current->state修改为非TASK…
共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也立即会看到更新. 由一个进程创建的段,也可以由另一个进程读写. 每个进程都把它自己对共享内存的映像放入自己的地址空间. 创建共享内存区 int shmget(key_t key,size_t size,int shm-flg); 参数key既可以是IPC_PRIVATE(IPC_PRIVATE表示让…
共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法.一个进程向共享内存区域写入了数据,共享这个内存区域的全部进程就能够立马看到当中的内容. 关于共享内存使用的API key_t ftok(const char *pathname, int proj_id); #在IPC中.我们经经常使用一个 key_t 的值来创建或者打开 信号量.共享内存和消息队列.这个 key_t 就是由ftok函数产生的. pathname:指定的文件名称,该文件必须是存在并且能够訪问 pr…
学习了linux下的进程,觉得应该整理一下,忘得差不多了,顺便回顾一下. 学而时习之,不亦说乎~~ 进程笔记 ,什么是进程? The Single UNIX Specification, Version (UNIX98) and its predecessor Version (UNIX95), defines a process as “an address spacewith one or more threads executing within that address space, a…
在分时系统中,系统将CPU时间划分成无数个时间片(quantum)分配给不同的进程,一个时间片只执行一个进程,并且不停地切换,以让用户感觉到各个进程是在“同时运行”,这中间所需要的策略和算法便是进程调度. 一个很好的例子是:假设目前系统只运行了两个进程,一个解压缩程序和一个文本编辑器.由于解压缩程序会大量地占用CPU而不是I/O设备(将解压后的文件写入磁盘),所以对解压缩程序而言CPU是其最大的影响因素,我们将这类程序归类为“CPU-Bound(CPU限制型)”.与之相对应的,文本编辑器对CPU…
共享内存同意两个或多个进程共享一给定的存储区,由于数据不须要来回复制,所以是最快的一种进程间通信机制.共享内存能够通过mmap()映射普通文件(特殊情况下还能够採用匿名映射)机制实现,也能够通过系统V共享内存机制实现.应用接口和原理非常easy,内部机制复杂.为了实现更安全通信,往往还与信号量等同步机制共同使用.以下主要介绍系统V共享内存机制,主要用到的系统API包含: 1.shmget函数:获得一个共享内存标识符. int shmget(key_t key, size_t size, int …
所谓“进程间通信(IPC,inter-process communication)”,按照其目的讲就是让进程之间能够“共享数据”,“传输数据”,“事件通知”等,我所知道的一共有“管道” “信号” “消息队列(报文)” “共享内存” “套接字” 这几种方式. 这里先看看“管道” 可以将管道想象成生活中的水管,只不过其中流动的是“数据”.一个管道有两个“端”,一个称为“写端”,从这里将数据写入管道,另外一个称为“读端”,用于将数据从管道中读出. 管道分为非命名管道和命名管道两种,前者一般写成pipe…
信号灯(信号量)不是进程通信手段,其是用于控制和协调在进程间通信过程中的共享资源访问,就如同互斥锁(两者的区别可以参考这里) 可以将简单地将信号灯想象成一个计数器,初始时计数器值为n(有n个资源可供使用),当进程占用资源时计数器减1,资源被释放时计数器加1,没有资源可用时计数器为0. 如果资源只用“可用/不可用”这样的非是即否的状态的话,信号灯称为二值信号灯(binary semaphre),相反地,称为计数信号灯(counting semaphores) 将信号灯的原理表示成代码的话,则非常简…