【问题标题】:How to properly set properties simultaneously in SimGrid?如何在 SimGrid 中同时正确设置属性?
【发布时间】:2016-08-02 14:15:45
【问题描述】:

有一个进程启动了 100 个进程:

for (int i = 0; i < 100; ++i) {
        MSG_process_create("w", executor, NULL, MSG_host_self());
    }

执行器创建示例任务并执行它。所以有100个进程同时开始执行任务并同时完成。为了监控我有void plusOneActiveProcess()void minusOneActiveProcess()的进程数:

由于所有executor 进程同时启动,一切正常:

[  0.000000] (2:w@Worker) Active process amount is 1
[  0.000000] (3:w@Worker) Active process amount is 2
[  0.000000] (4:w@Worker) Active process amount is 3
....................................................
[  0.000000] (101:w@Worker) Active process amount is 100

executor 完成执行任务时,每个进程都应该逐步减少(如我所料)活动进程的数量。但这并没有发生:

[100.000000] (101:w@Worker) Active process amount is 99
[100.000000] (2:w@Worker) Active process amount is 99
[100.000000] (3:w@Worker) Active process amount is 99
....................................................
[100.000000] (100:w@Worker) Active process amount is 99

如何正确操作?

这是函数plusOneActiveProcess()minusOneActiveProcessexecutor()的代码:

int executor(){
    plusOneActiveProcess();
    msg_error_t a = MSG_task_execute(MSG_task_create("", 1e9, 0, NULL));
    minusOneActiveProcess();
    MSG_process_kill(MSG_process_self());
    return 0;
}

void plusOneActiveProcess(){
    char kot[50];
    long number;
    number = xbt_str_parse_int(MSG_host_get_property_value(MSG_host_self(), "activeProcess"), "error");
    number++;
    sprintf(kot, "%ld", number);
    MSG_host_set_property_value(MSG_host_self(), "activeProcess", xbt_strdup(kot), NULL);
    XBT_INFO("Active process amount is %s", MSG_host_get_property_value(MSG_host_self(), "activeProcess"));
    memset(kot, 0, 50);
}

void minusOneActiveProcess(){
    char kot[50];
    long number;
    number = xbt_str_parse_int(MSG_host_get_property_value(MSG_host_self(), "activeProcess"), "error");
    number--;
    sprintf(kot, "%ld", number);
    MSG_host_set_property_value(MSG_host_self(), "activeProcess", xbt_strdup(kot), NULL);
    //XBT_INFO("Active process amount is %s", MSG_host_get_property_value(MSG_host_self(), "activeProcess"));
    memset(kot, 0, 50);
}

【问题讨论】:

    标签: process simultaneous simgrid


    【解决方案1】:

    啊哈,这很有趣。问题是 set_property() 是一个 SimGrid simcall,所以你可以保证所有对 set_property() 的调用总是以相同的顺序线性化。但是 get_property() 是一个常规函数调用,它在调度轮开始时返回值。由于所有进程都在同一个调度轮中询问该值,因此它们都得到相同的值(即 100),将其递减,然后执行 simcall 以推送新值(所有进程都希望推送 99)。

    您想让get+set 原子化,即确保任何进程在其他人执行get_property() 之前推送更新的值。为此,我建议使用 SimGrid Mutexes 之类的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2019-09-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多