API без системных вызовов

Решение Perl 5.14 (который короче и IMO легче читать — особенно, если Вы форматируете его по нескольким строкам в файле, вместо как острота),

perl -pE 's{(\[ .*? \])}{$1 =~ y/ //dr}gex'

Это работает, потому что в 5,14, механизм регулярного выражения повторно используем. Здесь это, расширено и прокомментировало:

s{
    (\[ .*? \])         # search for [ ... ] block, capture (as $1)
}{
    $1 =~ y/ //dr       # delete spaces. you could add in other whitespace here, too
                        # d = delete; r = return result instead of modifying $1
}gex; # g = global (all [ ... ] blocks), e = replacement is perl code, x = allow extended regex
5
02.01.2014, 18:25
3 ответа

У меня нет той книги для проверки, но я принимающий ее использование нормального значения системных вызовов, затем системный вызов является вызовом в ядро для выполнения некоторой операции, которую аппаратные средства считают привилегированным или не знают. Это используется для осуществления полномочий, и т.д. в системе. Таким образом, необходимо сделать системный вызов (среди многих других вещей):

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

Математика не является одной из тех вещей. Как правило, это не требует никакого вмешательства от ядра.

6
27.01.2020, 20:34
  • 1
    , который я буду ценить, если можно предложить меня некоторые хорошие ссылки и бумаги, которые объясняют далее по этой теме. –  Jay 02.01.2014, 19:09
  • 2
    @Jay Вы могли бы хотеть запуститься со статьи Википедии о Системных вызовах обзора... –  derobert 02.01.2014, 19:11
  • 3
    Если математические функции не требуют вмешательства от ядра, как делает прикладную программу, взаимодействует с ЦП? Я уверен, что это непосредственно не взаимодействует. –  Jay 02.01.2014, 19:19
  • 4
    @Jay Непосредственно. ЦП выполняет инструкции из памяти. Программа состоит из инструкций, сохраненных в памяти. –  derobert 02.01.2014, 19:20
  • 5
    Спасибо за быстрые ответы. Вы очистили много беспорядка. –  Jay 02.01.2014, 19:30

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

Можно использовать strace показать все системные вызовы данной программы.

3
27.01.2020, 20:34
  • 1
    Первая строка главы 10. Системные вызовы в упомянутой выше книге говорят "Процессы предложения операционных систем, работающие в Непривилегированном режиме ряд интерфейсов для взаимодействия с устройствами, такими как "ЦП", диски и принтеры'. –  Jay 02.01.2014, 18:40
  • 2
    @Jay В целях того определения, выполняя код не рассчитывает как "взаимодействие". Я думаю что-то как getcpu() то, что предназначено. –  mattdm 02.01.2014, 18:49

Выполнение процесса выполняет инструкции ЦП по определению. Существует несколько инструкций ЦП, которые могут только быть выполнены в привилегированном режиме, главным образом инструкции, связанные с доступом к аппаратным средствам вне ЦП включая RAM или к изменению некоторых конфигураций. Ядро выполняется в привилегированном режиме, обычные процессы выполняются в непривилегированном режиме. Детали того, что “означает привилегированный режим”, зависят от архитектуры ЦП.

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

Когда процесс хочет выполнить операцию, которая требует полномочий, он должен вызвать некоторый код ядра, чтобы сделать это. Существует специальная инструкция ЦП, которая одновременно переключает ЦП на привилегированный режим и ответвления к предопределенному адресу в памяти. В подобной Unix операционной системе (и в большинстве Ose в целом), это действие называют системным вызовом.

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

Вы видите документацию для системных вызовов в Вашей системе в разделе 2 из руководства. Вы видите, какие системные вызовы процесс делает путем запуска его через truss на Солярисе и FreeBSD, strace на Linux или эквивалентах под другими вариантами Unix.

3
27.01.2020, 20:34

Теги

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