操作系统——并发和并行,并发带来的问题,同步和互斥(简单理解)

操作系统——并发和并行,并发带来的问题,同步和互斥

并发和并行

  • 什么是并发

在一段时间内,我一会去吃口饭,一去扫个地,一会去洗个碗,,进程的并发执行也是类似的,我一会执行进程A,一会执行进程B,一会执行进程C,进程交替执行,这就是并发,那在宏观上看A,B,C在同时执行。

  • 什么是并行

在一段时间内,我吃饭、扫地、洗碗一起做,进程重叠执行,这就是并行,在微观上看A,B,C确实在同时执行。

一张图就可以很好区分二者:
操作系统——并发和并行,并发带来的问题,同步和互斥(简单理解)

并发带来的问题

  • 那并发会带来什么问题呢?

A和B有个资源是共用的,假设进程A和B交替执行,那可能就会导致一些错误

举个例子:机票问题

T1,T2两个旅客购票流程都是先获取机票剩余量,如果票量足够就购得一张票,然后机票剩余量-1,否则输出票已售完,具体程序如下:

操作系统——并发和并行,并发带来的问题,同步和互斥(简单理解)

如果这两个进程顺序执行,T1购票完毕后T2再去购票,并不会出现任何问题

但是如果T1、T2并发执行,交替执行T1和T2中的语句,可能出现如下交叉情况:

假如机票剩余量的初始值为2,那Aj=2

T1:X1=Aj; //执行T1的语句,将机票剩余量Aj赋值给X1,X1=2
T2:X2=Aj; //执行T2的语句,将机票剩余量Aj赋值给X2,X2=2
T2:X2–;Aj=X2;{输出一张票}; //T2旅客购得一张票,机票剩余量-1,Aj=1
T1:X1–;Aj=X1;{输出一张票}; //T1旅客购得一张票,机票剩余量-1,Aj=1
问题出现了,按道理两位旅客购完票之后,机票剩余量Aj应该是0才对,可是现在确是1。这就是并发可能带来的结果错误。

互斥和同步

如果多个进程在争夺一块蛋糕,那它们就是竞争关系,这块蛋糕就被称为临界资源,而使用这个临界资源的那一部分程序就被称为临界区

那什么是互斥和同步

  • 互斥:一次只允许一个进程吃蛋糕
  • 同步:各进程的工作的推进遵循一个先后顺序,比如先要做蛋糕,才能吃蛋糕

那进程之间的关系也通过进程互斥和同步梳理出来

  • 互斥就是竞争关系
  • 同步就是协作关系