现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。线程与进程一样调度机制都是时间片轮转上下文切换,在多任务操作系统中,可以同时运行多个任务,那么必定面临以下两个问题:
这两种情形是多任务编程中遇到的最基本的问题,也是多任务编程中的核心问题,同步和互斥就是用于解决这两个问题的。
互斥:互斥是指当一个进程/线程进入临界区使用临界资源时,另一个进程/线程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态。最基本的场景就是:一个临界资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用临界资源。
同步:互斥解决了「多进程/线程」对临界资源使用的问题,但是它没有解决「多进程/线程」协同工作的问题,同步就解决了「多进程/线程」必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务的运行依赖于 B 任务产生的数据。
显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。也就是说互斥是两个任务之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!因此互斥具有唯一性和排它性,但互斥并不限制任务的运行顺序,即任务是无序的,而同步的任务之间则有顺序关系。