首先进程的出现就是由于程序在遇到要跳转执行其他程序而导致寄存器被污染而形成程序执行状态的不可再现性。
进程的出现使得程序交替执行成为可能,这就是所谓的并发, 并行就是在多个逻辑处理单元中同一时刻执行。
有时候也不要过于盲目的使用多进程或者多线程来实现并发,尤其在服务器编程的时候,因为如果程序是计算密集型的话,过多的上下文切换陷入内核会导致cpu忙于进行上下文切换而没有做一些我们认为有用的事,使得效率降低。但是如果是IO密集型 像web服务器,由于硬件的限制,IO操作的速度远远没有CPU快,所以会导致CPU在那里空等,所以此时就要当前的进程让出CPU给其他进程执行,这样CPU就可以做一些我们认为有意义的事情,虽然有上下文切换的开销,但是总比在哪里什么也不干来的效率高吧!
常见的并行编程 有多进程 和多线程
一般来说并发模式就是一个IO处理单元和多个逻辑处理单元协调完成任务的方法
所以出现了两种并发模式:
半同步 /半异步
这里的同步是程序的执行按照代码的顺序执行(我自己称作主动做事情)
这里的异步是程序的执行需要由系统时间来驱动,常见的驱动事件有信号和中断等(我自己称作被动做事情)
按照同步执行的线程叫做同步线程 反之叫异步线程
同步线程逻辑简单,但是实时性比较差,效率比较低
异步线程因为线程多处理的是IO事件都是一些随机的事件,所以通过异步的通知可以有很强的实时性,但是程序相对比较复杂,要处理通知方法等
所以对于服务器这种需要即使的给予客户端响应的实时性 又要同时处理多个客户请求的应用程序,我们就是要使用同步线程和异步线程结合的并大模型来实现
异步线程用来处理IO事件 监听到客户请求后就封装成一个对象插入请求队列中 同步线程从请求队列中拿取请求进行处理,多个工作的同步线程可以并发的处理多个请求
那么有一个问题是同步线程之间如何拿到请求队列中的请求呢,每个线程之间有没有竞争呢
1.可以通过请求队列将请求分给各个线程,分配策略有很多 比如轮流........
2.可以通过同步线程自己来竞争得到 (NGINX就是这样做的) 此时要用到锁
此时也可以想到之前的的事件处理模型
这里的异步线程也就是 Reactor中的主线程,它可以监听事件的发生然后放到队列中让同步线程区连接读写处理
其实也可以使用Proactor 这里的主线程可以执行连接和数据的接受 之后将数据封装到对象中插入队列中,让同步线程执行
下来上边的2出现主线程和工作线程共享请求队列 工作线程之间取任务 和主线程放任务都需要添加锁机制,从而白白 的消耗CPU时间同时如果同一时间连接的客户很多,此时请求队列中会堆积很多任务对象,工作线程只能处理一个任务,此时如果通过增加线程就会上下文切换消耗CPU时间,试客户端响应越来越慢。