pv操作 订阅
PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。 展开全文
PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。
信息
组    成
P操作、V操作
提出时间
1962年
意    义
奠基计算机现代操作系统的基础
提出人
E.W.Dijkstra
用    途
实现进程互斥与同步
中文名
PV操作
PV操作简介
1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德霍芬技术大学(Eindhoven Technical University)任数学教授。在这里,他参加了X86计算机的开发,设计与实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。THE 是艾恩德霍芬技术大学的荷兰文Tchnische Hoogeschool Eindhov –en的词头缩写。狄克斯特拉在THE这个系统中所提出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNIX等所采用的。为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作状态。由于在任一时刻最多只有一个进程可以使用处理机,正占用着处理机的进程称为“运行”进程。当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于“就绪”状态。当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入“阻塞”状态,待造成其退出运行的条件解除,再进入“就绪”状态。而对系统中所有同时运行的进程之间所存在的相互制约的同步(synchronization,指为了避免错误,在一个进程访问共享数据时,另一个进程不访问该数据)和互斥(mutually-exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。中国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。
收起全文
精华内容
下载资源
问答
  • PV操作

    2021-07-17 05:41:34
    PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未...

    PV操作是一种实现进程互斥与同步的有效方法。PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思。

    PV操作是典型的同步机制之一。用一个信号量与一个消息联系起来,当信号量的值为0时,表示期望的消息尚未产生;当信号量的值非0时,表示期望的消息已经存在。用PV操作实现进程同步时,调用P操作测试消息是否到达,调用V操作发送消息。

    中文名

    PV操作

    提出人

    E.W.Dijkstra

    提出时间

    1962年组    成

    P操作、V操作

    意    义

    用    途

    实现进程互斥与同步

    PV操作简介

    编辑

    语音

    1962年,狄克斯特拉离开数学中心进入位于荷兰南部的艾恩德霍芬技术大学(Eindhoven Technical University)任数学教授。在这里,他参加了X86计算机的开发,设计与实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。

    THE 是艾恩德霍芬技术大学的荷兰文Tchnische Hoogeschool Eindhov –en的词头缩写。狄克斯特拉在THE这个系统中所提出的一系统方法和技术奠定了计算机现代操作系统的基础,尤其是关于多层体系结构,顺序进程之间的同步和互斥机制这样一些重要的思想和概念都是狄克斯特拉在THE中首先提出并为以后的操作系统如UNIX等所采用的。

    为了在单处理机的情况下确定进程(process)能否占有处理机,狄克斯特拉将每个进程分为“就绪”(ready)、“运行”(running)和“阻塞”(blocking)三个工作状态。由于在任一时刻最多只有一个进程可以使用处理机,正占用着处理机的进程称为“运行”进程。当某进程已具备了使用处理机的条件,而当前又没有处理机供其使用,则使该进程处于“就绪”状态。当运行进程由于某种原因无法继续运行下去时,就停止其占用处理机,使之进入“阻塞”状态,待造成其退出运行的条件解除,再进入“就绪”状态。而对系统中所有同时运行的进程之间所存在的相互制约的同步(synchronization,指为了避免错误,在一个进程访问共享数据时,另一个进程不访问该数据)和互斥(mutually-exclusive,指两个进程不能同时在一个临界区中使用同一个可重复使用的资源,诸如读写缓冲区)两个关系,狄克斯特拉巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。

    中国读者常常不明白这一同步机制为什么叫PV操作,原来这是狄克斯特拉用荷兰文定义的,因为在荷兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名。这是在计算机术语中不是用英语表达的极少数的例子之一。

    PV操作信号量

    编辑

    语音

    信号量的概念和PV操作是荷兰科学家E.W.Dijkstra提出来的。信号是铁路交通管理中的一种常用设备,交通管理人员利用信号颜色的变化来实现交通管理。在操作系统中,信号量S是一整数。S大于或等于零,代表可供并发进程使用的资源实体数;在S小于零时,ISl表示正在等待使用资源实体的进程数。建立一个信号量必须说明此信号量所代表的意义并且赋初值。除赋初值外,信号量仅能通过PV操作来访问。[1]

    信号量按其用途可分为两种。[1]

    ①公用信号量。联系一组并发进程,相关的进程均可在此信号量上执行P操作和V操作,初值常常为1,用于实现进程互斥。[1]

    ②私有信号量。联系一组并发进程,仅允许拥有此信号量的进程执行P操作,而其他相关进程可在其上施行V操作。初值常常为0或正整数,多用于实现进程同步。[1]

    PV操作是由两个操作,即P操作和V操作组成的。P操作和V操作是两个在信号量上进行操作的过程,假定用S表示信号量,则把这两个过程记作P(S)和V(S)。[1]

    PV操作原理

    编辑

    语音

    用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。由于P(S)和V(S)都是在同一个信号量S上操作,为了使得它们在执行时不发生因交叉访问信号量S而可能出现的错误,约定P(S)和V(S)必须是两个不可被中断的过程,即让它们在屏蔽中断下执行。把不可被中断的过程称为原语。于是,P操作和V操作实际上应该是P操作原语和V操作原语。[1]

    P操作的主要动作是:[1]

    ①S减1;[1]

    ②若S减1后仍大于或等于0,则进程继续执行;[1]

    ③若S减1后小于0,则该进程被阻塞后放入等待该信号量的等待队列中,然后转进程调度。[1]

    V操作的主要动作是:[1]

    ①S加1;[1]

    ②若相加后结果大于0,则进程继续执行; [1]

    ③若相加后结果小于或等于0,则从该信号的等待队列中释放一个等待进程,然后再返回原进程继续执行或转进程调度。[1]

    PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断发生。原语不能被中断执行,因为原语对变量的操作过程如果被打断,可能会去运行另一个对同一变量的操作过程,从而出现临界段问题。如果能够找到一种解决临界段问题的元方法,就可以实现对共享变量操作的原子性。[2]

    PV操作应用

    编辑

    语音

    PV操作实现进程的同步

    要实现进程的同步就必须提供一种机制,该机制能把其他进程需要的消息发送出去,也能测试自己需要的消息是否到达。把能实现进程同步的机制称为同步机制。不同的同步机制实现同步的方法也不同。PV操作和管程是两种典型的同步机制。在这里,只介绍怎样用PV操作实现进程间的同步。[1]

    我们已经知道怎样用PV操作来实现进程的互斥。事实上,PV操作不仅是实现进程互斥的有效工具,而且还是一个简单而方便的同步工具。用一个信号量与一个消息联系起来,信号量的值为0表示期望的消息尚未产生;信号量的值为非0表示期望的消息已经存在。假定用信号量S表示某个消息,现在来看看怎样用PV操作达到进程同步的目的。[1]

    (1)调用P操作测试消息是否到达

    任何进程调用P操作可测试到自己所期望的消息是否已经到达。若消息尚未产生,则S=0,调用P(s)后,P(S)一定让调用者成为等待信号量S的状态,即调用者此时必定等待直到消息到达;若消息已经存在,则S≠0,调用P(S)后,进程不会成为等待状态而可继续执行,即进程测试到自己期望的消息已经存在。[1]

    (2)调用V操作发送消息

    任何进程要向其他进程发送消息时可调用V操作。若调用V操作之前S=0,表示消息尚未产生且无等待消息的进程,则调用V(S)后,V(s)执行S:=S+1使S≠0,即意味着消息已存在;若调用V操作之前S<0,表示消息未产生前已有进程在等待消息,则调用V(S)后将释放一个等待消息者,即表示该进程等待的消息已经到达,可以继续执行。[1]

    在用PV操作实现同步时,一定要根据具体的问题来定义信号量和调用P操作或V操作。一个信号量与一个消息联系在一起,当有多个消息时必须定义多个信号量;测试不同的消息是否到达或发送不同的消息时,应对不同的信号量调用P操作或V操作。[1]

    PV操作实现进程互斥

    用PV操作可实现并发进程的互斥,其步骤如下。

    (1)设立一个互斥信号量S,表示临界区,其取值为1,0,-1,…其中,S=1表示无并发进程进入S临界区;S=0表示已有一个并发进程进入了S临界区;S等于负数表示已有一个并发进程进入S临界区,且有|S|个进程等待进入S临界区,S的初值为1。 [1]

    (2)用PV操作表示对S临界区的申请和释放。在进入临界区之前,通过P操作进行申请,在退出临界区之后,通过V操作释放。[1]

    PV操作相关推论

    编辑

    语音

    S的初值可定义为0、1或其他整数,在系统初始化时确定。从信号量和PV操作的定义可以获得如下推论。[1]

    推论1:若信号量S为正值,则该值等于在阻塞进程之前对信号量S可施行的P操作数,亦即等于S所代表的实际还可以使用的物理资源数。[1]

    推论2:若信号量s为负值,则其绝对值等于登记排列在该信号量S等待队列之中的进程个数,亦即恰好等于对信号量S实施P操作而被阻塞并进入信号量S等待队列的进程数。[1]

    推论3:通常,P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作代表阻塞进程操作,而V操作代表唤醒被阻塞进程的操作。[1]

    PV操作注意事项

    编辑

    语音

    1、使用PV操作实现进程互斥时应该注意的是:

    ⑴每个程序中用户实现互斥的P、V操作必须成对出现,先做P操作,进临界区,后做V操作,出临界区。若有多个分支,要认真检查其成对性。

    ⑵P、V操作应分别紧靠临界区的头尾部,临界区的代码应尽可能短,不能有死循环。

    ⑶互斥信号量的初值一般为1。

    2、使用PV操作实现进程同步时应该注意的是:

    ⑴分析进程间的制约关系,确定信号量种类。在保持进程间有正确的同步关系情况下,哪个进程先执行,哪些进程后执行,彼此间通过什么资源(信号量)进行协调,从而明确要设置哪些信号量。

    ⑵信号量的初值与相应资源的数量有关,也与P、V操作在程序代码中出现的位置有关。

    ⑶同一信号量的P、V操作要成对出现,但它们分别在不同的进程代码中。

    参考资料

    1.

    谢旭升,朱明华,张练兴等.计算机操作系统:华中科技大学出版社,2005.2:第42页

    2.

    王晓英等主编.计算机系统平台:中国铁道出版社,2016.08:第130页

    展开全文
  • 上图是一道操作系统PV操作的习题,用Python解决之,建立一个线程模拟行人从北向南过桥,另一个线程模拟行人从南向北过桥,建立四个信号量,分别实现对桥、北桥段、南桥段和桥中央的互斥。 north_side = threading....

     

    上图是一道操作系统PV操作的习题,用Python解决之,建立一个线程模拟行人从北向南过桥,另一个线程模拟行人从南向北过桥,建立四个信号量,分别实现对桥、北桥段、南桥段和桥中央的互斥。

    north_side = threading.Semaphore(1) #北桥段只能通过一人
    north= threading.Semaphore(1)  #北向南一次只允许一人过桥
    south_side = threading.Semaphore(1) #南桥段只能通过一人
    south= threading.Semaphore(1)  #南向北一次只允许一人过桥
    person = threading.Semaphore(2) #桥中央允许两人通过或歇息

    随机生成20个线程(行人),观察行人过桥的状况,符合题目要求,运行结果如下图。

     

    import threading,time,random
    north_side = threading.Semaphore(1)
    north= threading.Semaphore(1)
    south_side = threading.Semaphore(1)
    south= threading.Semaphore(1)
    person = threading.Semaphore(2)
    
    def north_south():
        t = threading.currentThread()
        north_side.acquire()
    
        north.acquire()
        print('行人%dnorth_south上北桥段\n'%t.ident)
        time.sleep(random.random())
        north.release()
        
        person.acquire()            
        print('行人%dnorth_south行至桥中央\n'%t.ident)
        time.sleep(random.random())
        person.release()
    
        south.acquire()            
        print('行人%dnorth_south上至南桥段\n'%t.ident)
        time.sleep(random.random())
        south.release()
        print('行人%dnorth_south下桥\n'%t.ident)
        north_side.release()
    def south_north():
        t = threading.currentThread()
        south_side.acquire()
        south.acquire()
        print('行人%dsouth_north上南桥段\n'%t.ident)
        time.sleep(random.random())
        south.release()
        
        person.acquire()            
        print('行人%dsouth_north行至桥中央\n'%t.ident)
        time.sleep(random.random())
        person.release()
    
        north.acquire()            
        print('行人%dsouth_north上至北桥段\n'%t.ident)
        time.sleep(random.random())            
        north.release()
        print('行人%dsouth_north下桥\n'%t.ident)
        south_side.release()            
    
    if __name__=='__main__':
        threads = []
        for i in range(20):        
            r=random.randint(0,1)
            if r==0:
                p = threading.Thread(target=north_south)
            else:
                p = threading.Thread(target=south_north)
            p.start()
            threads.append(p)
        for t in threads:
            t.join()
        
    

     

    展开全文
  • PV 操作

    2021-06-04 12:35:35
    常见的进程同步与互斥机制 常见的进程同步与互斥机制有两种: 信号量与PV操作 管程①信号量与PV操作 包交包会!看完下面这段解释你绝对能够明白PV操作是啥。 1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程...

    全文脉络思维导图如下:

    1.什么是进程同步

      在多道批处理系统中,多个进程是可以并发执行的,但由于系统的资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的「异步性」。

      那么,「进程的异步性会带来什么问题呢」?举个例子,如果有A、B两个进程分别负责读和写数据的操作,这两个线程是相互合作、相互依赖的。那么写数据应该发生在读数据之前。而实际上,由于异步性的存在,可能会发生先读后写的情况,而此时由于缓冲区还没有被写入数据,读进程A没有数据可读,因此读进程A被阻塞。

    进程同步(synchronization)就是用来解决这个问题的。从上面的例子我们能看出,一个进程的执行可能影响到另一个进程的执行,「所谓进程同步就是指协调这些完成某个共同任务的并发线程,在某些位置上指定线程的先后执行次序、传递信号或消息」。

      再举个生活中的进程同步的例子,你想要喝热水,于是你打了一壶水开始烧,在这壶水烧开之前,你只能一直等着,水烧开之后水壶自然会发生响声提醒你来喝水,于是你就可以喝水了。就是说「水烧开这个事情必须发生在你喝水之前」。

      注意不要把进程同步和进程调度搞混了:

      进程调度是为了最大程度的利用CPU资源,选用合适的算法调度就绪队列中的进程。

      进程同步是为了协调一些进程以完成某个任务,比如读和写,你肯定先写后读,不能先读后写吧,这就是进程同步做的事情了,指定这些进程的先后执行次序使得某个任务能够顺利完成。2.什么是进程互斥

      同样的,也是因为进程的并发性,并发执行的线程不可避免地需要共享一些系统资源,比如内存、打印机、摄像头等。举个例子:我们去学校打印店打印论文,你按下了WPS的“打印”选项,于是打印机开始工作。你的论文打印到一半时,另一位同学按下了Word的“打印”按钮,开始打印他自己的论文。想象一下如果两个进程可以随意的、并发的共享打印机资源,会发生什么情况?

      显然,两个进程并发运行,导致打印机设备交替的收到WPS和Word两个进程发来的打印请求,结果两篇论文的内容混杂在一起了。

      进程互斥(mutualexclusion)就是用来解决这个问题的。当某个进程A在访问打印机时,如果另一个进程B也想要访问打印机,它就必须等待,直到A进程访问结束并释放打印机资源后,B进程才能去访问。

      实际上,像上述的打印机这种「在一个时间段内只允许一个进程使用的资源」(这也就是互斥的意思),我们将其称为「临界资源」,对临界资源进行访问的那段代码称为「临界区」。

    通俗的对比一下进程互斥和进程同步:

      进程同步:进程A应在进程B之前执行

      进程互斥:进程A和进程B不能在同一时刻执行

      从上不难看出,「进程互斥是一种特殊的进程同步」,即逐次使用临界资源,也是对进程使用资源的先后执行次序的一种协调。

      3.常见的进程同步与互斥机制

      常见的进程同步与互斥机制有两种:

      信号量与PV操作

      管程①信号量与PV操作

      包交包会!看完下面这段解释你绝对能够明白PV操作是啥。

      1965年,荷兰学者Dijkstra提出了一种卓有成效的实现进程同步和互斥的方法—信号量机制(Semaphore)。信号量其实就是一个变量,我们可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

      用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现进程互斥或同步。这一对原语就是PV操作:

      1)「P操作」:将信号量值减1,表示「申请占用一个资源」。如果结果小于0,表示已经没有可用资源,则执行P操作的进程被阻塞。如果结果大于等于0,表示现有的资源足够你使用,则执行P操作的进程继续执行。

      可以这么理解,当信号量的值为2的时候,表示有2个资源可以使用,当信号量的值为-2的时候,表示有两个进程正在等待使用这个资源。不看这句话真的无法理解V操作,看完顿时如梦初醒。

      2)「V操作」:将信号量值加1,表示「释放一个资源」,即使用完资源后归还资源。若加完后信号量的值小于等于0,表示有某些进程正在等待该资源,由于我们已经释放出一个资源了,因此需要唤醒一个等待使用该资源(就绪态)的进程,使之运行下去。

      我觉得已经讲的足够通俗了,不过对于V操作大家可能仍然有困惑,下面再来看两个关于V操作的问答:

      问:「信号量的值大于0表示有临界资源可供使用,这个时候为什么不需要唤醒进程」?

      答:所谓唤醒进程是从就绪队列(阻塞队列)中唤醒进程,而信号量的值大于0表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒,正常运行即可。

      问:「信号量的值等于0的时候表示没有临界资源可供使用,为什么还要唤醒进程」?

      答:V操作是先执行信号量值加1的,也就是说,把信号量的值加1后才变成了0,在此之前,信号量的值是-1,即有一个进程正在等待这个临界资源,我们需要唤醒它。

      信号量和PV操作具体的定义如下:

    实现进程互斥

      两步走即可实现进程的互斥:

      定义一个互斥信号量,并初始化为1

      把对于临界资源的访问置于P操作和V操作之间

    「P操作和V操作必须成对出现」。缺少P操作就不能保证对临界资源的互斥访问,缺少V操作就会导致临界资源永远得不到释放、处于等待态的进程永远得不到唤醒。

      实现进程同步

      回顾一下进程同步,就是要各并发进程按要求有序地运行。

      举个例子,以下两个进程P1、P2并发执行,由于存在异步性,因此二者交替推进的次序是不确定的。假设P2的“代码4”要基于P1的“代码1”和“代码2”的运行结果才能执行,那么我们就必须保证“代码4”一定是在“代码2”之后才会执行。

      

     如果P2的“代码4”要基于P1的“代码1”和“代码2”的运行结果才能执行,那么我们就必须保证“代码4”一定是在“代码2”之后才会执行。

      使用信号量和PV操作实现进程的同步也非常方便,三步走:

      定义一个同步信号量,并初始化为当前可用资源的数量

      在优先级较「高」的操作的「后」面执行V操作,释放资源

      在优先级较「低」的操作的「前」面执行P操作,申请占用资源

     

    配合下面这张图直观理解下:

    生产者和消费者问题

      下面我们利用信号量和PV操作来解决经典的进程同步和互斥问题:生产者和消费者问题。

      【问题描述】:系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。任何时刻,只能有一个生产者或消费者可以访问缓冲区。

     

     由题可知,生产者、消费者共享一个初始为空、大小为n的缓冲区,我们从题目中提炼出同步与互斥关系:

      同步关系1:只有缓冲区没满时(优先级高),生产者才能把产品放入缓冲区(优先级低),否则必须等待

      同步关系2:只有缓冲区不空时(优先级高),消费者才能从中取出产品(优先级低),否则必须等待

      互斥关系:缓冲区是临界资源,各进程必须互斥地访问。

      既然这个题目有两个同步关系和一个互斥关系,那么我们就需要两个同步信号量和一个互斥信号量:

      empty:同步信号量(对应同步关系1),表示生产者还能生产多少,即还能放入缓冲区多少产品,该数量小于等于0,则生产者不能进行生产。初始化为n。

      full:同步信号量(对应同步关系2),表示消费者还能从缓冲区取出多少,即当前缓冲区已有产品的数量,该数量小于等于0,则消费者不能进行读取。初始化为0。

      mutex:互斥信号量,实现对缓冲区的互斥访问。初始化为1。

      代码如下,注意各个PV操作的配对:

     

      ②管程

      管程有一个重要特性:「在一个时刻只能有一个进程使用管程」。进程在无法继续执行的时候不能一直占用管程,否则其它进程将永远不能使用管程。也就是说「管程天生支持进程互斥」。

      其实使用管程是能够实现信号量的,并且也能用信号量实现管程。但是管程封装的比较好,相比起信号量来需要我们编写的代码更少,更加易用,这也就是「Java采用管程机制」的原因,synchronized关键字及wait()、notify()、notifyAll()这三个方法都是管程的组成部分。把管程翻译为Java领域的语言,就是管理类的成员变量和成员方法,让这个类是线程安全的。再详细的部分就不再深究了。

     

     

    展开全文
  • Linux下的pv操作

    2020-12-22 08:06:13
    关于pv操作部分的内容,其实算不上什么新的东西。但是它对于我们理解信号量、消息处理部分的工作还是有很大帮助的。之前我们给出了一个win32的处理方案,但是实现的比较草率。所以我们今天可以利用linux上的信号量...

    关于pv操作部分的内容,其实算不上什么新的东西。但是它对于我们理解信号量、消息处理部分的工作还是有很大帮助的。之前我们给出了一个win32的处理方案,但是实现的比较草率。所以我们今天可以利用linux上的信号量函数把这个功能重新实现一遍。 (1)linux下

    关于pv操作部分的内容,其实算不上什么新的东西。但是它对于我们理解信号量、消息处理部分的工作还是有很大帮助的。之前我们给出了一个win32的处理方案,但是实现的比较草率。所以我们今天可以利用linux上的信号量函数把这个功能重新实现一遍。

    (1)linux下面信号量的基本函数

    a)创建信号量  sem_init

    b)等待信号量 sem_wait

    c)释放信号量 sem_pos

    d)删除信号量 sem_destroy

    (2)编写pv操作函数

    之前在编写pv操作的时候,没有考虑到消息处理的时序问题,所以在某些极端的情况下可能会造成一些问题。所以本次pv操作采用了循环队列的形式,保持了消 息的先后入队顺序。这样对于线程收到的各种消息就可以依次进行处理解决了。同样,我们文件编译的方法非常简单,shell下输入gcc sem.c -g -o sem -lpthread即可。

    可能有同学会问,单独的循环队列和pv操作处理上有什么差别?其实差别很简单,pv可以是不同线程向一个线程发送消息,而循环队列只能接受一个线程发送的消息,否则处理上就麻烦了。

    #include

    #include

    #include

    #include

    #include

    struct MSG

    {

    sem_t s_empty;

    sem_t s_full;

    sem_t s_msg;

    int* p_buffer;

    int start;

    int end;

    int count;

    };

    #define STATUS int

    #define TRUE 1

    #define FALSE 0

    static struct MSG* p_msg = NULL;

    struct MSG* alloc_msg(int count)

    {

    struct MSG* p_msg;

    p_msg = (struct MSG*) malloc(sizeof(struct MSG));

    if(NULL == p_msg)

    {

    goto error1;

    }

    memset(p_msg, 0, sizeof(struct MSG));

    p_msg->count = count;

    p_msg->p_buffer = (int*)malloc(sizeof(int)* count);

    if(NULL == p_msg->p_buffer)

    {

    goto error2;

    }

    sem_init(&p_msg->s_empty, 0, count);

    sem_init(&p_msg->s_full, 0, 0);

    sem_init(&p_msg->s_msg, 0, 1);

    return p_msg;

    error2:

    free(p_msg);

    error1:

    return;

    }

    void del_msg(struct MSG* p_msg)

    {

    if(p_msg)

    {

    if(p_msg->p_buffer)

    {

    free(p_msg->p_buffer);

    }

    sem_destroy(&p_msg->s_msg);

    sem_destroy(&p_msg->s_full);

    sem_destroy(&p_msg->s_empty);

    free(p_msg);

    }

    }

    STATUS put_msg(struct MSG* p_msg, int data)

    {

    if(NULL == p_msg )

    {

    return FALSE;

    }

    sem_wait(&p_msg->s_empty);

    sem_wait(&p_msg->s_msg);

    p_msg->p_buffer[p_msg->start] = data;

    p_msg->start = (p_msg->start + 1) % p_msg->count;

    sem_post(&p_msg->s_msg);

    sem_post(&p_msg->s_full);

    return TRUE;

    }

    STATUS get_msg(struct MSG* p_msg, int* p_buf)

    {

    if(NULL == p_msg || NULL == p_buf)

    {

    return FALSE;

    }

    sem_wait(&p_msg->s_full);

    sem_wait(&p_msg->s_msg);

    p_buf[0] = p_msg->p_buffer[p_msg->end];

    p_msg->end = (p_msg->end + 1)% p_msg->count;

    sem_post(&p_msg->s_msg);

    sem_post(&p_msg->s_empty);

    return TRUE;

    }

    void* set_func(void* args)

    {

    int index = 100;

    while(1)

    {

    put_msg(p_msg, index);

    printf(“set %d\n”, index);

    index ++; sleep(1);

    }

    return NULL;

    }

    void* get_func(void* args)

    {

    int data;

    while(1)

    {

    get_msg(p_msg, &data);

    printf(“get %d\n”, data);

    sleep(1);

    }

    return NULL;

    }

    int main(int argc, char* argv[])

    {

    pthread_t pid1, pid2;

    int index;

    p_msg = alloc_msg(10);

    if(NULL == p_msg)

    {

    goto end;

    }

    if(pthread_create(&pid1, NULL, set_func, NULL))

    {

    goto end;

    }

    if(pthread_create(&pid2, NULL, get_func, NULL))

    {

    goto end;

    }

    while(1)

    {

    sleep(0);

    }

    end:

    return 1;

    }

    展开全文
  • PV操作简单理解

    2021-03-24 11:01:58
    三种状态在某些条件下可以转换,三者之间的转换关系如下:进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。信号量信号量是最早出现的用来解决...
  • 图解PV操作

    2021-10-22 12:11:29
    一、PV操作的原则 P操作:相当于请求资源、输入 V操作:相当于释放资源、输出 在单一进程内部,由 P操作 —> V操作 1、P:请求到资源 (相当于程序输入) 2、执行… 3、V:释放资源 (相当于程序的输出) 在...
  • 【操作系统】经典PV操作题目

    千次阅读 2021-05-01 22:06:03
    5个经典PV操作题(附答案) 三个进程之间的同步 pv操作的经典习题 生产者和消费者 生产者消费者问题 当只有一个生产者和一个消费者的时候,且只有一个缓冲区 要考虑生产者和消费者两个进程的互斥,还有生产者和消费者...
  • 文档介绍:计算机操作系统介绍P、V操作陷柏珐筏蔫篷捌椰腐抒俱共右侮镜厚战津马输钧禄奉他盒猩邀酣理诉计思计算机操作系统pv操作详细教程计算机操作系统pv操作详细教程P、V操作的引用为禁止两个进程同时进入临界区,...
  •   在这篇文章,重点讨论三个经典的PV操作例题:生产者消费者问题、读者写者问题、哲学家进餐问题。对这三个问题会逐层分析,不断改进。希望能通过这个过程对于PV操作有着更深刻的理解。   生产者消费者问题  ...
  • 计算机操作系统PV操作例题问题1 一个司机与售票员的例子 在公共汽车上,为保证乘客的安全,司机和售票员应协调工作: 停车后才能开门,关车门后才能行车。用PV操作来实现他们之间的协调。 S1:是否允许司机启动...
  • PV操作 和尚打水问题 某寺庙,有小和尚和老和尚若干,有一个水缸,由小和尚提水入缸供老和尚饮用.水缸可以容纳10桶水,水取自同一口井,由于水井口窄,每次只能容纳一个水桶取水.水桶总数为3个。每次入水、取水仅为一桶,...
  • 满意答案sbx19012014.06.02采纳率:41%等级:9已...那么问题所限定的使用信号量的方式来管理的潜藏意思,就是要利用PV原语实现并发进程在资源争夺有效互斥。//而具体实现的目标是“防止数的丢失”和“重复取同一...
  • PV操作习题

    2021-01-10 17:25:27
    记录PV操作学习过程的一些习题相关代码 1、读者/写者问题 两组并发进程:读者/写者,共享一个文件F: 多个读者可以同读【允许同读】 只允许一个写者写文件【同写互斥】 写者写时不能被读者读【读写互斥】 写者写...
  • PV操作来实现他们之间的协调。S1:是否允许司机启动汽车的变量S2:是否允许售票员开门的变量driver()//司机进程{while (1)//不停地循环{P(S1);//请求启动汽车启动汽车;正常行车;到站停车;V(S2); //释放开门变量...
  • PV操作原理概述

    2021-03-08 20:29:49
    一、PV原语的含义P操作和V操作是不可终端的程序段,成为原语,PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的。信号量sem是一个整数。Sem大于等于零时代表可供并发进程使用的资源实体数,但sem小于零时则...
  • Linux信号量PV操作

    2021-05-17 11:17:09
    1://假设两个进程(父子进程)对...2://利用信号量实现pv操作3:#include 4:#include 5:#include 6:#include 7:#include 8:#include 9:struct sembuf sops;10:static int sid;11://创建一个新的信号量集12:int createSe...
  • PV操作详解(附详细例题解析和总结)

    千次阅读 多人点赞 2021-05-04 17:04:40
    PV操作详解 写在前面:本文主要讲解PV操作与信息量结合,实现进程的同步与互斥 文章目录PV操作详解1. PV操作定义2. 信号量的应用3. 经典问题分析3.1 课上例题3.2 课下习题分析4. 补充 1. PV操作定义 信号量是一类...
  • 操作系统 - PV操作

    2021-01-31 21:51:42
    PV操作的例题: 分析:进入书店P(Sn)与离开书店V(Sn)操作对应题目的“该书店最多允许n个购书者进入”,因为假如进入书店的人数超过了最大的限制,P操作会被阻塞,知道V操作执行后释放空间。 接下来分析...
  • 第一次在自学考试的过程接触到PV操作,关于这部分的有些模糊,所以尝试着总结一下。基本概念PV操作主要涉及到临界区,信号量,P操作,V操作,进程的同步与互斥这些概念。临界区:并发进程与共享变量有关的程序段...
  • 文章目录一、基础概念二、信号量和P、V操作三、pv原语四、关于死锁的概念 一、基础概念 1、进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作...
  • 操作系统PV操作习题

    2021-11-28 10:11:21
    (b)当缓冲队列至少存在一个 非空缓冲区时,相应的接收进程才能接收一个消息。 试描述发送过程send(i,m)和接收过程receive(i,m)。这里i代表缓冲队列。 由题意可知,进程PA与PB之间进行通信时,过程send(i,m)和过程...
  • 信号量——pv操作

    2021-01-12 15:06:02
    无名信号量:无名信号量只能存在于内存,要求使用信号量的进程必须能访问信号量所在的这一块内存,所以无名信号量只能应用在同一进程间的线程或者共享内存间的进程。 b.有名信号量:用于进程(线程)间同步互斥 1&...
  • 3.05 PV操作

    2021-06-14 12:59:31
    pv操作中离不开信号量。 通常会有这样的写法 p(s) v(s) 其中的s就是信号量。 信号量是应用在pv操作中,一种专属的变量。 pv操作 Pv操作就是由p操作和v操作,组成的一套操作。 p(s) 首先会将信号量s做自减一的操作,...
  • 假定某两公共汽车上有一名司机和两名售票员,汽车当前正在始发站停车上客,试用信号量与PV操作求解该问题。 两名售票员是因为以前的公交车是两节车厢,所以是两名售票员,比较久远的题目背景啦~ 二、问题求解 ...
  • 哲学家进餐问题,特别经典的一道题,一起来练练手!
  • 1.PV操作的含义   PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:   P(S):①将信号量S的值减1,即S=S-1; ②如果S<0,进程置为等待状态,排入等待队列。...
  • 实验二:进程间的同步 一、 实验目的: 理解进程同步和互斥模型及其应用; 二、 实验内容: 利用通信API实现进程之间的同步;...建立司机和售票员进程,并实现他们的...用信号量的 PV操作 来实现对输出信息的加锁,最
  • 几年前对PV操作进行了基本的理解PV操作的初次理解。 现在进一步理解同步与互斥方向的问题。主要以题的方式理解。 如上述题,是20年408的真题。 首先要明白信号量的问题,信号量(semaphore)。 信号量...
  • 试给出有关取水、入水的PV算法描述。 问题分析: 小和尚之间是互斥关系,老和尚之间是互斥关系,老和尚和小和尚是互斥+合作;这样的话就可以看成是一个生产者消费者问题,只是互斥信号量比生产者消费者问题多了;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,813
精华内容 33,125
关键字:

pv操作