操作系统 信号量 PV操作
在看操作系统的时候,有个地方弄不明白:在某只有一个停车位的地方,我把自助停车器作为信号量(二元信号量)。如果某一时刻有两辆车甚至多辆车同时访问自助停车器,那么这个唯一的停...
在看操作系统的时候,有个地方弄不明白:
在某只有一个停车位的地方,我把自助停车器作为信号量(二元信号量)。如果某一时刻有两辆车甚至多辆车同时访问自助停车器,那么这个唯一的停车位不就被冲突访问了嘛。
抽象的来讲,同一时刻,多个进程能否对同一个信号量执行P操作。如果可以的话,这个信号量就没有被互斥的访问,就没有达到对临界资源的互斥访问。如果不行,操作系统是怎么控制对同一个信号量在某个时刻只有一个进程对它进行P操作,其他进程不能对它进行P操作。
不知道我的问题说清楚没有,希望有大神能解答一下。 展开
在某只有一个停车位的地方,我把自助停车器作为信号量(二元信号量)。如果某一时刻有两辆车甚至多辆车同时访问自助停车器,那么这个唯一的停车位不就被冲突访问了嘛。
抽象的来讲,同一时刻,多个进程能否对同一个信号量执行P操作。如果可以的话,这个信号量就没有被互斥的访问,就没有达到对临界资源的互斥访问。如果不行,操作系统是怎么控制对同一个信号量在某个时刻只有一个进程对它进行P操作,其他进程不能对它进行P操作。
不知道我的问题说清楚没有,希望有大神能解答一下。 展开
1个回答
展开全部
1: 你没描述清楚
2:如果某一时刻有两辆车甚至多辆车同时访问自助停车器,那么这个唯一的停车位不就被冲突访问了嘛。
---------------------------
访问这个停车器,不等于获得停车器的进入许可证。在实际代码中,访问时一定需要的,访问本身不是互斥的,“访问并获得进入许可证”这是一个原子操作,是一个整体。比如信号量s = 1, 此时别人来访问s的值,是1,表示别人已经获得,所以,他无法获得。read s的值是可以并发的,但是修改s的值,是一个原子操作。
3: 你看一下源代码就明白了,才几行代码。
看书,看这些打比方的例子,总是容易糊涂。
2:如果某一时刻有两辆车甚至多辆车同时访问自助停车器,那么这个唯一的停车位不就被冲突访问了嘛。
---------------------------
访问这个停车器,不等于获得停车器的进入许可证。在实际代码中,访问时一定需要的,访问本身不是互斥的,“访问并获得进入许可证”这是一个原子操作,是一个整体。比如信号量s = 1, 此时别人来访问s的值,是1,表示别人已经获得,所以,他无法获得。read s的值是可以并发的,但是修改s的值,是一个原子操作。
3: 你看一下源代码就明白了,才几行代码。
看书,看这些打比方的例子,总是容易糊涂。
追问
难道是我看书看错了?我记得是信号量S=1代表现在有资源,某个进程在这个信号量上执行P操作使S=0,之后再想申请这个资源的进程会发现S=0 ,然后把自己阻塞排入等待资源序列,当占有这个资源的进程释放的时候,被阻塞的进程才会有机会访问这个资源。我的问题是当2个或者更多进程在同一时刻发现S=1,他们各自都认为所请求资源是空闲的,可以访问,然后都去执行P操作,那么就会冲突,操作系统是怎么避免这种情况的?
追答
S=1表示占有资源,还是S=0表示占有资源,只是一种具体的实现,一种规定而已,都能实现你这个目标。
对于linux操作系统而言,实现信号量有好几个层次。最基础的是原子操作,原子操作之上是自旋锁,自旋锁之上是信号量。
你只有看了代码才懂。
用打比方的方法,寓意的方式来说,就是 test_and_set 是一个原子操作。
我在read S并修改S 这看起来是2个操作,但是操作系统用硬件体系结构的特殊指令,仅用了一条汇编语句就实现了。 也就是说,在操作系统级别,它本质上只是一个操作。这叫做原子操作。(请百度“原子操作”)
不会同时read并modify
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询