- 博客(12)
- 资源 (10)
- 收藏
- 关注
原创 61-System V 信号量(生产者与消费者模型)
学过 OS 的同学一定知道这个模型,这里再简单回忆一下。最后给出基于 System V 信号量的完整实现。1. PV 原语P(S) :表示将资源 S 数量减 1,即 S = S - 1. 如果 S <= 0,该进程进入等待。V(S):表示将资源 S 数量加 1,即 S = S + 1. 如果 S > 0,该进程继续执行,否则释放一个正在等待的进程。PV 操作是原子的,原子操作可以理解为一次性执
2017-01-15 10:44:31 2211 10
原创 60-System V 信号量(操作)
要掌握信号量,只要熟练掌握对信号量的请求和释放(归还)就行了,也就是 semop 函数,本质上它就是用来对信号量进行加或减的操作。当然,semctl 也很重要,它主要用来获取和设置 ipc 内核对象,另外它也可以获取和设置信号量的值。1. 创建和获取信号量函数 semget 主要是用来创建和信号量的 ipc 内核对象,同时返回其 id 号。函数原型int semget(key_t key, in
2017-01-14 15:12:05 1656
原创 59-System V 信号量(简介)
不同于 System V 共享内存和消息队列,这两者都是用于交换数据,而 System V 信号量通常用来做进程同步。1. System V 信号量简介准确的说 System V 信号量应该叫 System V 信号量集,因为它可以同时操作多个信号量。多个信号量保存在数组中。你可以把信号量理解成一种资源数量,当你使用这种资源的时候,信号量的值就会减少,当你归还资源的时候,信号量的值就增多。在信号量中
2017-01-13 19:54:19 1792
原创 58-System V 消息队列
在有了共享内存的基础后,消息队列对你来说就是 A piece of cake 了。同样我们需要创建消息队列的内核对象,获取它的 id,然后操控它。1. 消息队列简介消息队列本质上是位于内核空间的链表,链表的每个节点都是一条消息。每一条消息都有自己的消息类型,消息类型用整数来表示,而且必须大于 0.每种类型的消息都被对应的链表所维护,图1 展示了内核空间的一个消息队列: 图1 位于内核空间的消息
2017-01-13 14:33:48 1779 5
原创 57-System V 共享内存-shmctl
在很久以前,我们学过一个函数 fcntl,当时学习它时挺费劲,因为一个函数,竟然有如此多的功能。今天要学习 shmctl 函数,也是一样。这种以 cntl/ctl 为后缀的函数,往往都具备这样的特性:它们都有一个命令控制参数,你传递不同的命令,这个函数有具备着不同的功能,可谓身兼数职说的就是它吧。1. shmctl 函数1.1 函数原型int shmctl(int shmid, int cmd, s
2017-01-12 20:19:41 2967
原创 56-System V 共享内存-shmat 与 shmdt
在理解内核对象后,接下来谈谈 System V 共享内存的 shmat 和 shmdt 函数。1. shmget 函数再次回顾一下 shmget 函数。图1 中左侧表示的是一个进程空间(未区分内核空间与用户空间),进程空间中并非所有的线性地址被分配(或者说并非所有线性地址都被映射到物理页),黑色部分表示的是未分配的线性地址。 图1 进程空间与物理页 当你使用 shmget 创建出共享内存后,
2017-01-12 14:09:52 1994
原创 55-键值与 ftok
在上一篇博文中,创建和获取 ipc 内核对象的方式所使用的键值都是需要事先约定好的。通常在编写程序的时候,这个键值可以放在公共头文件中,这样不同进程间如果需要获取相同的 ipc 内核对象,就使用公共头文件中约定好的 key 值。当然你也可以通过命令行传参数的方式来指定 key 值。本文介绍一个函数 ftok,它可以根据路径和一个整数生成 key 值。如此你就可以约定好一个路径以及一个整数来取得相同的
2017-01-09 18:18:53 1435
原创 54-System V IPC 内核对象
在你基本掌握了共享内存的使用方法后,接下来我们需要继续深入 System V IPC。1. IPC 内核对象每个 IPC 内核对象都是位于内核空间中的一个结构体。它长什么样现在我们还不需要关心,所以现在你只需要知道这样的结构体存在就够了。具体的对于共享内存、消息队列和信号量,他们在内核空间中都有对应的结构体来描述。当你使用 get 后缀创建内核对象时,内核中就会为它开辟一块内存保存它。只要你不显式删
2017-01-09 16:41:27 1907
原创 53-System V 共享内存初体验
为了能快速掌握 System V IPC,本篇以最少量的文字让初学者先初步掌握共享内存,后续文章,再慢慢深入。共享内存只是 System V IPC 中的一种,前面的进程通信总览中我们讲过 System V IPC 包括了共享内存、消息队列和信号量。1. 共享内存为了能够快速上手共享内存,下面直接介绍一下大致的方法:根据已知的键(key) 使用 get 函数获取或者创建内核对象的 id 号。根据
2017-01-05 11:02:48 2034 2
原创 52-有名管道
有名管道打破了无名管道的限制,进化出了一个实实在在的 FIFO 类型的文件。这意味着即使没有亲缘关系的进程也可以互相通信了。所以,只要不同的进程打开 FIFO 文件,往此文件读写数据,就可以达到通信的目的。不过 FIFO 文件与我们最开始讲的本地文件通信还是有着本质的区别,它长着普通文件的脑袋,却有着无名管道的基因。1. 创建 FIFO 类型文件通过命令 mkfifo 创建如:$ mkfifo
2017-01-04 11:30:03 1882 6
原创 51-无名管道
这恐怕是最古老的 linux 进程间通信的方式了。这种方式简单而又强大,尤其适合有亲缘关系的进程(通常是父子进程)间通信了。实际上,你或多或少的都用过管道这种通信方式,比如你在使用的 linux 命令中的管道连接符 |。所以,对于管道来说,你应该有一种亲切感。1. 管道为何物?如果你实践过前面我们讲过的使用本地文件进行进程间通信的方式,那么你就可以把管道理解成位于进程内核空间(如果你不记得这个概念,
2017-01-03 18:43:13 1976 10
原创 50-进程间通信总览
在上一篇里,使用了读写文件的方式来实现进程间通信,使用了信号量完成了进程间的同步,虽然这种实现方式也能够完成任务,但是缺点就在于它需要读写磁盘。所以 linux 系统提供了多种多样的进程间通信的手段,帮助我们实现进程间通信。不过,在讲解 Linux 进程间通信(后面简称 Linux IPC)之前,需要了解 Linux IPC的分类。1. Linux IPC 分类说分类不太准确,不过还是先按照此方式大
2017-01-03 17:48:15 1582
GCC 内联汇编
2018-10-28
梯度下降法VS2008_C++
2014-10-23
增强版事故树绘制与分析程序
2013-04-19
事故树绘制分析软件
2012-12-17
MFC 音乐播放器
2012-12-12
汇编_单片机_matlab_Multisim等
2010-11-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人