随笔分类 -  c/c++

摘要:在上一篇中已分析了memcached线程池的创建流程,由于上篇篇幅较长,因此将memcached线程池中线程的调度流程另立一篇。先让我们把目光转到主函数中,主线程在调用thread_init函数创建好线程池后,就开始创建监听套接字,memcached支持TCP,UDP,UNIX域套接字,因此相应的要创建三种监听套接字这里我们只分析TCP listening socket的创建(UDP与TCP的创建采用统一的接口),函数入口为:1 errno = 0;2 if (settings.port && server_sockets(settings.port, tcp_transp.. 阅读全文
posted @ 2012-07-10 18:54 Moon_Bird 阅读(3601) 评论(0) 推荐(1)
摘要:已经个把月没有写长篇博文了,最近抽了点时间,将memcached源码分析系列文章的线程机制篇给整出来,在分析源码的过程中参考了网上的一些资源。该文主要集中于两个问题:(1)memcached线程池是如何创建的,(2)线程池中的线程又是如何进行调度的。一切从源码中找答案。memcached的线程池模型采用较典型的Master-Worker模型:(1)主线程负责监听客户端的建立连接请求,以及accept 连接,将连接好的套接字放入连接队列;(2)调度workers空闲线程来负责处理已经建立好的连接的读写等事件。1 关键数据抽象(1)memcached单个线程结构的封装 1 //memcached线 阅读全文
posted @ 2012-07-10 16:26 Moon_Bird 阅读(8530) 评论(0) 推荐(1)
摘要:此文资料来自CU的一篇精华帖,将static的知识总结的比较全面到位,故整理来与大家分享。通常理解static只是指静态存储的概念,事实上在c++里面static包含了两方面的含义。1)在固定地址上的分配,这意味着对象是在一个特殊的静态区域上创建的,而不是每次函数调用的时候在堆栈上动态创建的,这是static的静态存储的概念。2) 另一方面,static能够控制对象对于连接器的可见性。一个static对象,对于特定的编译单元来说总是本地范围的,这个范围包括本地文件或者本地的某一个类,超过这个范围的文件或者类是不可以看到static对象的,这同时也描述了连接的概念,它决定连接器能够看到哪些名字。 阅读全文
posted @ 2012-05-21 10:32 Moon_Bird 阅读(2558) 评论(0) 推荐(4)
摘要:高性能的网络服务器需要同时并发处理大量的客户端,而采用以前的那种对每个连接使用一个分开的线程或进程方法效率不高,因为处理大量客户端的时候,资源的使用及进程上下文的切换将会影响服务器的性能。一个可替代的方法是在一个单一的线程中使用非阻塞的I/O(non-blocking I/O)。 这篇文章主要介绍linux下的epoll(7)方法,其有着良好的就绪事件通知机制。我们将会使用C来展现一个完整的TCP服务器实现代码。Epoll是被linux2.6开始引进的,但是不被其他的类UNIX系统支持,它提供了一种类似select或poll函数的机制:1.Select(2)只能够同时管理FD_SETSIZE. 阅读全文
posted @ 2012-03-17 21:42 Moon_Bird 阅读(28214) 评论(2) 推荐(1)
摘要:译自:http://accu.org/var/uploads/journals/overload101.pdf 在多线程应用程序中,要求消息输入队列和消息输出队列顺序要求保持一致,而忽略多线程并发处理的顺序,这种情况是比较难处理的。在本文中,作者设计了一种新型解决方案:PRQueue(预留位置队列),较很好的解决这个问题。 PRQueue是使用c++的两个STL的deque还有pthread线程库实现的,并且在例子中使用了两个简单的类-Mutex和Lock来展示这个逻辑。StringMsg类表现一个样本消息,QueueTest类用来测试。 我选择STL的deque是因为deque拥有很多必要的 阅读全文
posted @ 2012-03-12 13:58 Moon_Bird 阅读(726) 评论(0) 推荐(0)
摘要:译自:http://accu.org/var/uploads/journals/overload104.pdf 这篇文章提供了一种C++模板解决方案来确保在多线程程序中同步访问变量。当我们使用c++编写多线程程序的时候,我们一般会采用如下的模型:#include <mutex> using namespace std; class Person { public: string GetName() const { unique_lock<mutex> lock(mutex); return mutex; } void SetName(const string& 阅读全文
posted @ 2012-03-06 14:39 Moon_Bird 阅读(1476) 评论(0) 推荐(0)
摘要:一 什么是CGI CGI(The Common Gateway Interface):通用网关接口,定义web服务器和客户脚本进行信息交互的一系列标准。二 web浏览器 为了了解CGI的概念,让我们来看看当我们单击一个超链接来浏览一个特定的web页或URL的时候,背后会发生什么事? (1)浏览器首先会链接HTTP web 服务器并且请求一个URL 页面; (2) WEB服务器将会解析这个URL并且查询请求的文件名,如果找到了请求文件服务器就会将这个文件发送回浏览器,否则发送回一个包含错误信息提示的页面指示你请求的是一个服务器并不包含的文件。(3)WEB浏览器将接受来自服务器端的响应,并且向发出 阅读全文
posted @ 2012-02-22 10:50 Moon_Bird 阅读(18171) 评论(4) 推荐(4)