UNIX网络编程 卷2
alenliu0621
随风飘飘天地任逍遥~~~
展开
-
《UNIX网络编程 卷2》 笔记: 简介
总述 W.Richarqd Stevens的《UNIX网络编程 卷2:进程间通信》主要讲解Linux进程间通信(IPC),其中也包括一些同步机制。 本系列 《UNIX网络编程 卷2》 笔记 文章主要根据书上内容记录一些笔记。在笔记中我主要关注IPC的三大领域: (1)消息传递(管道、FIFO、消息队列) (2)同步(互斥锁、条件变量、读写锁、信号原创 2017-09-03 14:58:27 · 5475 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 使用内存映射I/O实现信号量
之前这一节我们讲述了如何使用FIFO实现有名信号量。在介绍完共享内存区后,本节我们将使用内存映射I/O(mmap和munmap函数)来实现它。具体思想是:将表示信号量的mysem_t结构体写入一个文件,然后使用mmap函数映射该文件实现信号量在多个进程间共享。在这种实现中,信号量就相当于一个文件。该实现中mysem_t结构体的定义如下:typedef struct { pthread_m原创 2017-10-10 18:00:07 · 2207 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: Posix共享内存区
Posix.1提供了两种在无亲缘关系进程间共享内存区的方法: 1. 内存映射文件。用open打开一个文件,然后调用mmap将它映射到当前进程的地址空间。 2. 共享内存区对象。用shm_open打开一个Posix共享内存区对象,然后调用mmap将它映射到当前进程的地址空间。Posix 把两者合称为内存区对象。上节我们讲述的父子进程间共享一个全局变量的例子使用的就是第一种方法原创 2017-09-30 21:01:42 · 2551 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 共享内存区介绍
共享内存区是所有IPC形式中最快的。一旦这样的内存区映射到共享它的进程的地址空间,这些进程间的数据传递就不再涉及到内核。但是这些进程间通常需要使用某种形式的同步,如互斥锁、条件变量、读写锁、记录锁、信号量。回想一下我们曾在管道这一节讲述了如下一个例子。其中从服务器到客户的数据流如下图所示:数据流共穿越内核四次,每次都是开销比较大的复制操作(从内核空间复制数据到用户空间或原创 2017-09-27 21:11:30 · 2915 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: Posix信号量
信号量是另一种用于不同进程间或一个给定进程的不同线程间同步的IPC对象。对一个信号量可以执行3种操作: 1. 创建(create)一个信号量。要求调用者指定初始值。通常初始值为0或1的称作二值信号量,初始值为N(N>=0)的称作计数信号量,N指示可用的资源数(比如说缓冲区个数)。 2. 等待(wait)一个信号量。该操作测试信号量的值。如果它的值大于0,则将值减1;如果它...原创 2017-09-23 18:28:29 · 3486 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 使用FIFO实现信号量
上节我们给出的例子使用的都是基于内存的信号量,还有一种信号量是有名信号量。两者之间的关系就像管道和FIFO之间的关系。有趣的是,有名信号量可以使用FIFO来实现。每个有名信号量和一个FIFO关联,FIFO中的字节数代表该信号量的值。sem_post函数往该FIFO中写入一个字节,sem_wait函数从FIFO中读入一个字节。我们自己实现的信号量类型mysem_t定义如下typedef st原创 2017-09-26 20:23:17 · 3067 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 记录上锁
本节讲述记录上锁,它是读写锁的一种扩展类型,它可用于有亲缘关系或无亲缘关系的进程之间共享某个文件的读与写。使用记录上锁,应用可以指定文件中需要上锁或解锁的字节范围。Posix记录上锁定义了一个特殊的字节范围以指定整个文件,这就是文件上锁,它只是记录上锁的一个特例。Linux提供的记录上锁功能的函数是fcntl。#include #include int fcntl(int fd,原创 2017-09-10 15:16:03 · 3863 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 读写锁及其实现
如果已经有一个线程进入临界区,互斥锁会将所有试图访问临界区的其他线程阻塞。线程对临界区共享的数据有两种操作:读取和修改。互斥锁不区这两种操作,而读写锁区分这两种操作。读写锁的规则如下: 1. 只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。 2. 仅当没有线程持有某个给定的读写锁用于读或写时,该读写锁才能用于写。换一种说法是,只要没有线程在原创 2017-09-07 22:42:15 · 4076 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 互斥锁与条件变量
从本节开始后续文章都讨论同步,本节主要是讨论互斥锁与条件变量。互斥锁与条件变量之前在 《UNIX网络编程 卷1》笔记这一节有介绍,然而那一节并没有讲到临界区的概念。临界区是指被互斥锁保护的一段代码,同一时刻只能有一个线程或进程执行这段代码。我们说互斥锁保护临界区,实际上保护的是临界区中被多个线程或进程共享的数据。同步中有一个称为生产者-消费者(producer-consumer)的经典原创 2017-09-06 21:17:49 · 4301 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: Posix消息队列(2)
Posix消息队列允许异步事件通知,以告知何时有一个消息放入到了某个空消息队列中。有两种通知的方式可供进程选择:1. 产生一个信号2. 创建一个线程处理这种通知是通过mq_notify函数建立的。int mq_notify(mqd_t mqdes, const struct sigevent *sevp);下面的例子演示进程怎样注册为接收一个信号通知。#include原创 2017-09-05 21:34:33 · 4346 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: Posix消息队列(1)
消息队列可认为是由多个消息组成的链表,每个消息被赋予了优先级,它具有随内核的持续性(持续性的定义见简介)。有权限的进程可以放置消息到消息队列中,也可以从消息队列中取消息,取出的消息是放置时间最早且优先级最高的。POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX),POSIX标准定义了操作系统应该为应用程序提供的接口标准。本系原创 2017-09-04 22:31:58 · 4374 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 字节流与消息
目前我们给出的管道和FIFO的例子通信双方使用的都是字节流I/O模型,程序不对它作任何解释。如果一个进程从FIFO收到100字节数据,它不知道这100字节数据是一个进程发送的,还是多个进程发送的。如何区分字节流是哪个进程发送的?有种常用的技巧就是将数据封装在一条消息(带边界信息的字节流)里。消息包括消息头和数据,通信双方事先约定好消息的格式,就可以通过发送消息通信了。比如为解决上面的问题,原创 2017-09-04 21:13:30 · 4649 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: FIFO
FIFO本意是指先进先出(first in,first out),在本系列文章中,FIFO指的是有名管道。与管道不同的是,FIFO有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO。#include #include int mkfifo(const char *pathname, mode_t mode);FIFO由mkfifo函数创建,pathname表示路径名,mod原创 2017-09-03 23:45:18 · 4712 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 管道
管道是最初的UNIX IPC形式,它的局限性在于没有名字,只能在有亲缘关系的进程间使用。后来,FIFO出现了,FIFO也称为有名管道。管道和FIFO都使用read和write函数访问。#include int pipe(int fd[2]);管道由pipe函数创建,返回两个描述符:fd[0]用来读,fd[1]用来写。单个进程创建管道后的模样如下:通常情况下,单个进程创建原创 2017-09-03 21:55:47 · 4517 阅读 · 0 评论 -
《UNIX网络编程 卷2》 笔记: 使用内存映射I/O实现消息队列
本节是《UNIX网络编程 卷2》 笔记 的最后一节,我们使用内存映射I/O实现Posix消息队列。之所以将这节内容放到最后是因为这个实现比较复杂,涵盖了之前讲述的很多内容。这个实现的具体思想和实现信号量类似:把消息队列写入一个文件中,然后使用mmap函数映射该文件实现消息队列在多个进程间共享。下图是用这种方法实现的一个消息队列(该消息队列中有4个消息,每个消息的长度是7字节)使用的各种数据结构布局原创 2017-10-11 22:49:36 · 2119 阅读 · 0 评论