сделать цикл параллельным

Мой учитель сказал, что на каждом физическом диске есть таблица i-узлов, после которой идут данные файлов.

Это в целом верно. Точнее, в каждой файловой системе есть таблица индексных дескрипторов, и на каждом разделе есть отдельная файловая система. (Все может усложниться, но здесь нам не нужно вдаваться в подробности.)

Таблица inode файловой системы отображает номера inode в метаданные файла . Обычно это большой массив структур фиксированного размера. Например, номер элемента 1234 этого массива - это номер inode 1234. Inode содержит такую ​​информацию, как права доступа к файлу, время его модификации, тип файла и т. Д., А также указание того, где находится содержимое файла.

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

Это таблица, в которой имена файлов сопоставляются с номерами inode . То есть каталог представляет собой список записей (или некоторую более сложную структуру данных), и каждый элемент списка содержит имя файла и номер inode. Чтобы найти метаданные и содержимое файла, система считывает номер индексного дескриптора из каталога, а затем считывает указанную запись в таблице индексных дескрипторов. Чтобы найти файл по его пути, система начинает с корневого индексного дескриптора, находит, что это каталог, находит запись каталога для первого элемента, считывает его индексный дескриптор и т. Д.

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

1
11.09.2017, 03:15
3 ответа

С GNU Parallel это выглядит так:

parallel echo process with a={1} and b={2} ::: 1 2 3 ::: 0.1 0.2 
seq 1 3 | parallel echo process with a={1} and b={2} :::: - ::: 0.1 
parallel echo process with a={1} and b={2} :::: <(seq 1 3) ::: 0.1 0.2

Я предполагаю, что echo является всего лишь примером, так как распараллеливание echo вряд ли стоит того.

3
27.01.2020, 23:24

Это должен быть комментарий, но комментариев слишком мало.

Убедитесь, что ваше решение работает для вывода произвольных размеров и не смешивает вывод одного задания с другим. Вот небольшой пример, чтобы проверить это:

#!/bin/bash                                                                               

# stress test of parallelizing programs                                                   

longline() {
    # print one big line with 'a's followed by 'b's followed by 'c's                      
    perl -e 'print "@ARGV ", map { "$_"x10000000 } (a..c)' "$@"
    echo
}


echo "Run testprogram in parallel"
for a in $(seq 1 3)
do
    for b in 0.1 0.2
    do
        longline $a $b &
    done
done |
# use 'tr' to compress many 'a's into a single 'a'                                        
# if the output is not 'abc' on every line, lines have been mixed                         
  tr -cs '@'

echo "Run testprogram in serial"
for a in $(seq 1 3)
do
    for b in 0.1 0.2
    do
        longline $a $b
    done
done | tr -cs '@'


echo "Compare with GNU Parallel"
export -f longline
parallel -kj0 longline :::: <(seq 1 3) ::: 0.1 0.2 | tr -cs '@'
0
27.01.2020, 23:24

Если то, что вы запускаете во внутреннем цикле, занимает некоторое количество времени (echo очень быстро запускается), то, когда циклы запустили все асинхронные процессы, они будут работать одновременно.

Сами петли не являются «параллельными».

0
27.01.2020, 23:24

Теги

Похожие вопросы