【深入浅出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. iOS 链式编程探索(Masonry)

    看了几篇关于链式编程的文章,还是理解的不透彻,我想这可能是因为我自己对block掌握的不熟练. 我已经明白了,所以,和大家分享一下我的理解!如有问题,麻烦大家指出! 直接看代码吧!关键的注释都有. 我 ...

  2. windows 共享文件夹 给 mac

      假设我要共享文件夹A (1)在windows上, 共享该文件夹 (2)然后macbook 和 pc  连接同一个网络 (3)在finder选择连接服务器 (4)输入服务器地址smb://**** ...

  3. JavaScript中严格模式"use strict";需注意的几个雷区:

    1.with语句会抛错误 2.未声明的变量被赋值会报错 3.arguments在严格模式下变为静态,传入的参数与arguments无关系 4.delete会报错 5.对象的重复属性名会报错 6.禁止八 ...

  4. GDB调试汇编堆栈

    GDB调试汇编堆栈 分析过程 C语言源代码 int g(int x) { return x+6; } int f(int x) { return g(x+1); } int main(void) { ...

  5. StatePattern

    class Program { static void Main(string[] args) { var state = new OpeningState(); var lift = new Lif ...

  6. JavaScript-Object基础知识

    1.   定义:对象是JS的核心概念,也是最重要的数据类型.js的所有数据都可以被视为对象.                 对象是一种无序的数据集合,由若干个键值对(key:value)构成,由{ ...

  7. Google Play Store —与google服务器通信时出现问题

    机子:MX4 前几天刷完机后出现登录Google Play Store “与google服务器通信时出现问题”,今天试了好几种方法,来总结一下 1.修改最新Hosts文件 2.SmartHosts   ...

  8. (转)Vsdocman7.2 注册版

    Vsdocman是一个优秀的.NET源代码注释编写工具,方便的以GUI的方式设计.NET源代码的注释.我们只是大自然的搬运工:http://download.csdn.net/detail/iamyg ...

  9. Xamarin的不归路-ios模拟器调整窗口大小

    ios模拟器调整窗口大小:

  10. spring+mybatis+oracle/mysql整合开发需要的jar包详解

    导入spring,mybatis,c3p0,oracle和mybatis提供的与spring整合的插件包   mysql的jar:         mysql-connector-java-5.1.7 ...