MacOSX :Количество аргументов в командной строке

If a program hits some exception handler that requires long-running synchronous processing before it can start running again (e.g. hits a page fault that requires a disk read), how does the kernel identify that the context should be switched? In order to achieve this, it would seem another process would need to run?

Обработчик ошибки страницы ядра вызывает планировщик ядра, если ошибка страницы требует чтения диска.

https://elixir.bootlin.com/linux/v4.17/source/mm/filemap.c#L2470

filemap_fault()
wait_on_page_locked() - usually via __lock_page_or_retry()
wait_on_page_bit()
wait_on_page_bit_common()
io_schedule()
schedule()

Я не совсем понял, что вы имеете в виду под этими вопросами, но я думаю, что ответ на второй вопрос будет "нет, в этом нет необходимости".

Игнорируя оптимизации, ядро ​​всегда будет переключать контекст сразу после постановки в очередь чтения. (Т.е. это происходит до того, как filemap_fault()вызовет __lock_page_or_retry(). Логика там немного более запутанная, но вы можете пройти по ней без особого труда ).

Если других запущенных процессов нет, ядро ​​переключит ЦП на его бездействующую задачу. (Ядро Linux имеет на -процессор простаивающих потоков . Вы не видите их, например. в top, однако, в отличие от Windows «System Idle Process» ).

2
13.08.2020, 10:32
1 ответ

Дальнейшие исследования показывают (Версия MacOS неизвестна):

Effective length = 
  length of arguments +
  5 * number of arguments +
  length of body/value of exported functions/variables +
  length of names of exported functions/variables +
  4 * number of exported functions/variables

Если эффективная длина < 256 Кбайт, команда будет выполнена. Неясно, верно ли это для всех версий MacOS.

Для MacOS El Capitan 10.11.4 это дает пессимистическую длину командной строки (, предполагая, что команда, которую вы хотите запустить, имеет вид/bin/echo x x x x...):

perl -e '                                                                             
  $envc=(keys %ENV);                                                                    
  $envn=length join"",(keys %ENV);                                                      
  $envv=length join"",(values %ENV);                                                    
  $maxlen=3+(262144 - $envn - $envv) / 5 - $envc*2;                                     
  print("Max len = $maxlen\n");
'                                                        

Неясно, верно ли это для всех версий MacOS.

1
18.03.2021, 23:13

Теги

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