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

先说答案

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

(一)基本概念

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

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

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

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

image.png

3、CPU有什么状态?

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

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

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

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

默认线程栈是8M=8192KB

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

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

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

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

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

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

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

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

(三)同步和异步

与消息的通知机制有关

本质区别 现实例子
同步模式 由处理消息者自己去等待消息是否被触发 我去银行办理业务,选择排队等,排到头了就办理。
异步模式 由触发机制来通知处理消息者 我去银行办理业务,取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务。

(四)阻塞与非阻塞

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

标题 本质区别 现实例子
阻塞调用 线程挂起,不能做其他事。 上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息之外不能做其它的事情,那么该机制就是阻塞的。
非阻塞调用 线程活跃,能处理其他事。 在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的。

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

阻塞调用 阻塞调用 非阻塞调用
同步模式 read/write read/write O_NONBLOCK
异步模式 IO复用:select/poll,epoll(LT模式) AIO系列:aio_read,aio_write等;epoll(ET模式)

具体的IO模型,分享的人很多了,这里就不赘述了,在后面的参考链接中,也有链接。

(六)参考链接

1、进程、线程、协程
www.cnblogs.com/Survivalist…

2、select,poll,epoll区别
blog.csdn.net/ithomer/art…

3、Linux异步机制
blog.csdn.net/yechaodechu…

4、linux下进程的进程最大数、最大线程数…
blog.csdn.net/gatieme/art…

5、内存空间与内核空间(User space 与 Kernel space)
www.ruanyifeng.com/blog/2016/1…

6、I/O模型
zhuanlan.zhihu.com/p/43933717

写在最后

推荐一套TS全系列的教程吧。近期在提升TS,收藏了一套很不错的教程,无偿分享给大家
www.yidengxuetang.com/pub-page/in…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享