并发、并行
并行是指两个或多个事件在同一时刻发生,而并发是指两个或多个事件在同一时间间隔内发生。
并行是一种特殊的并发。
同步、异步
同步:某些应用程序为了完成某项任务需要建立两个或多个进程,这些进程的运行需要严格地按照规定的先后次序来运行,这种需要依靠先后次序来完成任务的机制就是同步。简单来说,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行
就比如生产者消费者进程,它们共享同一个缓冲区,生产者进程向缓冲区放入数据,消费者进程从缓冲区中读取数据,并对数据进行处理;当缓冲区为空时,消费者进程因不能读取数据而阻塞,此时一旦生产者进程往缓冲区投放数据,那么消费者进程就会被唤醒;同理,当缓冲区已满时,生产者进程因不能往缓冲区投放数据而阻塞,此时一旦消费者进程处理了缓冲区中的数据就会唤醒生产者进程。
异步:异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
线程是实现异步的一个方式。可以在主线程中创建子线程来做某件事,此时主线程不再需要等待子线程执行完,而是可以在等待子线程执行期间做其他事情。异步和多线程并不是一个同等关系:异步是最终目的,多线程只是实现异步的一种手段。
同步、互斥
同步: 同步是一种协调多个任务的机制,确保它们按照一定的次序执行,通常涉及等待和协调操作。在同步中,一个任务的执行可能需要等待其他任务完成某些操作后才能继续。
互斥: 互斥是同步机制的一种,用于防止多个任务同时访问临界资源(如打印机),以避免数据不一致或冲突。通过互斥锁等机制,只有获得锁的任务才能访问共享资源,其他任务需要等待。这确保了在任意时刻只有一个任务能够修改共享资源,保持了数据的一致性。
阻塞、非阻塞
阻塞:是指一个任务在执行过程中因为某些原因而暂时停止执行,等待某个事件的完成。在阻塞状态下,任务不会占用 CPU 资源,直到等待的事件发生后才会继续执行。
非阻塞:是指一个任务在执行过程中,如果遇到某个可能导致阻塞的操作,会通过一定的方式(如轮询、回调等)检查该操作是否会阻塞,如果不会,则继续执行而不是等待。非阻塞操作不会阻塞任务的执行,任务可以继续执行其他操作。
阻塞和非阻塞可以结合同步和异步来分为四种情况:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞。异步非阻塞效率最高。
以网络通信场景中 Web 服务器处理客户端请求的情况为例:
同步阻塞模式:服务器收到一个请求后,处理请求的过程是阻塞的,直到请求处理完毕,服务器才能继续处理下一个请求。这种模式下,如果有很多客户端连接,但每个连接的处理时间较长,服务器可能会因等待而无法同时服务其他请求。
同步非阻塞模式:服务器收到一个请求后,处理请求的过程是非阻塞的,但服务器需要主动轮询或者使用其他机制来检查请求是否完成。如果请求未完成,服务器可以处理其他请求,但仍然需要等待某种通知或轮询来知道原始请求是否完成。
异步阻塞模式:服务器收到一个请求后,通过异步方式处理,但整个过程仍然是阻塞的。服务器可以在处理请求的同时进行其他操作,但仍需要等待请求完成。
异步非阻塞模式:服务器收到一个请求后,通过异步方式处理,整个过程是非阻塞的。服务器不仅可以在处理当前请求的同时处理其他请求,而且可以通过回调等机制在请求完成时得到通知,而无需主动轮询。
线程同步与阻塞的关系?
同步是个过程,阻塞是线程的一种状态:当多个线程访问同一资源时,规定同一时间只有一个线程可以进行访问,所以后访问的线程将阻塞,等待前访问的线程访问完。
注意:线程同步不一定发生阻塞!线程同步的时候,需要协调推进速度,只有当访问同一资源出现互相等待和互相唤醒会发生阻塞。而阻塞了一定是同步,后访问的等待获取资源,线程进入阻塞状态,借以实现多线程同步的过程。