`
kenby
  • 浏览: 724581 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
消费者的两种等待方式: 方式1:  if (empty(queue)) {     pthread_cond_wait(&queue_has_element, &mutex); } element = dequeue(queue); 方式2: while (empty(queue)) {     pthread_cond_wait(&queue_has_element, &mutex); } element = dequeue(queue); 说明: 方式1的等待存在问题, 如果多个消费者都在等待queue_has_ele ...
三个文件   1 tpool.h typedef struct tpool_work { void (*routine)(void *); void *arg; struct tpool_work *next; } tpool_work_t; typedef struct tpool { /* pool characteristics */ int num_threads; int max_q ...
    管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。  管道是Linux支持的最初Unix IPC形式之一,具有以下特点: 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出 ...
讲到fork, 一个经典的例子如下: if ((pid = fork()) == 0) {     printf("in child %d\n", getpid()); } else if (pid > 0) {     printf("in parent\n"); } else {     perror("fork");     exit(0); } 现在, 我要创建5个进程, 每个进程都打印出自己的pid,  写下如下代码:   #include <stdio.h> #include ...
  一. 信号灯简介 信号灯与其他进程间通信方式不大相同,它主要提供对进程间共享资源访问控制机制。 相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程 也可以修改该标志。除了用于访问控制外,还可用于进程同步。 信号灯有以下两种类型: 二值信号灯:最简单的信号灯形式,信号灯的值只能取0或1,类似于互斥锁。  注:二值信号灯能够实现互斥锁的功能,但两者的关注内容不同。信号灯强调共享资源, 只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源 的进程使用完资源后,必须由进程本身来解锁。 计算信号灯:信号灯的值可以取任意非负值(当然受内 ...
一. 共享内存介绍 系统V共享内存指的是把所有共享数据放在共享内存区域(IPC shared memory region),任何想要访问该数据的 进程都必须在本进程的地址空间新增一块内存区域,用来映射存放共享数据的物理内存页面。系统调用mmap()通 过映射一个普通文件实现共享内存。系统V则是通过映射shm文件系统中的文件实现进程间的共享内存通信。 也就是说,每个共享内存区域对应shm文件系统的一个文件.     二、系统V共享内存API 对于系统V共享内存,主要有以下几个API:shmget()、shmat()、shmdt()及shmctl()。 #include <s ...

mmap详解

  共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式, 因为进程可以直接读写内存,而不需要任何 数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则 只 ...
原文地址: http://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点。作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某个时间范围内对信号做出反应,因此该信号最多在接受信号进程的生命周期内才有意义,信号所传递的信息是接近于随进程持续的概念(process-persiste ...
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK) 从字面上看, 意思是: * EAGAIN: 再试一次 * EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block * perror输出:  Resource temporarily unavailable 总结: ...
一、从一个使用场景开始   开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件   import logging # 创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh.setLevel(logging.DEBUG) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler ...
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。     一、epoll的优点 支持一个进程打开大数目的socket描述符。 IO效率不随FD数目增加而线性下降。   二、epoll的使用 epoll有2种工作方式:LT和ET。   
一. Tornado是什么? Facebook发布了开源网络服务器框架Tornado,该平台基于Facebook刚刚收购的社交聚合网站FriendFeed的实时信息服务开发而来.Tornado由Python编写,是一款轻量级的Web服务器,同时又是一个开发框架。采用非阻塞I/O模型(epoll),主要是为了应对高并发 访问量而被开发出来,尤其适用于comet应用。     二. 为什么要阅读Tornado的源代码 Tornado由前google员工开发, 代码非常精练, 实现也很轻巧, 加上清晰的注释和丰富的demo, 我们可以很容易的阅读分析tornado. 通过阅读Tornad ...
Markoo群发了一封邮件:  苹果的传奇CEO Steve Jobs昨天退休了 他下面的这段话值得大家自勉 “Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is ...
  原文url: http://learn.akae.cn/media/ch29s03.html   dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。 #include <unistd.h> int dup(int o ...
  原文地址:http://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html 1. 装饰器入门 1.1. 需求是怎么来的? 装饰器的定义很是抽象,我们来看一个小例子。
Global site tag (gtag.js) - Google Analytics