【学习笔记】进程、线程、协程及进程间通信
1>进程
进程是系统进行资源分配的最小单位,有独立的内存空间相对稳定、安全,上下文切换开销大
2>线程
线程是进程的一个实体,是cpu调度的基本单位,比进程更小,且可独立运行,它自己只拥有一点系统资源,与线程通过共享内存通信,上下文切换资源消耗少,但容易丢失数据,与其他线程共享进程拥有的全部资源
一个线程至少占用4MB系统内存
3>协程
一个进程可以拥有多个协程,一个线程也可以拥有多个协程,使用协程可以减少线程切换消耗,在一个线程中可以有多个协程,协程可以决定自己的执行情况以及是否切换。
但是一个进程同时只能运行一个协程,是并发,但不可并行,具体还是在IO密集型任务下通过AIO增加效率。而且协程可以让线程切换需执行的任务而不是只能从上至下执行(线程可以通过goto实现,但抽象成协程更容易理解)
进程间的通信
①管道
存在于内存中的类似文件的东西,可以被进程读写
②消息队列
在内核中的消息队列
③信号量
共享资源的锁
④共享内存
多个进程共享一个给定的存储区
⑤sokect套接字
可用于同电脑进程通信,不过一般用来做不同IP之间的通信。
【套接字是网络通信的端点,上接应用程序,下接通信协议,套接字表示为(127.0.0.1:2312)】
接通流程:服务端监听->客户端请求->建立连接
进程IO步骤
①进程向操作系统发出IO请求
②操作系统将数据加载至内核缓冲区
③操作系统将内核缓冲池数据复制到用户进程缓冲区
④用户进程拿到数据完成处理
三种IO方式
BIO:传统方式,在IO操作中阻塞
NIO:使用多路复用模式,通过selector不断轮询每个channel,如果有channel准备好了,则开始处理
AIO:使用异步IO模式,提前写好数据准备好了之后执行的回调函数,系统会在数据准备好后自动调用
Linux网络IO模型
①阻塞IO
用户进程调用IO操作,内核准备数据给用户进程,期间用户进程死等
②非阻塞IO
用户进程发出IO请求后,会一直询问内核是否准备好数据
③多路复用IO
用户进程一次性给IO发出多个IO请求,只要一个IO请求内核准备好了数据,用户进程就可以立马处理
④异步IO
用户进程在发出IO操作后去做别的事情,内核准备好数据后自动通知用户进程