ASP.NET Core MVC I/O编程模型
1.1. I/O编程模型浅析
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:
(1)同步阻塞IO(Blocking IO):即传统的IO模型。
(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。
(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。
(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。
同步和异步的概念描述的是用户线程与内核的交互方式:
同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;
异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。
阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:
阻塞是指IO操作需要彻底完成后才返回到用户空间;
非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。
1.2. 同步阻塞I/O
同步阻塞I/O模型是最简单的I/O模型,用户进程在进行I/O操作时被阻塞,如下图所示:

在ASP.NET Core中没有使用多线程或加入异步关键字的模型均为同步阻塞I/O
public IActionResult Sync()
{
var start = DateTime.Now;
Add();
return Json("start:"+start+"||| end:" + DateTime.Now);
}
void Add()
{
Thread.Sleep(2000);
Console.WriteLine(DateTime.Now);
}

1.3. 同步非阻塞I/O
在同步非阻塞整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性

在ASP.NET Core 中可以使用多线程来实现同步非阻塞,在如下代码清单中可以看到,使用多线程调用一个会自动休眠2秒的方法,主线程Sync会先返回值,而不会阻塞。
public IActionResult Sync()
{
var thread = new Thread(new ThreadStart(this.Add));
thread.Start();
return Json(DateTime.Now);
}
void Add()
{
Thread.Sleep(2000);
Console.WriteLine(DateTime.Now);
}

而子线程由于被阻塞了2秒,因此时间为:

如果想在同步非阻塞的情况下获得返回的数据,就需要轮询,重复的对线程请求。代码清单中使用while循环轮询线程。
public IActionResult Sync()
{
short num = 10;
var thread = new Thread(new ParameterizedThreadStart(this.Add));
thread.Start(num);
while (thread.IsAlive) ;
return Json(DateTime.Now + "result:" + result);
}
void Add(object num)
{
Thread.Sleep(2000);
this.result =(short)num ;
Console.WriteLine(DateTime.Now);
}

1.4. 异步I/O
真正的异步IO需要操作系统更强的支持。在异步IO模型中,当用户线程收到通知时,数据已经被内核读取完毕,并放在了用户线程指定的缓冲区内,内核在IO完成后通知用户线程直接使用即可。

public IActionResult Async()
{
var start = DateTime.Now;
short num = 10;
var result = Add(num).Result;
return Json("start:"+ start +" end: " + DateTime.Now + " ||| result: " + result);
}
async Task<short> Add(short num)
{
await Task.Delay(2000);
return ++num;
}

关于异步的更详细的使用可参看 http://www.cnblogs.com/vipyoumay/p/5663950.html
1.5. 总结
1.同步与异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个 调用 时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。
2. 阻塞与非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关
【1】http://www.jianshu.com/p/77332a3b07b5
【2】http://kb.cnblogs.com/page/85931
【3】https://www.zhihu.com/question/19732473
ASP.NET Core MVC I/O编程模型的更多相关文章
- ASP.NET Core MVC 中的 Model 模型
ASP.NET Core MVC 中的 Model 我们希望最终从 Student 数据库表中查询特定的学生详细信息并显示在网页上,如下所示. MVC 中的模型包含一组表示数据的类和管理该数据的逻辑. ...
- ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET Core MVC/WebAPi 模型绑定探索 转载https://www.cnblogs.com/CreateMyself/p/6246977.html
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- 【转】ASP.NET Core MVC/WebAPi 模型绑定探索
前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...
- ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core MVC 设计模式 上一章节中,我们提到 ASP.NET Co ...
- ASP.NET Core MVC 模型绑定用法及原理
前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- ASP.NET Core MVC 之模型(Model)
1.模型绑定 ASP.NET Core MVC 中的模型绑定将数据从HTTP请求映射到操作方法参数.参数既可以是简单类型,也可以是复杂类型.MVC 通过抽象绑定解决了这个问题. 2.使用模型绑定 当 ...
- ASP.NET Core MVC 模型绑定 (转载)
ASP.NET Core MVC的Model Binding会将HTTP Request数据,以映射的方式对应到参数中.基本上跟ASP.NET MVC差不多,但能Binding的来源更多了一些.本篇将 ...
随机推荐
- apache2修改用户和组
grep nobody /etc/{passwd,group} groupadd nobody #有nobody用户的情况 usermod -G nobody nobody #没有nobody用户的情 ...
- JavaScript关于js垃圾回收
js中会自动回收那些我们不使用的变量 一般回收算法用的是一个回收器, 这个回收器周期性的遍历程序运行中的所有变量, 并且给这些变量所引用的值做上一个标记, 如果被引用的值是一个对象或是一个数组, 那么 ...
- cn_office2016
office 2016是可用激活器激活的,但是激活office 365就有点困难了. 附上office 2016下载地址:http://pan.baidu.com/s/1pLTqPyr 破解机:htt ...
- ASP.NET Core MVC Tag Helpers 介绍
简介 Tag Helpers 提供了在视图中更改和增强现有HTML元素的功能.将它们添加到视图中,会经过Razor模板引擎处理并创建一个HTML,之后再返回给浏览器.有一些Tag Helpers,其实 ...
- mybatis深入理解之 # 与 $ 区别以及 sql 预编译
mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...
- 常用颜色RGB、灰度值
128/0/0 深红 255/0/0 红 255/0/255 粉红 255/153/204 玫瑰红 153 ...
- HDU字符串基础题(1020,1039,1062,1088,1161,1200,2017)
并不是很精简,随便改改A过了就没有再简化了. 1020. Problem Description Given a string containing only 'A' - 'Z', we could ...
- 【head first python】2.共享你的代码 函数模块
#coding:utf-8 #注释代码! #添加两个注释,一个描述模块,一个描述函数 '''这是nester.py模块,提供了一个名为print_lol()的函数, 这个函数的作用是打印列表,其中可能 ...
- iOS tableview group时头尾视图间隔大小
解决: 一,当使用tableview的格式为group时 1.先设置 tableview.sectionHeaderHeight = 0.00001; tableview.sectionFooterH ...
- 强密码和弱密码并没有什么区别?NIST密码安全标准更新:不再建议密码要求混合大写字母、字符和数字
作为一名认真负责的小编,每次注册账号设置密码的时候都是最痛苦的,太简单的怕被破解,太难的又记不住. 等你好不容易记住密码,三个月后IT同学过来拍拍你的肩膀,"你的密码到期了,记得改啊--&q ...