并发和并行:
并发的概念:
指计算机能够同时执行多项任务,比如在一个单核的计算机上我们能够同时听歌和看网页,听歌软件和浏览器属于不同的进程,但是他们能够同时在计算机系统上运行。单核计算机实现并发的方法有时间片轮转法等,以时间片轮转法为例,之所以这种方法能够造成单核计算机能够同时执行多个任务的假象,就是因为它为每个进程都分配了固定的时间片,每个进程执行完自己的时间就退出然后换下一个进程进来执行,因为CPU运行速度很快,因此用户并不会感受到进程的切换。而进程也能够利用自己的时间片为用户提供服务。
并行:与单核计算机不同,多核计算机能够真正实现在多个核心上同时执行多个任务,这与单核计算机上的多个软件的同时运行不同,单核计算机利用的是CPU对于进程的切换,造成了看似多个程序同时在运行的假象,其实每个时刻只有一个进程在执行,而这种每个时刻真正有多个任务同时执行的状态必须依赖于多核。
同步和阻塞:
文件IO过程中的概念:
一个IO的过程分为两个过程:发起IO请求和实际的IO读写操作
阻塞和非阻塞在于第一个过程,针对的是调用方,阻塞就是说发起IO请求之后调用方只能等着,在这个过程中不能做其他事情,就像阻塞的read读操作一样,而反之就是非阻塞。
而同步和异步在于第二个过程,关键在于被调用方,如果操作系统帮你完成了读写操作再通知调用者,那就是异步,要调用者自己完成读写操作就是同步。我个人的理解是,异步就像是在厨房里同时煮鸡蛋和煮面(ps:鸡蛋和面是在不同的锅里煮的),因为煮鸡蛋不需要我守着,所以当我把蛋放进去锅里之后我就可以去煮面了,等蛋煮好了我再去拿就行。而同步就类似于我一定要先等鸡蛋煮熟了再去煮面,也就是一个事件没有完成之前我不能去做另一件事。
总结来说,同步异步与阻塞非阻塞的区别并不是界限分明的,同步异步的概念是用来描述任务执行序列,如果执行A之后不等其返回结果,而去执行B,等A完成后再从B返回这就是异步。而同步就是必须先等A执行结束再执行B。
而阻塞非阻塞我觉得还是针对于发起IO请求来说,比如read()函数就可以设置为阻塞和非阻塞,阻塞就是等待read()返回结果,而非阻塞就是不用等read()返回结果直接返回,然后通过轮询查看read()是否返回结果。