收藏的博客 -- 高性能Linux服务器

socket:中国大陆翻译为套接字,台湾翻译为插座。感觉插座更容易理解。

https://blog.csdn.net/nsrainbow --- 杨曦,《HBase不睡觉书》作者

http://zhuanlan.51cto.com/columnlist/shenj/ --- 58沈剑

http://blog.csdn.net/analogous_love --- 范蠡&张小方

http://blog.csdn.net/column/details/15700.html --- teamtalk

https://github.com/baloonwj/flamingo --- 范蠡&张小方

http://blog.csdn.net/gatieme

select、poll、epoll之间的区别总结[整理]

TCP面试常见题:张小方的知乎Live:轻松搞定技术面试中常见的网络通信问题

Linux服务器百度面试

《Linux多线程服务端编程:使用muduo C++网络库》学习笔记

我个人的Linux TCP Server测试源码,C语言(★firecat推荐★)


爱奇艺,郑树新

One advanced C/C++ library

https://github.com/acl-dev/acl

https://github.com/acl-dev/libfiber

http://zsxxsz.iteye.com/


腾讯后台开发工程师谈:C++11新特性之future -- ananas

https://github.com/loveyacper/ananas


muduo是一个高质量的Reactor网络库,采用one loop per thread + thread pool架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范。

http://blog.csdn.net/solstice  --- muduo blog

https://github.com/chenshuo/muduo --- muduo官方boost版本

https://github.com/chenshuo/muduo/tree/cpp11 --- muduo官方C++11版本

https://github.com/chenshuo/muduo/tree/cpp98 --- muduo官方C++98版本

发布一个基于 Reactor 模式的 C++ 网络库

多线程服务器的常用编程模型 --- oneloop per thread + threadpool 

muduo库整体架构简析

http://blog.csdn.net/KangRoger/article/category/5679833 muduo源码学习

http://www.cnblogs.com/peimin/category/548834.html muduo源码学习

使用C++11改造muduo

https://github.com/AlexStocks/muduo

发布一个改写自muduo的C++网络I/O库

https://github.com/kimg-bo/kimgbo

http://laiyonghao.com/


开源网络库的分析libevent muduo nginx ....


C/C++语言版本的http server和client,请关注

http://blog.csdn.net/libaineu2004/article/details/78490165


cpp-netlib

http://cpp-netlib.org/

https://github.com/cpp-netlib


360 evpp

https://github.com/Qihoo360/evpp


libuv

https://github.com/libuv/libuv


ec是基于libevet的C++11封装

https://git.oschina.net/havesnag/ec

TCP 的那些事儿(上)

TCP 的那些事儿(下)


mysql连接池

c++ 实现数据库连接池

数据库连接池c++ (msyql) mysql connector c++ 的使用

基于Mysql Connector(C++)的数据库连接池的实现

redis+mysql数据同步(协同)C/C++实现


好书推荐:

Linux高性能服务器编程(Linux服务器编程领域经典著作,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想)
作者:游双
出版社:机械工业出版社
出版时间:2013年06月

http://download.csdn.net/download/analogous_love/9673008

http://download.csdn.net/download/libaineu2004/9972759

Linux多线程服务端编程:使用muduo C++网络库
作者:陈硕

出版社:电子工业出版社

出版时间:2013年01月

https://www.amazon.cn/dp/B00FF1XYJI

https://github.com/chenshuo/muduo

《TCP/IP详解 卷1:协议》在线阅读版

http://www.52im.net/topic-tcpipvol1.html

Nginx完全开发指南:使用C、C++和OpenResty
作者:罗剑锋 著
出版社:电子工业出版社
出版时间:2017年05月 

------

多线程编程模型

在学习muduo网络库前,应该先熟悉一下多线程网络服务编程模型。在6.6.2节介绍了11种方案。方案0到方案4用的是阻塞I/O。方案5到方案11用的都是非阻塞I/O。

方案0: accept+read/write

方案0不是并发模型,只是一个循环处理。用代码表示的话,可以表示为:

while(true)
{
    int fd=accept(……);
    read(fd,……) or write(fd……);
    close(fd);
}

一次只能处理一个连接,第一个连接处理完毕后,才可以进入下一次循环,否则阻塞在I/O的read或write上。

方案1 accept+fork

这是个并发模型,这个模型比较简单,在accept后,fork一个子进程,在子进程处理连接。可以表示为:

while(true)
{
    int fd=accept(linstenFd,……);
    int pid=fork();
    if(pid==0)//child
    {
        close(listenFd);
        read/write(fd……);
        close(fd);
    }
    //Parent
    close(fd);
}

这个模型中要注意的是,要在子进程关闭监听的fd,在父进程关闭到来连接的fd。

