`
文章列表
  在函数传递参数时有引用计数增加操作,举个例子: 1) $a = 'a'; 2) $b = &$a;
1.FLEX简介    单词的描述称为模式(Lexical Pattern),模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件,输出一个如下所示的C语言源程序。    FLEX的输入文件称为LEX源文件,它内含正 ...
  /************pthread_cond_wait()的使用方法**********/     pthread_mutex_lock(&qlock);         pthread_cond_wait(&qready, &qlock);     pthread_mutex_unlock(&qlock); /*****************************************************/   The mutex passed to pthread_cond_wai ...
  ET模式称为边缘触发模式,顾名思义,不到边缘情况,是死都不会触发的。 EPOLLOUT事件:EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件:1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。2.对端读取了一些数据,又重新可写了,此时会触发EPOLLOUT。简单地说:EPOLLOUT事件只有在不可写到可写的转变时刻,才会触发一次,所以叫边缘触发,这叫法没错的! 其实,如果你真的想强制触发一次,也是有办法的,直接调用epoll_ctl重新设置一下event就可以了,event跟原来的设置一模一样都行(但必须包含EPOLLOUT), ...
“据说”惊群问题已经是一个很古老的问题了,并且在大多数系统中已经得到有效解决,但对我来说,仍旧是一个比较新的概念,因此有必要记录一下。什么是惊群        举一个很简单的例子,当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉,等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。对于操作系统来说,多个进程/线程在等待同一资源是,也会产生类似的效果,其结果就是每当资源可用,所有的进程/线程都来竞争资源,造成的后果:
        今天测试udp服务器进程时发现log中记录了当进程收到一个请求后,会有多条失败处理记录,同时有一条成功处理记录。服务器进程使用sellect模式,通过fork四个子进程来监听同一个socket。       发现问题后初步怀疑是出现了惊群现象。但是,听说现代内核已经解决了惊群问题,程序也可以确定也没有问题,就奇怪问题发生在哪里了。       后来在网上一搜才知道,原来linux内核开发人员通过锁机制解决了accept的惊群现象,但是对于sellect和epoll惊群问题并没有解决,所以这种情形下惊群还会出现,也就是当多个进程通过sellect方式监听同一个socket的可 ...
目前网上关于memcached的分析主要是内存管理部分,下面对memcached的线程模型做下简单分析 有不对的地方还请大家指正,对memcahced和libevent不熟悉的请先google之 先看下memcahced启动时线程处理的流程  memcached的多线程主要是通过实例化多个libevent实现的,分别是一个主线程和n个workers线程 
阅读memcacheq的hashtable实现的时候,发现在创建一个存储链表的数组时,使用void **的方法建立数组,即数组里存放的是链表指针,这样在删除元素时,只需要用一个指针的指针(保存当前链表实体的地址),这样删除就方便多了 struct entry { void *k, *v; unsigned int h; struct entry *next; }; struct hashtable { unsigned int tablelength; struct entry **table; unsigned in ...
[liexusong原创] memcached的网络层处理大概如下: (1)  main函数创建一个侦听服务端的socket, 然后添加到libevent中, 
[liexusong原创] Memcached Slab算法是根据powers of 2来将1MB的内存块划分成多个小内存块, 而这1MB的内存块称为页:   Powers of 2是2的n次方的意思,例如:2的0次方是
  在网上看到不少介绍Berkeley DB的文章,几乎所有的中文文章都是介绍完入门就再也没了。大都是个概括。最近做这个,所以想系统的由浅入深的介绍一下。不清楚的地方可以和我讨论,或参照官方网站sleepycat上的文档。我用的是最新版本 db-4.4.16.NC.tar.gz,这个包中含有详细的英文文档。 为什么要使用Berkeley DB,它适合什么场合应用? Berkeley DB并不适合所有的应用,因为简单,专一所以高效。 嵌入式数据库,的“嵌入”是指它内嵌在程序中,而不是说他只应用在嵌入式系统上。它的特点很适合应用于嵌入式系统上。当然在我们的pc机集群或大型服务器上,也可以 ...
  Hello World!     gkzhong at gmail     Berkeley DB之所以能实现如此高的性能,和它的持久化特点及高速缓存有莫大的关系,本文将偏向这方面进行解释,而不会或者很少提及到事务,复制等方面的问题。任何的持久化数据库系统最终的数据存储都是文件,那么BDB也是一样。一般的RMDB,都是基于C/S的模型,这意味着你永远无法接触到最底层的数据是如何持久化的。当然,你也不会需要。而BDB做为一个嵌入式数据库,它的运行模式和C/S有着本质的不同,或者你可以认为BDB是提供了一套API去访问一个数据库文件。那么这里就会问题了 ...

linux 多线程编程

 
  进程与线程         进程是程序执行时的一个实例,是执行程序在一定数据集上运行的过程,是LINUX系统分配资源的基本单位。          线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程 进程是资源管理的最小单位,线程是程序执行的最小单位。 Linux线程函数         1.创建线程:pthread_create()       头文件:
        在讲述文件映射的概念时, 不可避免的要牵涉到虚存(SVR 4的VM). 实际上, 文件映射是虚存的中心概念, 文件映射一方面给用户提供了一组措施, 好似用户将文件映射到自己地址空间的某个部分, 使用简单的内存访问指令读写 ...
1. 概述IPv4中使用gethostbyname()函数完成主机名到地址解析,这个函数仅仅支持IPv4,且不允许调用者指定所需地址类型的任何信息,返回的结构只包含了用于存储IPv4地址的空间。IPv6中引入了getaddrinfo()的新API,它是协议无关的,既可用于IPv4也可用于IPv6。getaddrinfo函数能够处理名字到地址以及服务到端口这两种转换,返回的是一个addrinfo的结构(列表)指针而不是一个地址清单。这些addrinfo结构随后可由套接口函数直接使用。如此以来,getaddrinfo函数把协议相关性安全隐藏在这个库函数内部。应用程序只要处理由getaddrinfo函 ...
Global site tag (gtag.js) - Google Analytics