【深入浅出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. java方法重载(overload)、重写(override);this、super关键简介

    一.方法重载: 条件:必须在一个类中,方法名称相同,参数列表不同(包括:数据类型.顺序.个数),典型案例构 造方重载.  注意:与返回值无关 二.方法重写: 条件: (1)继承某个类或实现某接口 (2 ...

  2. JavaScript数组去重的几种方法

    这个老问题,网上普遍都有了,为什么要再写一遍呢,主要是为了记个笔记... 遍历时搜索结果数组 思路很明确,如下 新建一个数组存放结果 循环遍历原数组,对于每一个元素,在结果数组中搜索是否存在 若不存在 ...

  3. iOS单元格高度计算

    // Created by mac on 16/6/29. // Copyright © 2016年 zcc. All rights reserved. // #import "HotCel ...

  4. @autowired和@resource的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自 动注入罢了.@Resource有两个属性是比较重要的, ...

  5. 浏览器兼容性-JS篇

    总结一下平时遇到的浏览器兼容性问题,本篇关于JS. 1.事件绑定 兼容写法: function add(obj,event){ if (obj.addEventListener) { obj.addE ...

  6. toroiseSVN 无法连接服务器,提示unable connect to ……url 参数错误

    之前使用的好好的,有天突然提示无法连接repository url,能ping通服务器,就是一直报错,找了很多方法,如: 1.删除缓存及缓存文件 2.删除软件并重新安装 3.关闭windows防火墙 ...

  7. 编译安装PHP的参数 --with-mysql --with-mysqli --with-apxs2默认路径

    编译安装PHP时指定如下几个参数说明: --with-apxs2=/usr/local/apache/bin/apxs //整合apache,apxs功能是使用mod_so中的LoadModule指令 ...

  8. C# WinForm 导出导入Excel/Doc 完整实例教程[使用Aspose.Cells.dll]

    [csharp] view plain copy 1.添加引用: Aspose.Cells.dll(我们就叫工具包吧,可以从网上下载.关于它的操作我在“Aspose.Cells操作说明 中文版 下载 ...

  9. ASP.NET Core 十种方式扩展你的 Views

    原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savor ...

  10. TCP/IP, WebSocket 和 MQTT

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP和MQTT是应用层的协议.在这三者之间, TCP是HTTP和MQTT底层的协议.大家对HTTP很熟悉,这里简要介绍下MQTT.M ...