【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
【深入浅出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网络编程】 "开篇 -- 知其然,知其所以然"的更多相关文章
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- 【深入浅出Linux网络编程】 “实践 -- TCP & UDP”
通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回 ...
- Linux网络编程&内核学习
c语言: 基础篇 1.<写给大家看的C语言书(第2版)> 原书名: Absolute Beginner's Guide to C (2nd Edition) 原出版社: Sams 作者: ...
- Linux网络编程必看书籍推荐
首先要说讲述计算机网络和TCP/IP的书很多. 先要学习网络知识才谈得上编程 讲述计算机网络的最经典的当属Andrew S.Tanenbaum的<计算机网络>第五版,这本书难易适中. &l ...
- 很全的linux网络编程技巧
本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ...
- Linux网络编程经典书籍推荐
UNIX环境高级编程<高级unix环境编程><unix网络编程><深入理解计算机系统>比较好 =====================Linux网络编程经典书籍推 ...
- TCP/UDP Linux网络编程详解
本文主要记录TCP/UDP网络编程的基础知识,采用TCP/UDP实现宿主机和目标机之间的网络通信. 内容目录 1. 目标2.Linux网络编程基础2.1 嵌套字2.2 端口2.3 网络地址2.3.1 ...
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
随机推荐
- http错误代码含义中英文对照
Http错误代码含义中文 概要当用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字 ...
- XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
A. Associated Vertices 首先求出SCC然后缩点,第一次求出每个点能到的点集,第二次收集这些点集即可,用bitset加速,时间复杂度$O(\frac{nm}{64})$. #inc ...
- mac 关于使用protobuf出现ld: symbol(s) not found for architecture x86_64的问题
主要是编译时没有添加protobuf库文件 g++ -o Writer.o lm.helloworld.pb.cc Writer.cpp -L/usr/local/lib -lprotobuf
- 免费制作gif图片工具
怎样制作gif图片在你的blog里面呢? 今天给大家推荐一款免费的gif制作软件:GifCam 上面用到的下载地址: http://downloads.tomsguide.com/GifCam,030 ...
- HDU 1907 Nim博弈变形
1.HDU 1907 2.题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输. 3.总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 分析:经典的Nim博弈的一点变形. ...
- 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.
说明 为何要写这篇文章 ,之前看过阿二的梦想船的<Poco::TCPServer框架解析> http://www.cppblog.com/richbirdandy/archive/2010 ...
- AmazeUI 框架知识点-布局和样式整理
1.Amaze UI 将所有元素的盒模型设置为 border-box.这下好了,妈妈再也不用担心没计算好 padding.border 而使布局破相了. 2.Amaze UI 将浏览器的基准字号设置为 ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- Spark优化之二:集群上运行jar程序,状态一直Accepted且不停止不报错
如果运行Spark集群时状态一直为Accepted且不停止不报错,比如像下面这样的情况: 15/06/14 11:33:33 INFO yarn.Client: Application report ...
- 有关于canvas几个新知识点
对于canvas的初学者来说,以下几点应该是不知道的知识点: 1.canvas有兼容IE6/7/8的脚本文件 下载地址:https://github.com/arv/explorercanvas 2. ...