2015-01-31 2 views
0

У меня есть эта многопроцессном программа в C:Multiprocessing программа не дают желаемые результаты

#include <stdio.h> 
#include <unistd.h> 


int main(int argc, char **argv) 
{ 
    pid_t i = fork(); 
    if(i == 0) 
    { 
     execv("./prcs1", (char *[]){ "./prcs1", argv[1], NULL}); 
     _exit(1); 
    } 
    else if (i > 0) 
    { 
     execv("./prcs2", (char *[]){ "./prcs2", argv[0], NULL}); 
     _exit(2); 
    } 
    else 
    { 
     perror("Fork failed"); 
     _exit(3); 
    } 
} 

В этой программе ./prcs1 и ./prcs2 являются двумя исполняемыми файлами двух различных программ. ./prcs1 дает выход как Syscall finished и ./prcs2 дает выход Stdlibrary finished. И я получаю следующий результат в каждом цикле:

Syscall finished 
Stdlibrary finished 

Теперь мои вопросы:

  1. Работает ли программа выше двух процессов prcs1 и prcs2 параллельно?
  2. Если он работает параллельно, тогда я получаю один и тот же результат каждый раз, или я также могу получить вывод, на который приходит Stdlibrary finished, и Syscall finished на втором месте? Если это будет возможно, то почему я получаю одинаковый результат в каждом прогоне?
+0

Сколько времени требуется для выполнения? Если, например, 'Syscall' намного быстрее, чем' Stdlibrary', то вы получите тот же результат почти всегда. – VHarisop

+0

@VHarisop Когда я запускаю две программы отдельно, используя время, я получаю: real \t 0m0.044s, user 0m0.000s, sys 0m0.041s для программы Syscall и real \t 0m0.028s, user 0m0.019s, sys 0m0 .001s для процесса Stdlibrary. Итак, глядя на это время, будет ли результат всегда таким же? –

+0

Нет, они кажутся довольно сопоставимыми. Вы должны заглянуть в ответ Йоахима. – VHarisop

ответ

2

Да, вы создать процесс с функцией fork. После успешного вызова fork у вас будет два процесса, выполняющихся в «параллельном».

Однако вы не имеете никакого влияния на планировщик процессов, поэтому, прежде всего, вы не будете знать, какой процесс будет первым, и если вы не знаете, сколько времени выполняется каждая выполняемая вами программа, то вы не можете предсказать как долго каждый будет работать. Если все две внешние программы (prcs1 и prcs2) действительно распечатывают линию до стандартного вывода, вы не можете с уверенностью сказать, какая строка будет напечатана в первую очередь.

Фактически, если планировщик процессов в операционной системе решает переключить процесс в середине печати, выход может исказиться, так как оба процесса вывода будут смешаны друг с другом.

+0

Когда я запускаю две программы отдельно, используя время, я получаю: real 0m0.044s, пользователь 0m0,000s, sys 0m0.041s для программы Syscall и реальные 0m0.028s, пользователь 0m0.019s, sys 0m0.001s для Процесс Stdlibrary. Итак, глядя на это время, будет ли результат всегда таким же? –

+0

@LindaNu Как сказал OP, это зависит от планировщика процесса операционной системы. Это означает, что он также может зависеть от того, что еще работает одновременно с вашим компьютером и ресурсами, которые они используют. – Degustaf

+0

@Degustaf: Хорошо, я понимаю, я понимаю. Когда я проанализировал выходы с несколькими отчетами о печати, я увидел, что он начинает работать с процессом Stdlibrary, печатает некоторые его выходы, а затем начинает с процесса Syscall, печатает некоторые из своих выходов и делает это параллельно; Syscall заканчивается до и Stdlibrary один за ним, даже если это началось раньше. –

Смежные вопросы