UNIX网络编程——网络I/O模型
在学习UNIX网络编程的时候。一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好。
IO分类
IO依据对IO的调度方式可分为堵塞IO、非堵塞IO、IO复用、信号驱动IO、异步IO。
IO操作整个流程分为 可操作推断 和 实际IO操作 两个区间,我们能够称之为两个半程,前半程推断是否可操作,后半程进行实际操作。
当中堵塞IO、非堵塞IO、IO复用、信号驱动IO由于其【实际的IO操作是同步堵塞】的,所以一般把他们归为同步IO,异步IO的实际IO操作是在独立的线程中完毕的,所以称为异步IO。
能够看出,所谓同步异步。针对的是后半程的实际IO。在同步IO中,系统并不主动告诉我们不论什么信息,须要我们去询问。而在异步IO中,系统将主动告诉我们IO已经完毕了。
数据流向
数据是怎样从用户程序传到网络上的呢?
以下以一个进程从内核接收数据到响应再到对方收到响应的过程为例:
内核读数据
->
推数据到用户态
->
切换到用户态
->
应用程序处理数据并构造响应数据
->
推数据到内核态
->
内核打包数据
->
发送数据
->
对方内核对数据拆包
->
推数据到用户态
IO模型介绍
堵塞IO:服务堵塞在数据接收操作上。直到client数据到达并复制到本地进程数据区。比方调用系统调用read之后。假设没数据,则一直停留在内核的系统调用中,直到有数据了才将数据从内核复制到用户空间之后返回用户态。
非堵塞IO:服务不断地往返于用户态和内核态直接。轮询数据是否可读。一旦可读则堵塞的读取数据到本地进程数据区,属于前半程轮询,后半程堵塞模式。
IO复用:前半程堵塞(select堵塞),但仅仅要有一个IO套接字可用则启动后半程读取进程。
信号驱动IO:前半程是一个异步机制,注冊一个信号驱动事件,在数据可读的时候通过SIGIO信号驱动后半程的触发,其和IO复用的差别在于前半程是一个信号驱动机制。
异步IO:调用IO时提供回调函数。IO作为独立线程完毕实际读取及准备工作,到数据复制到本地数据区后通过回调函数调用原调用者进行处理。
UNIX网络编程——网络I/O模型的更多相关文章
- UNIX网络编程——网络IPC:套接字
UNIX网络编程——网络IPC:套接字 Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- JAVA基础知识之网络编程——-网络通信模型(IO模型)
<Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...
- python网络编程——网络IO模型
1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-bl ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- linux网络编程--网络编程的基本函数介绍与使用【转】
本文转载自:http://blog.csdn.net/yusiguyuan/article/details/17538499 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览 ...
- Socket网络编程--网络爬虫(1)
我们这个系列准备讲一下--网络爬虫.网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索引擎提供支持,它决定着整个引擎系统的内容是否丰富, ...
- Unix网络编程(3)——C/S模型几种情况
UNP第五章描述了在客户端和服务器连接建立之后会出现的几种情况,并给出了解决方案,做一个简单的总结. 先给出这个简单的回射C/S程序的模型如下图. 1.客户端和服务器正常终止连接 客户端从标准输入 ...
随机推荐
- git分支拉取
假设你已经配置好了各种SSH Key之类并熟悉基本的git创建分支.提交分支命令.比如共有2个分支,自己在一台未配置origin电脑上想要拉取某个分支(dev)到本地.步骤如下:1.新建git项目 与 ...
- 【译】x86程序员手册24-第7章 多任务
Chapter 7 Multitasking 多任务 To provide efficient, protected multitasking, the 80386 employs several s ...
- Django线上部署教程:腾讯云+Ubuntu+Django+Uwsgi(转载)
网站名称: 向东的笔记本 本文链接: https://www.eastnotes.com/post/29 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议.转载请注明出处! ...
- Extjs查询实现
效果图如上: 页面代码: Ext.QuickTips.init(); //放在图标上会自动提示信息 Ext.define('ExtApp.view.StudentList' , { extend : ...
- cc.Node—事件响应
触摸事件1: 触摸事件类型: START, MOVED, ENDED(物体内), CANCEL(物体外);2: 监听触摸事件: node.on(类型, callback, target(回掉函数的th ...
- JavaScript--小白入门篇2
一.布尔值和关系运算符.逻辑运算符 1.1 布尔值 我们上篇文章说了,学习了两种变量的类型数值型.字符串型. 实际上,还有很多变量的类型.我们今天再学习一种,叫做“布尔类型”. 数值型里面的值 ...
- Crossword Answers UVA - 232
题目大意 感觉挺水的一道题.找出左面右面不存在或者是黑色的格子的白各,然后编号输出一横向单词和竖向单词(具体看原题) 解析 ①找出各个格子的编号 ②对每个节点搜索一下 ③输出的时候注意最后一个数据后面 ...
- MyBatis 的基本要素—SQL 映射文件
MyBatis 真正的强大在于映射语句,相对于它强大的功能,SQL 映射文件的配置却是相当简单.对比 SQL 映射配置和 JDBC 代码,发现使用 SQL 映射文件配置可减少 50% 以上的代码,并且 ...
- Python,subprocess模块(补充)
1.subprocess模块,前戏 res = os.system('dir') 打印到屏幕,res为0或非0 os.popen('dir') 返回一个内存对象,相当于文件流 a = os.popen ...
- Python关于导入模块的一些感想:
写项目的时候,碰到这种情况 程序业务为core,里面有两个目录,core1 和core2 core1中有三个模块,business main main1 程序入口为bin目录下的project ...