Печать строки в обратном порядке, если выполняется условие

Эта статья сбивает с толку. Самая первая часть этой статьи кажется точной. Виртуальные адреса используются ядром ЦП, они сопоставляются MMU с физическими адресами, а затем используются при переходе в ОЗУ. Однако я никогда не слышал, чтобы это называлось «привязкой адреса». «Отображение» было бы более распространенным, но это просто проблема терминологии.

Затем в середине второго абзаца есть утверждение, относящееся к описанному выше процессу:

This type of binding requires the compiler to generate relocatable or offset based addresses from the source code.

Это вздор.

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

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

Все это происходит в представлении процесса о виртуальном адресном пространстве. Он нуждается в поддержке компилятора, поскольку сам код должен знать об этом.

Преобразование виртуальных адресов с помощью MMU не требует сотрудничества со стороны процесса.Вместо этого задача ОС - исправить сопоставления адресов по мере необходимости, например. если часть процесса выгружается для подкачки и требует доступа.

Сегментация также была упомянута, она работает почти так же, как объясняется в статье, за исключением того, что по крайней мере на x86 сегментация создает виртуальные адреса, поэтому виртуальная -в -физическая память отображение происходит после него.

(Все вышеизложенное основано на том, что я знаю о системах x86. Другие системы могут отличаться.)

-2
20.09.2020, 10:19
3 ответа

Ваш пример ввода/вывода в лучшем случае сбивает с толку, так что не знаю, что вы действительно хотите сделать, но вот как указать нужные значения в виде строки, а затем что-то с ними сделать:

awk '
    BEGIN {
        rels = "INTERACTS_WITH COEXISTS_WITH"
        split(rels,tmp)
        for (i in tmp) {
            relSet[tmp[i]]
        }
    }
    { print }
    $2 in relSet {
        print $3, $2, $1
    }
' file
1
18.03.2021, 23:03

Можно получить дважды printизменив порядок полей :{print $1, $2, $3}{print $3, $2, $1}

awk '/INTERACTS_WITH|COEXISTS_WITH/ {print $1, $2, $3}{print $3, $2, $1}' file

Jose FRIEND_OF John
Aspirin INTERACTS_WITH Penicilin
Penicilin INTERACTS_WITH Aspirin
Tree COEXISTS_WITH Grass
Grass COEXISTS_WITH Tree
Jane FRIEND_OF Andrew
John INTERACTS_WITH Paula
Paula INTERACTS_WITH John

Или, короче,:

awk '/INTERACTS_WITH|COEXISTS_WITH/ {print $0}{print $3, $2, $1}' file

Jose FRIEND_OF John
Aspirin INTERACTS_WITH Penicilin
Penicilin INTERACTS_WITH Aspirin
Tree COEXISTS_WITH Grass
Grass COEXISTS_WITH Tree
Jane FRIEND_OF Andrew
John INTERACTS_WITH Paula
Paula INTERACTS_WITH John
1
18.03.2021, 23:03

лучшее, что у меня есть (может быть с одной подкладкой)

awk 'BEGIN { r["INTERACTS_WITH"]=1 ; r["COEXISTS_WITH"]=1} 
$2 in r {print $3,$2,$1 ; print ; next} 
{print}'...

вряд ли это поможет сэкономить место.

1
18.03.2021, 23:03

Теги

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