memcached源码分析-----网络模型

转载请注明出处:半同步/半异步:        memcached使用半同步/半异步网络模型处理客户端的连接和通信。        半同步/半异步模型的基础设施:主线程创建多个子线程(这些子线程也称为worker线程),每一个线程都维持自己的事件循环,即每个线程都有自己的epoll,并且都会调用epoll_wait函数进入事件监听状态。每一个worker线程(子线程)和
摘要由CSDN通过智能技术生成


        转载请注明出处:http://blog.csdn.net/luotuo44/article/details/42705475


accept/dispatch:

        memcached使用"主线程统一accept/dispatch子线程"网络模型处理客户端的连接和通信,也就是《UNIX网络编程 卷1 第三版》第30章里面的第8个模型。

        "主线程统一accept/dispatch子线程"的基础设施:主线程创建多个子线程(这些子线程也称为worker线程),每一个线程都维持自己的事件循环,即每个线程都有自己的epoll,并且都会调用epoll_wait函数进入事件监听状态。每一个worker线程(子线程)和主线程之间都用一条管道相互通信。每一个子线程都监听自己对应那条管道的读端。当主线程想和某一个worker线程进行通信,直接往对应的那条管道写入数据即可。

        "主线程统一accept/dispatch子线程"模型的工作流程:主线程负责监听进程对外的TCP监听端口。当客户端申请连接connect到进程的时候,主线程负责接收accept客户端的连接请求。然后主线程选择其中一个worker线程,把客户端fd通过对应的管道传给worker线程。worker线程得到客户端的fd后负责和这个客户端进行一切的通信。


        "主线程统一accept/dispatch子线程"模型的工作示意图如下图所示:

        


        memcached里面的"主线程统一accept/dispatch子线程"和上面所说的差不多,区别在于:1. memcached使用libevent作为进行事件监听;2.memcached往管道里面写的内容不是fd,而是一个简单的字符。每一个worker线程都维护一个CQ队列,主线程把fd和一些信息写入一个CQ_ITEM里面,然后主线程往worker线程的CQ队列里面push这个CQ_ITEM。接着主线程使用管道通知worker线程:“我已经发了一个新客户给你,你去处理吧”。

        memcached的"主线程统一accept/dispatch子线程"如下面这幅经典的图所示:

        



memcached的具体实现:

        上图看到每一个worker线程都有一个CQ队列,主线程accept到新客户端后,就把新客户端的信息封装成一个CQ_ITEM,然后push到选定线程的CQ队列中。


CQ队列:

        现在我们来看一下CQ队列长什么样的。

typedef struct conn_queue_item  CQ_ITEM;

struct conn_queue_item {
    int               sfd;
    enum conn_states  init_state;
    int               event_flags;
    int               read_buffer_size;
    enum network_transport     transport;
    CQ_ITEM          *next;
};

/* A connection queue. */
typedef struct conn_queue  CQ;
struct conn_queue {
    CQ_ITEM *head;//指向队列的第一个节点
    CQ_ITEM *tail;//指向队列的最后一个节点
    pthread_mutex_t lock; //一个队列就对应一个锁
};

        可以看到结构体conn_queue(即CQ队列结构体)有一个pthread_mutex_t类型变量lock,这说明主线程往某个worker线程的CQ队列里面push一个CQ_ITEM的时候必然要加锁的。下面是初始化CQ队列,以及push、pop一个CQ_ITEM的代码。

static void cq_init(CQ *cq) {
    pthread_mutex_init(&cq->lock, NULL);
    cq->head = NULL;
    cq->tail = NULL;
}

static CQ_ITEM *cq_pop(CQ *cq) {
    CQ_ITEM *item;

    pthread_mutex_lock(&cq->lock);
    item = cq->head;
    if (NULL != item) {
        cq->head = item->next;
        if (NULL == cq->head)
            cq->tail = NULL;
    }
    pthread_mutex_unlock(&cq->lock);

    return item;
}

/*
 * Adds an item to a connection queue.
 */
static void cq_push(CQ *cq, CQ_ITEM *item) {
    item->next = NULL;

    pthread_mutex_lock(&cq->lock);
    if (NULL == cq->tail)
        cq->head = item;
    else
        cq->tail->next = item;
    cq->tail = item;
    pthread_mutex_unlock(&cq->lock);
}
        注意,cq_pop函数不同于STL里面的pop。cq_pop函数会返回一个CQ_ITEM。


        由上面代码得到的CQ队列如下图所示:

        



为worker线程构建CQ队列:

        主线程又是怎么访问各个worker线程的CQ队列呢?在C语言里面的答案当然是使用全局变量啦。memcached专门定义了结构体,如下:

