七叶笔记 » golang编程 » 为什么要学IO模型(同步阻塞,异步非阻塞)?

为什么要学IO模型(同步阻塞,异步非阻塞)?

先说答案

因为资源有限,多线程的目的是为了最大限度的利用CPU资源。

(一)基本概念

1、Linux的底层是单进程,还是多进程?

答案:用单线程实现了多任务。

2、进程、线程、协程的区别是什么?

  • 进程(process)是资源分配的最小单位,线程(thread)是处理机调度的最小单位。进程是由一个或多个线程组成的。
  • 线程:初始单位为8MB,固定不可变;由 内核完成
  • 协程:初始一般为 2KB,可随需要而增大;由用户完成

3、CPU有什么状态?

  1. 内核态:Linux文件子系统,I/O读写磁盘;发送HTPP请求;
  2. 用户态:
  3. 内核态和用户态的切换

(二)为什么资源有限,需要学IO模型?

1、系统中LINUX中单个进程理论上可以创建的最大线程数是多少?

以32 位 linux 为例,答案是381个。

32 位 linux系统 进程用户空间是 3G 的大小,也就是 3072M 用3072M/8M=384。

但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程。

nofile进程最大打开文件描述符数65535

2、一个进程可以包含多个线程(381个),所以实际课执行进程会少很多。

而一个项目运行时,会有很多客户端并发请求服务器,假定有100个用户并发请求,每个请求有5个线程处理,直接就把系统整崩溃了。

那么如何处理高并发,也就是处理网络IO呢?

这就是我们为什么要学习IO模型的原因—— 可以通过优化网络IO来提高并发(资源的利用率)

以下是学习IO模型的几个重要概念:

(三)同步和异步

与消息的通知机制有关

本质区别

现实例子

同步模式

由处理消息者自己去等待消息是否被触发

我去银行办理业务,选择排队等,排到头了就办理。

异步模式

由触发机制来通知处理消息者

我去银行办理业务,取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务。

相关视频推荐

学习地址:

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括 C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg 等),免费分享

(四)阻塞与非阻塞

与线程等待消息(无所谓同步或者异步)时的状态有关。

标题

本质区别

现实例子

阻塞调用

线程挂起,不能做其他事。

上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的。

非阻塞调用

线程活跃,能处理其他事。

在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的。

(五)它们之间的组合应用举例:

阻塞调用

阻塞调用

非阻塞调用

同步模式

read/write

read/write O_NONBLOCK

异步模式

IO复用:select/poll,epoll(LT模式)

AIO系列:aio_read,aio_write等;epoll(ET模式)

具体的IO模型,这里就不赘述了。

相关文章