先说答案
因为资源有限,多线程的目的是为了最大限度的利用CPU资源。
(一)基本概念
1、Linux的底层是单进程,还是多进程?
答案:用单线程实现了多任务。
2、进程、线程、协程的区别是什么?
- 进程(process)是资源分配的最小单位,线程(thread)是处理机调度的最小单位。进程是由一个或多个线程组成的。
- 线程:初始单位为8MB,固定不可变;由 内核完成
- 协程:初始一般为 2KB,可随需要而增大;由用户完成
3、CPU有什么状态?
- 内核态:Linux文件子系统,I/O读写磁盘;发送HTPP请求;
- 用户态:
- 内核态和用户态的切换
(二)为什么资源有限,需要学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模型,这里就不赘述了。