memcached 采用多线程的工作方式, 主线程接收连接, 然后把连接平摊给
工作线程, 工作线程处理业务逻辑, memcached 使用 libevent 处理网络
事件, 主线程和工作线程都有一个 event base, 这是 libevent 的核心数据
结构, event base 能够监听多个 socket 的网络事件, 概括起来,
memcached 大体框架如 图1 所示.
图1 memcached的多线程模型
主线程的初始化
主线程首先初始化 libevent 的核心数据结构 main base, 然后创建监听
socket, 把监听 socket 封装成一个连接, 加入 main base, 这样就能处理
网络事件.
所有 socket 的网络事件处理都由两个函数完成:event_handler() 和
drive_machine(), 其中 event_handler() 调用 drive_machine(),
所以真正的业务逻辑都在 drive_machine() 完成, 这个函数处理 socket
的读写事件, 还能为监听 socket 处理新的连接.
Main Thread 初始化完成的状态:
工作线程的初始化
1 首先创建 n 个工作线程
2 然后为工作线程初始化 event base, 创建通知管道, 并加入 event base,
通知管道的作用在于: 主线程把新来的连接转交给某个线程时,同时向该线程的通知管道发送一个
字符的数据,唤醒该线程去处理连接, 也就是调用 thread_libevent_process 来处理连接.
3 最后创建 CQ_ITEM 队列, 这个队列用于主线程和工作线程的上下文切换, 主线程把新来的连接
封装成 CQ_ITEM, 放到工作线程的 CQ_ITEM 队列, 并唤醒该线程去处理新来的连接.
初始化完成后, 工作线程的状态如下:
下面这幅图是 memcached 整体的架构图:
连接的管理
网络服务器的开发少不了连接的管理, 所谓连接, 是指 connection, 它保存客户端
的 socket 描述符, 还有读和写的 buffer, 以及连接所在的线程 id.
连接是一个结构体, 在 memcached 中定义为 conn, conn 占用一定的内存
空间, 如果服务器对新来的连接都分配 conn 结构体, 内存的分配和回收是一笔
不小的开销, 将影响服务器的性能.
conn 结构体其实可以重复利用的, 连接用完的 conn 可以回收给其他连接用, 所以
服务器有必要维护一个连接池, 来统一管理 conn, 最大限度地重复利用 conn, 避免
不必要的分配.
memcached 的连接管理做得相当简单, 就是维护一个 conn 数组. 如下图所示:
freeconns 是 conn 的二维数组, freecurr指向当前的空闲槽
conn 的分配 -- conn_from_freelist()函数
分配策略很简单, 就是把 freeconns[freecurr -1] 分配出去, 然后 freecurr 指针下移一个单位.
如果 freeconns 没有空闲的 conn, 分配就失败, 函数 conn_from_freelist 返回 NULL, 这时
memcached 就会从操作系统分配内存空间. 事实上 memcached 不会预先给 freeconns
分配一些空闲 conn, conn 都是在系统运行期间按需分配的.
conn的回收
把用完的 conn 挂在 freecurr 所在的槽位.
- 大小: 43.8 KB
- 大小: 8.1 KB
- 大小: 7.7 KB
- 大小: 4.6 KB
- 大小: 9.9 KB
- 大小: 10.1 KB
- 大小: 10.1 KB
- 大小: 49 KB
分享到:
相关推荐
**memcached源码分析** `memcached`是一个高性能、分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升应用性能。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站的响应速度。本文...
通过对Memcached源码的深入分析,我们不仅理解了其核心功能是如何实现的,还掌握了如何更高效地使用它来提升Web应用的性能。了解这些内部细节对于优化应用程序的缓存策略以及故障排查具有重要意义。
4. **Memcached与源码分析** - 源码阅读可以帮助开发者理解Memcached的内存管理、数据结构、网络通信等核心部分,为自定义扩展或优化提供基础。 - Memcached的内存管理采用了slab分配器,将内存划分为不同的slabs...
**Memcached Java源码分析——Performance分支** Memcached是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于缓解数据库的负载。在Java环境中,我们常常使用Java客户端库来与Memcached服务器进行...
易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语法,降低了编程的门槛,使得更多非计算机专业的人也能进行程序开发。...同时,源码分析也有助于提高编程技能,理解网络编程和分布式系统的设计思想。
通过对memcached的线程模型和网络事件处理的分析,我们可以看到其高效的设计:主线程与工作线程的分离,确保了连接建立的快速响应和连接处理的并发性。libevent的事件驱动模型,则使得memcached能够灵活、高效地处理...
1. **网络通信**:memcached 使用libevent库处理网络事件,这是一个非阻塞I/O模型,能够高效地处理大量的并发连接。libevent通过监听套接字,当有新的连接请求或数据可读时,会触发相应的回调函数,使得memcached...
本文将深入探讨Memcached的基本概念、工作原理、安装配置、使用方法以及源码分析。 **一、Memcached基本概念** 1. **缓存**: 缓存是一种存储技术,用于临时存储频繁访问的数据,减少对后端慢速存储(如数据库)的...
**Memcached开源库源码分析** Memcached是一款高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。这个开源库提供了高效的键值存储服务,允许应用程序快速存取临时...
### Memcached源代码分析 #### 一、Memcached概述与背景 Memcached是一个高效、开源、分布式的内存对象缓存系统,旨在通过减轻数据库负担,加速动态Web应用程序的响应速度。它通过在内存中存储键值对的形式缓存...
**memcached1.4.5源代码分析** `memcached`是一种高性能、分布式内存对象缓存系统,用于在Web应用程序中存储数据,以减少数据库负载。它的设计目标是减轻数据库的负担,通过缓存经常访问的数据来提高网络应用的响应...
- 下载Memcached源码包,配置并编译安装。 具体命令如下: ```bash # 安装libevent wget http://www.monkey.org/~provos/libevent/libevent-2.0.21-stable.tar.gz tar xzf libevent-2.0.21-stable.tar.gz cd ...
7. **源码分析**:如果标签中的“源码”是指这部分,那么教程可能包含对`memcached-session-manager`核心组件的源代码分析,帮助开发者理解其工作原理并进行定制。 8. **示例和实践**:教程可能提供实际的代码示例...
本文将针对 Memcached 的1.4版本进行源码分析,探讨其核心设计与实现原理。 1. **整体架构** Memcached 采用客户端-服务器模型,服务器端通过 TCP 或 UDP 协议提供服务,客户端则通过网络调用这些服务。在1.4版本...
Memcached,这个被广泛应用于众多知名互联网公司的分布式内存对象缓存系统,其源代码分析对于提升系统性能和理解其实现原理至关重要。本文将围绕以下几个核心部分进行深入剖析: 一、Memcached的架构设计 ...
- **源码分析**:深入源码可以帮助理解memcached内部机制,例如内存管理、哈希表实现、线程池设计等。源码阅读有助于自定义扩展或解决特定问题。 - **一致性哈希**:一致性哈希解决了分布式环境中动态扩容缩容时...
### 源码分析 深入理解Memcached的源码有助于我们更好地优化和定制服务。源码中包含的主要模块有: 1. **网络通信层**:Memcached使用libevent库处理网络事件,实现非阻塞I/O,保证了高并发下的性能。 2. **内存...
**源码分析** Memcached的源代码简洁明了,对于理解分布式缓存的工作原理和内存管理有很好的学习价值。通过阅读源码,可以深入了解其内部机制,如哈希表的实现、内存分配策略、网络通信细节等。 总结来说,...
"memcached之客户端memadmin安装" 这个标题涉及到的是关于`memcached`的一个客户端工具——`memadmin`的安装过程。`memcached`是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用性能。而`...