【问题标题】:How to run processes?如何运行进程?
【发布时间】:2016-01-16 16:57:12
【问题描述】:

我创建了流程。其中之一prints "1" 30 times。另一个prints "2" 30 times。我希望这些进程依次打印它们的编号。

像这样:

1
2
1
2
...

但是每次运行程序,数字显示的都不一样:

1,2,2,1; 1,2,1,2,2,1,1,2.

有人可以告诉我,请问如何解决这个问题?

【问题讨论】:

  • 一旦一个进程被分叉,它们可以被一个共享变量控制。 0 的值意味着进程A 将打印,1 的值意味着进程B 将打印。他们可以在打印一次后切换值。
  • 不,它与 pid 无关,它是内核用来简化其工作的标识符。我认为他在谈论一个变量,该变量旨在控制第二个进程何时完成其工作,这意味着使用 mmap,即进程之间的共享内存。
  • 并非所有程序都以相同的速度运行。在fork() 之后,您无法控制程序的速度。在单处理器系统上,两者都不能同时获取 cpu,但这并不意味着它们可以同时执行。

标签: c


【解决方案1】:

这是预期的行为。在进程被分叉后(这是一个非常小的持续时间),两个进程将根据它们的 id 打印 2 或 1。因为 sleep 方法的分辨率是 1 秒,并且两个分叉进程之间的时间差与此相比太小了,所以打印 id 的顺序将不确定,因为两个进程调用 printf 函数的时间非常接近(在微秒分辨率上可能)。为了能够订购打印号码,您可以向其中一个流程添加延迟:

if(pid==0)
    {
        for(i=1;i<=30;i++)
        {
            printf("%s\n","2");
            sleep(2);
        }
    }
    else
    {
        sleep(1);
        for(i=1;i<30;i++)
        {
            printf("%s\n","1");
            sleep(2);
        }
    }

因此,分叉的进程预计不会以完美的同步运行。为了实现进程间同步,您可以使用进程间级别的共享变量:https://stackoverflow.com/a/13274800/2183287

【讨论】:

  • @Dean 编辑了答案,问题是 sleep() 分辨率为 1 秒,这对于区分具有几乎相同开始时间的两个进程来说相当大
  • 您的解决方案并不可靠。它可能适用于某些情况,但绝对不适用于许多情况。请阅读竞态条件
  • @Haris,我不是在提供解决方案,而是在解释问题的根源
  • 你的回答说要克服这个问题,..。这意味着这是一个解决方案。
  • @Haris,你确实在逗号后使用了省略号,这是什么意思?言语很重要,但这不是猎巫。
【解决方案2】:

进程完全独立运行。它们可能同时运行,它们可能一个接一个地运行,它们可能一次运行一个,在不确定的时间在它们之间切换,或者这些“模式”的任何混合。根本不知道哪个进程何时运行。

因此,让进程安全协作的唯一方法是让它们进行通信。在这里你有很多选择:

  • 管道允许您在两个分叉进程之间发送单向消息。默认情况下,此通信是阻塞的。

  • 锁允许一个进程独占访问您喜欢的任何资源。

  • 共享内存区域允许进程相互发送数据而无需等待其他进程。

  • 可以使用文件来代替锁或共享内存区域。它们的重量要大得多,但不需要流程是普通的体面。

无论您使用何种通信方式,都必须使用一种来获得正确协调的行为。

【讨论】:

    【解决方案3】:

    看完这些cmets,我觉得我需要自己想办法。

    由于两个或n个进程相互独立,它们不知道其他进程的存在,因此我们需要一些方法让它们在不破坏系统的情况下进行通信。

    这称为 IPC 或进程间通信,实现此目的的一种方法是shared memory。这是一个可以在两个或多个进程之间共享的内存区域。

    但是我们如何使用指针访问shared memory,我们可以这样做:

    父进程会用mmap分配一块共享内存。现在,进程可以使用指针访问该区域,以便在它们之间进行通信并共享数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 2010-11-08
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 2016-12-13
      • 1970-01-01
      相关资源
      最近更新 更多