typedef struct {
    pthread_t thread_id; //线程id      
    struct event_base *base; //线程所使用的event_base 
    struct event notify_event;//用于监听管道读事件的event
    int notify_receive_fd; //管道的读端fd
    int notify_send_fd;   //管道的写端fd
    struct conn_queue *new_conn_queue; /* queue of new connections to handle */
	...
} LIBEVENT_THREAD;

        看到LIBEVENT_THREAD结构体的这些成员,完全可以顾名思义。memcached定义了LIBEVENT_THREAD类型的一个全局变量指针threads。当确定了memcached有多少个

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: memcached-win-1.5.6.rar是一个用于Windows操作系统的memcached软件的压缩包。Memcached是一款高性能的分布式内存对象缓存系统,通过在内存中缓存数据来减轻数据库的负载。memcached-win-1.5.6.rar是这个软件的一个版本,该版本主要在Windows平台上使用。 要下载memcached-win-1.5.6.rar,你可以按照以下步骤进行操作: 1. 在你的浏览器中搜索“memcached-win-1.5.6.rar下载”。 2. 在搜索结果中找到可靠的下载来源,例如官方网站或诸如GitHub等知名网站。 3. 点击相应的下载链接,你可能需要选择适合你的系统的版本,比如32位或64位。 4. 在弹出的下载对话框中选择保存文件的位置,点击“保存”按钮。 5. 下载会在一段时间内完成,时间长短取决于你的网络速度。 6. 下载完成后,你可以在你选择的保存位置找到memcached-win-1.5.6.rar压缩包。 7. 解压缩这个压缩包,你可以使用解压缩软件,如WinRAR或7-Zip。 8. 解压缩完成后,你将得到memcached软件的安装文件或目录。 9. 跟据memcached的安装说明,你可以进行软件的安装和配置。 请注意,下载任何软件时要保证下载源的可靠性,以免下载到恶意软件或病毒。推荐从官方网站或可信赖的第三方下载平台下载memcached-win-1.5.6.rar,以确保软件的完整性和安全性。 ### 回答2: memcached-win-1.5.6.rar是一个Memcached的Windows版本软件包,可以用于在Windows操作系统上安装和运行Memcached服务器。Memcached是一个开源的分布式内存对象缓存系统,主要用于加速动态网站和应用程序的访问速度。 要下载memcached-win-1.5.6.rar,可以按照以下步骤进行操作: 1. 在网络浏览器中打开一个搜索引擎,如Google或Bing。 2. 在搜索栏中输入“memcached-win-1.5.6.rar下载”。 3. 点击搜索按钮,搜索引擎将返回相关的搜索结果。 4. 从搜索结果中选择一个可信和安全的下载源,例如官方网站或知名的软件下载站。 5. 进入下载源的网页,查找memcached-win-1.5.6.rar的下载链接。 6. 点击下载链接开始下载memcached-win-1.5.6.rar。 7. 完成下载后,可以使用解压缩软件(如WinRAR或7-Zip)将memcached-win-1.5.6.rar文件解压缩到所需的目标文件夹。 8. 解压缩后,可以按照软件包中的安装指南或使用说明文档来安装和配置Memcached服务器。 请注意,下载任何软件时应保持警惕,确保选择可信和安全的下载源,以避免下载到潜在的恶意软件。 ### 回答3: memcached-win-1.5.6.rar 是一个用于Windows操作系统的Memcached版本。它是一个高性能的分布式内存对象缓存系统,广泛用于加快Web应用程序的性能。您可以通过以下步骤下载和安装memcached-win-1.5.6.rar。 1. 打开您的浏览器,并访问memcached-win-1.5.6.rar的下载页面。 2. 在下载页面,找到memcached-win-1.5.6.rar的下载链接,并点击下载按钮。 3. 下载完成后,找到下载的memcached-win-1.5.6.rar文件,通常会保存在您的默认下载文件夹中。 4. 使用解压缩软件(如WinRAR或7-Zip)解压缩memcached-win-1.5.6.rar文件。 5. 解压缩完成后,您将获得一个包含memcached-win-1.5.6的文件夹。 6. 打开该文件夹,您将找到memcached.exe等执行文件和一些配置文件。这些文件将帮助您配置和运行memcached服务器。 7. 根据您的需求,编辑配置文件(如memcached.conf)来设置服务器参数,例如缓存大小和端口号。 8. 双击memcached.exe文件以启动memcached服务器。 9. 现在,您可以通过在命令行或使用Memcached客户端库来使用和管理memcached-win-1.5.6服务器。 总而言之,通过下载和安装memcached-win-1.5.6.rar,您可以在Windows操作系统上享受到Memcached服务器的性能优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值