Que modelos de distribuição de probabilidade esta condição de corrida?

9

Considere o seguinte comando: %código%.

Noções básicas sobre o que seria bifurcação para um novo shell, escrever bash -c "echo x; cat 1" | tee 1 para stdout, gravar x em stderr, sair e retornar o controle para o processo pai e gravar file 1 not found em stdout e em x . Portanto, esperaria que a saída final fosse 1 e o arquivo x contivesse exatamente a string 1 .

No entanto, este não é o caso. Na verdade, o arquivo x geralmente contém pelo menos duas instâncias de 1 e, às vezes, milhares de linhas de x s. Em um teste em lote de execução do comando dez mil vezes, o número médio de x s gravado no arquivo era 52,3, e a mediana era 1. O que a mecânica está causando isso? Que distribuição de probabilidade modela esse comportamento? Eu suspeito que seja condicionalmente geométrica e uniforme.

    
por Will Sherwood 10.08.2018 / 20:39

1 resposta

0

Isso é muito curioso, então eu tentei investigar isso com a ajuda de strace. Ran seu comando em um loop 1000 vezes:

mkdir {000..999}
for i in {000..999}; do
echo $i
(cd $i; strace -f -o trace.log bash -c 'bash -c "echo x; cat 1" | tee 1 >/dev/null'; )
done

Encontrou o arquivo com mais linhas ( wc -l */1 | sort -nr | head -n2 ) e verificou o trace.log correspondente. Eu certamente posso ver muito:

7567  <... read resumed> "x\n", 8192)   = 2
7567  write(1, "x\n", 2)                = 2
7567  write(3, "x\n", 2)                = 2
7567  read(0,  <unfinished ...>
7568  read(3, "x\n", 131072)            = 2
7568  write(1, "x\n", 2)                = 2
7567  <... read resumed> "x\n", 8192)   = 2
7567  write(1, "x\n", 2)                = 2
7567  write(3, "x\n", 2)                = 2
7567  read(0,  <unfinished ...>
7568  read(3, "x\n", 131072)            = 2
7568  write(1, "x\n", 2)                = 2
7567  <... read resumed> "x\n", 8192)   = 2
7567  write(1, "x\n", 2)                = 2
7567  write(3, "x\n", 2)                = 2
7567  read(0,  <unfinished ...>

Onde 7567 é tee 1 e 7568 é cat 1 . Os dois estão definitivamente alternando, então sim, como suspeitamos, isso é tudo sobre o momento da execução (e eu imagino mudança de contexto) dos dois comandos.

    
por 25.09.2018 / 18:57