【深入浅出Linux网络编程】是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程。

连载包含4篇,会陆续编写发出,欢迎持续关注,分别如下:

 1,开篇 -- 知其然,知其所以然

 2,基础 -- 事件触发机制

3,实践 -- TCP & UDP

4,应用 -- 基于轮子造汽车

  

该连载博客假设读者对Linux网络编程充满了学习兴趣,并且清楚的明白学习Linux网络编程能够解决什么问题,从而可以将博客重点放在内容本身,而不是泛泛的概念普及。


 

【懵懂】在学习博客之前,你对网络编程的认识也许是这样的(至少曾经是这样的): 

int main()
{
while () {
fd = accept();
while () {
request = recv(fd);
...
...
send(fd, response);
if (fd has error)
break;
}
close(fd);
}
...
...
...
}

这段代码在main函数中执行, 只能管理一个连接, 除非这个连接断开才会处理下一个连接,实在太糟糕了。


【青涩】为了改变这个糟糕的现状,你也许会试着在这个实现的基础上进行拓展,代码看起来是这样的: 

void *thread(void *arg)
{
int listen_fd = *(int *)arg;
while () {
fd = accept();
while () {
request = recv(fd);
...
...
send(fd, response);
if (fd has error)
break;
}
close(fd);
}
...
...
} int main()
{
int listen_fd;
...
listen(listen_fd); for (..)
{
pthread_create(thread, &listen_fd)
}
...
...
}

这段代码中,你将原本main中的代码粘贴到了线程函数里,然后启动了若干个线程执行处理,程序同一时刻能够处理的连接数不再仅限于1个了,启动10个线程就可以支持10个连接在线,的确很奏效。  

在这个设计下,为了支撑10000个连接同时在线,你需要启动10000个线程,是否可行呢。线程是需要由一颗CPU执行指令才能运转的,如果你的计算机只有2个CPU核心,那么同一时刻其实只能执行2个线程,其他9998个线程其实都在等待CPU资源。

Linux内核是分时系统,会保证给每一个线程都一小段时间片去执行代码,这个时间片必须足够短才能保证所有线程都及时得到执行以便对用户看来像是真的并发处理一样。CPU从一个线程执行切换到另一个线程执行是需要保存各种执行上下文的,需要花费一定的时间。

可以想象10000个线程争夺2个CPU的惨烈情景,线程切换花费的时间比线程获取的时间片还要长,带来的代价就是系统好忙,响应好慢,这太悲剧了!


举这两个例子,相信能代表绝大多数学习网络编程同学的学习足迹。在这个槛上,你迷茫过停留过试着突破过,听到过“异步”,“高并发”,“select”,“epoll”等等词汇,搜寻过各种博客,书籍去学习这些知识,但绝大多数介绍都太粗糙,根本无法指导实践。

【成长】跟随本系列博客,你将顺利的掌握Linux网络编程,并且有实实在在的网络库代码可以效仿学习,上面的问题将不再困扰你,让我们从“基础 -- 事件触发机制” 开始吧~

【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"的更多相关文章

  1. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  2. 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”

    通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...

  3. Linux网络编程&内核学习

    c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...

  4. Linux网络编程必看书籍推荐

    首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...

  5. 很全的linux网络编程技巧

    本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...

  6. Linux网络编程经典书籍推荐

    UNIX环境高级编程<高级unix环境编程><unix网络编程><深入理解计算机系统>比较好 =====================Linux网络编程经典书籍推 ...

  7. TCP/UDP Linux网络编程详解

    本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...

  8. 【linux草鞋应用编程系列】_5_ Linux网络编程

    一.网络通信简介   第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章.   二.linux网络通信     在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...

  9. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

随机推荐

  1. update maven之后jre被改成1.5的问题

    在 pom.xml 中添加如下代码: <build> <plugins> <plugin> <groupId>org.apache.maven.plug ...

  2. 分布式大数据高并发的web开发框架

    一.引言 通常我们认为静态网页html的网站速度是最快的,但是自从有了动态网页之后,很多交互数据都从数据库查询而来,数据也是经常变化的,除了一些新闻资讯类的网站,使用html静态化来提高访问速度是不太 ...

  3. 用PS如何把图片调出时尚杂志色

    摘自:http://www.3lian.com/edu/2013/07-22/83061.html 01:打开图片,执行调整图层-色彩平衡;调整图层的标记-红色方框内图标. 02:色彩平衡-设置-点选 ...

  4. ACM ICPC Vietnam National Second Round

    A. Stock Market 枚举哪一天买入,哪一天卖出即可. #include<cstdio> #include<algorithm> using namespace st ...

  5. js学习笔记

    javacript笔记根据EC5.0一共有六种数据类型:number,string,bool undefine,nullobject(广义的) --->object(狭义的),array,fun ...

  6. window.onload和$(document).ready(function(){})的区别

    前段时间在面试之前查找并整理了一下window.onload和$(document).ready(function(){})区别,今天有时间更到我的博客上,由于本人资历尚浅,如有不对的地方,还请指正. ...

  7. WCF自动添加消息头

    客户端自定义消息查看器实现IClientMessageInspector接口在消息发送之前添加消息头 class ClientMessageInspector : System.ServiceMode ...

  8. BOM DOM Event事件笔记....

    js//获取文件标题 document.body //body document.title //网页标题 document.doctype//文档对象 document.url//路径 //服务器相 ...

  9. SpringMVC4 实例

    之前我先创建普通web项目,再直接添加maven框架.结果springMVC框架一直不能正确的访问控制器. 但通过以下方式创建maven web项目就能获得正确的架构路径. 1.新建一个maven项目 ...

  10. php面试 1013总结

    面试题1:http://www.docin.com/p-288430879.html 数据库优化: session和cookies区别 缓存系统有哪些 myisam和InDB读写区别 varchar和 ...