我今天在考虑这么一个问题,CPU这个东西在某个时间只能运行一个指令,假设当前CPU是单核的,并只有100个进程,每个进程有5个指令,5个指令中有一个是IO指令,每个进程执行自己的任务,如果采用阻塞式,第一个进程在执行IO指令的时候阻塞,但是会让出CPU让第二个进程去处理,同样如果第二个进程也在IO阻塞,会让给其他空闲进程处理,这样的情况会导致CPU一直处于处理指令的状况,也就是说CPU一直不会发生空闲状态,除非100个进程都在IO。
同样的,考虑非阻塞式,一个进程在IO的时候,不会阻塞,而是去运行其他任务,所以CPU也不会闲下来,依然是执行某个命令,这么考虑的话,他和上面所述的阻塞执行有啥区别呢,总的来看CPU在任何时刻都在执行指令,总的指令个数都是100*5,那么总的时间大致来说基本上都是一样的,那为什么阻塞式就不能高并发,非阻塞的就能高并发呢?
后来查阅资料,只要涉及到阻塞和非阻塞的区别,就没有一个人提起线程或者进程的切换上。不拿进程举例了,拿线程举例,对于阻塞而言,如果线程的数量不多的情况,其实是和非阻塞没啥异样的,因为任何时刻CPU都在运行,发生阻塞的时候只是切换线程。我们都知道进程的切换需要消耗大量资源(切换上下文PCB,),但是线程切换同样消耗资源,虽然消耗的资源不多。那么如果是在高并发的情况下,采用阻塞的方式,就需要创建成千上万个线程,一个线程过来了发生阻塞,就要切换给其他线程来执行,而采用阻塞的方式,他只有一个线程,采用轮询的方式一直对某个请求进行处理,完全不需要对线程进行切换,那么从微观角度来讲,如果是1w个请求,非阻塞对于阻塞而言,大大减少了很多次的线程切换的开销,所以阻塞在这种情况会更消耗资源,而非阻塞就更加占有优势。
不知道我这种理解是不是对的,但是我想不出其他情况来否认自己的观点了,如果朋友你看到了,有更好的观点,请一定要告诉,我迷茫这个问题已经很久了!!