方案2 accept+thread

这个方案和方案1类似,只是这个方案中是通过新建了线程来处理连接,方案1是通过新建线程来处理连接。

void ProcessIO(void* arg)
{
    int fd=*static_cast<int *>arg;
    read/wire(fd,……);
    close(fd);
}

void ProcessAccept()
{
    while(true)
    {
        int fd=accept(……);
        pthread_create(……, NULL, ProcessIO, &fd);
    }
    }
}

先调用ProcessAccept等待连接,如果有连接,则创建新线程来调用ProcessIO,把新建连接的fd传给这个函数。

方案3 prefork

这个和方案1类似,只是先创建好进程。当有连接到来时,可以马上使用这些进程。具体可以参考http://www.t086.com/code/apache2.2/mod/prefork.html

方案4 pre thread

这和方案2类似,先创建好线程,等连接到来时,省去了创建线程的开销。

方案5 poll(reactor):非阻塞IO+IO复用

这个方案是基于I/O复用的select/poll/epoll;复用的是进程,不是I/O。这是一个单线程/进程的方案,在I/O事件到达后,直接在当前线程/进程处理I/O。单线程/进程的Reactor模式,在处理当前I/O事件时,如果有新的I/O事件到来,不能及时响应。这样事件的优先级不能得到保证。

Lighttpd,libevent,libev采用这种方案。

方案6 reactor+thread-per-task

这个方案是为每一个I/O事件创建一个线程,在新建的线程中处理I/O事件。注意,这里是为每个I/O事件创建一个线程,而不是为每个连接创建线程。这样一来,每个新建线程处理的I/O事件的结果会有out-of-order的可能,即多次处理后的顺序和请求顺序未必一直了。

方案7 reactor+worker thread

为了避免方案6中的out-of-order的问题,在这个方案中,为每个连接创建一个线程。但是线程数目受限于CPU。

方案8 reactor+thread pool

这个方案是,在reactor线程中,等待I/O事件,当I/O事件到来时,在thread pool中取出一个线程(不是新创建)来处理I/O事件。

方案9 reactors in threads 
muduo和Netty采用的是这种方案。在一个main Reactor中负责accept,之后把建立的连接fd放到sub Reactor中,这个连接的所有操作都在sub Reactor中完成。这个方案的特点是one loop per thread,有多个thread。

方案10 reactors in process

这个是Nginx的方案,连接之间无交换时,这是很好的解决方案。Nginx每个工作进程都有一个event loop。

方案11 reactors+thread pool

这是方案8和方案9的混合体。即使用多个Reactor,有的负责accept,有的负责I/O事件的到来。再使用线程池,处理I/O事件。

更多的介绍请参见《Linux多线程服务端编程:使用muduo C++网络库》第3章。

1、必须用单线程的场合:程序需要fork;限制CPU占有率;

2、单线程优缺点:简单,但是事件没有优先级处理机制;


Linux C/C++学习:

源码学习:redis,Nginx,mosquitto,skynetteamtalklibuv,libevent,muduo,evpp,网狐棋牌6603源码,电驴,Gh0st,郑树新acl,ananas

工具学习:cmake,keepalived/LVS,haproxy,CDN,kafka,log4xx,OpenResty,HBase,tengine

语言学习:luashell

书籍学习:

tcp/ip详解 第1卷,UNP,APUE,TCP/IP协议族

《编程珠玑第2版·修订版》

《编程珠玑(续)(修订版)》

UNIX Network Programming》 -- UNP

《Advanced Programming in the UNIX® Environment》 -- APUE

《编程之美——微软技术面试心得》 

《剑指OFFER:名企面试官精讲典型编程题(第2版)》 

《数据结构(C语言版)(第2版) 严蔚敏 李冬梅 吴伟民 (编著)》
http://www.ryjiaoyu.com/book/details/3489

https://download.csdn.net/download/libaineu2004/10411905

《数据结构习题解析与实验指导 李冬梅 张琪 (编著)》

http://www.bjfuacm.com/structure/

算法:C语言实现 (第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)

《妙趣横生的算法(C语言实现) 第2版》

数据结构与算法分析:C语言描述(原书第2版)

《程序员代码面试指南:IT名企算法与数据结构题目最优解》

《程序员面试宝典(第5版)》

网站学习:

https://leetcode.com/

https://www.nowcoder.com/ 牛客网

http://zhedahht.blog.163.com/ 何海涛,剑指offer blog

https://github.com/zhedahht/CodingInterviewChinese2 何海涛,剑指offer code

微信公众号:架构师之路,沈剑


猜你喜欢

转载自blog.csdn.net/libaineu2004/article/details/76906574
今日推荐