程序的并发执行

一、程序的顺序执行

在早期无操作系统及单道批处理系统时,程序都是按照顺序进行执行的。先进入内存的先执行,在执行的过程中不能执行其他的程序。程序中的指令也是按照顺序执行,一条指令正在执行时不能开始执行另一条指令。所以程序顺序执行有以下几个特点。

1.1、顺序性

处理机的操作,严格按照顺序执行,前一操作还没执行完毕,后继操作则不能继续执行。

1.2、封闭性

程序是在封闭的环境下运行的。即程序在运行时独占全机资源,各资源的状态只有本程序才能改变。程序一旦开始运行,其结果不受外界的影响。

1.3、可再现性

只要程序的环境和初始条件相同,无论程序执行多少次,执行结果相同。例如一个加法运算,无论执行多少次,相加的结果都不会发生改变。

二、程序的并发执行

程序的并发执行是指在同一时间间隔内运行多个程序。也就是在一个程序运行结束之前,可以运行其它的程序。对于用户来说,有多个程序在同时向前推进,但是从微观上来看,任意时刻CPU上都只有一个程序在执行。在多道程序系统和分时系统都允许程序并发执行,程序的并发执行有以下几个特点。

2.1、间断性

程序在并发执行时,因为要共享资源,但是资源往往都少于正在执行的程序数,所以会存在资源抢占的问题。因而,每个程序在CPU上运行,都是时断时续的。当一个资源被占用时,其他需要该资源的程序不得不暂停,待资源被释放时方可执行。

2.2、失去封闭性

程序正在并发执行时,由于它们共享资源或者合作完成同一项任务,系统的状态不再受其中一个程序的控制和改变,所以就失去了封闭性。比如淘宝卖商品,每卖出一件库存都要减去1,而进货又可以对库存进行增加,所以库存已经不是某个程序特有的了。伪代码如下:

<?php
    //卖出商品
    sentProduct('商品1');
    $stock--;   //库存减一

    //进货
    purchase('商品1');
    $stock += 10;   //库存加10
?>

2.3、不可再现性

因为程序在并发执行时失去了封闭性,所以任何一个程序都有可能对系统的状态进行改变,这也意味着程序执行的结果可能会不相同。例如两个程序同时往一个文件追加内容,在执行数次之后,每个文件所展现出的内容可能各不相同。

<?php
    //程序a往文件追加1
    for ($i = 0; $i < 5; $i++) {
        file_put_contents('/tmp/test.txt', 1, FILE_APPEND);
    }

    //程序b往文件追加2
    for ($i = 0; $i < 5; $i++) {
        file_put_contents('/tmp/test.txt', 2, FILE_APPEND);
    }
?>

同时执行两次的结果:

1212121212  //结果1
1122122121  //结果2
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 程序并发执行时会失去封闭性和可再现性,主要是因为并发执行会引入竞态条件和不确定性。当多个线程同时访问共享资源时,由于执行顺序不确定,可能会导致不同的结果。这就会导致程序失去封闭性和可再现性,因为同样的输入可能会产生不同的输出。此外,并发执行还可能会导致死锁和饥饿等问题,进一步影响程序的正确性和可靠性。因此,在编写并发程序时,需要特别注意这些问题,采取合适的同步机制和调度策略,以确保程序的正确性和可靠性。 ### 回答2: 程序并发执行时会失去封闭性和可再现性,主要是因为并发执行中的操作是非原子性的,即一个操作可以被中断,同时其他线程或进程也可以去修改同一个资源,从而导致资源的不一致性和不可再现性。 具体而言,程序的封闭性是指程序执行结果只与程序自身有关,而不会受到外界环境的影响,而在并发执行中,不同线程或进程之间共享资源,如果其中有一个线程或进程修改了共享资源,就会影响到其他线程或进程的计算结果,从而导致程序的不封闭性。 另外,程序的可再现性是指在相同的条件下,程序可以反复执行,得到相同的结果。在并发执行中,由于线程或进程的抢占和调度是不可控的,不同线程或进程执行顺序可能会不同,导致程序执行结果也不同,因此程序的可再现性会受到影响。 此外,由于并发执行中存在的类似死锁、饥饿等问题也会导致程序结果不确定性和可再现性的降低。 因此,在并发程序设计中,需要避免共享资源的竞争和不一致性问题,采用同步机制和锁等手段确保正确性和可再现性。同时,在设计程序时,也需要考虑并发执行的影响,避免出现共享资源竞争、死锁等问题,保证程序的正确性和稳定性。 ### 回答3: 程序并发执行指的是多个程序或者进程在同一时间内同时运行,它们之间可能会发生竞争或者交互。在这种情况下,程序可能会失去封闭性和可再现性。 在并发执行的情况下,多个程序可能会访问同一块内存或者资源,如果没有正确的同步机制,就会导致数据竞争,从而影响程序的封闭性。例如,如果一个写操作和一个读操作同时对同一块内存进行操作,就有可能出现竞争,读操作读到的数据可能并不是写操作写入的数据,这就会导致数据的不一致性。在这种情况下,程序的封闭性就会被破坏。 此外,程序并发执行还容易出现非确定性的现象,从而影响可再现性。在单线程执行的情况下,程序执行流程是固定的,给定相同的输入,输出也是固定的。但是在并发执行的情况下,程序执行流程可能会受到外界环境的影响,导致输出的结果不确定。例如,多个线程同时访问同一个共享变量,由于执行顺序的不确定性,就可能导致每次运行程序输出的结果都不相同,这就严重影响了程序的可再现性。 综上所述,程序并发执行容易破坏程序的封闭性和可再现性,对于开发人员来说,需要采取一些措施来避免这些问题的发生,例如加锁、同步等机制。同时,对于测试人员来说,也需要对程序并发性进行充分的测试,确保程序并发执行的情况下依然能够保持封闭性和可再现性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值