Зачем нужна красная зона? Я же могу просто использовать стек?

Это перевод Why do we even need to define a red zone? Can’t I just use my stack for anything? Автор: Реймонд Чен.

В Windows стек

Читать на сайте автора.

Ответ на задачку №25

Ответ на задачку №25.
Сначала можно подумать что утверждение — не верно. Действительно:

begin
TMyThread.Create.Start;
end.

Эта программа завершится немедленно, не дав потоку выполниться. Иными словами, программа завершается, когда в ней есть работающие потоки.

Однако, если вы читаете документацию (MSDN) или, например, Рихтера, то заметите, что там говорится о завершении процесса при выходе или завершении всех его потоков. Это явно противоречит ситуации выше.

В чём же дело?

Дело в том, что MSDN и Рихтер говорят о ситуации в «голой» системе, но мы рассматриваем случай, когда поверх системы накладывается ещё код поддержки языка — RTL. Система, действительно, не делает различий между главным и фоновыми потоками и закроет процесс только тогда, когда завершится каждый из потоков — вне зависимости от того, главный он или нет.

Но для RTL разница есть — главный поток выделяется особо. В частности, RTL с помощью «магии компилятора» вставляет скрытый вызов Halt(0) сразу после выполнения главного блока программы (т.е. в строке «end.»). Вот и получается, что при нормальном выходе программы вызывается Halt(0), который, в свою очередь, вызывает ExitProcess, которая завершает все потоки и, следовательно, процесс.

RTL не одинока в таком поведении. Большинство библиотек поддержки языков поступают так же. Почему они это делают? Потому что в современном мире программа понятия не имеет, какие потоки в ней выполняются.

Читать на сайте автора.

Старомодная матчасть по завершению процессов

Это перевод The old-fashioned theory on how processes exit. Автор: Реймонд Чен.

В былые времена жизнь была намного проще.

В прежние времена считалось, что процессы контролируют свои

Читать на сайте автора.

Как однажды ядро Windows пыталось противостоять гамма-лучам, разрушающим кэш процессора

Это перевод For a brief period, the kernel tried to deal with gamma rays corrupting the processor cache. Автор: Реймонд Чен.

Однажды вот такой код был

Читать на сайте автора.

Что случилось со шрифтом Arial Unicode MS?

Это перевод What happened to the Arial Unicode MS font? Автор: Реймонд Чен.

Клиент хотел узнать, что случилось со шрифтом Arial Unicode MS. Раньше он устанавливался

Читать на сайте автора.

Ответ на задачку №24

Ответ на задачку №24.

Задачка была про «чистое» и «грязное» завершение работы программы. Иногда я вижу такую классификацию:

  • TerminateProcess — самое «грязное» завершение работы процесса. Процесс и потоки убиваются сразу. Код очистки (финализация DLL) не выполняется.
  • ExitProcess — более «правильное» завершение процесса. Выполняется код очистки DLL.
  • Halt — аналог ExitProcess в RTL языка. Дополнительно выполняет очистку RTL (финализация модулей и др.).
  • Application.Terminate — замена Halt для приложений на VCL (с циклом выборки сообщений). Стоит немного отдельно, так как не выполняет немедленного завершения процесса. Зато позволяет провести более полную очистку (финализация форм и т.п.).

С этой точки зрения Halt выглядит предпочтительнее ExitProcess и уж тем более — TerminateProcess. И если приложение не использует VCL, то может показаться, что это — даже и правильное завершение процесса.

Тем не менее, в указанном коде есть одна явная и одна потенциальная проблемы.
Начнём со слона в комнате: Halt выполняет немедленное завершение программы — что означает, что никакой код после Halt не выполняется. В том числе — и очистка строки S. Это означает, что в этом коде — утечка памяти. Это и был вопрос задачки.

Да, это может не иметь значения на практике, поскольку вся память процесса будет освобождена ОС при выходе. Тем не менее, она будет определена как утечка любым отладочным инструментом для поиска утечек памяти. Иными словами, её нужно устранить.

Второй проблемы может и не быть в конкретно взятой программе (т.е. к задачке это отношения уже не имеет), но потенциально она возникнуть может (и легко). Надо иметь в виду, что Halt не выполняет полную (читай: «правильную») очистку, поскольку любые вышестоящие блоки finally не выполняются. Зато Halt выполняет секции finalization ваших модулей. С точки зрения программы у неё «волшебным» образом при выполнении оказываются пропущенными блоки кода. В частности, в пропущенных блоках может стоять финализация фоновых потоков. Т.е. при использовании Halt фоновые потоки будут всё ещё выполняться — что может оказаться неожиданным для кода очистки из секций finalization. Т.е. открываются широкие возможности для блокировок, ошибок доступа и т.п.

Мораль истории: не используйте Halt и ExitProcess. Если вам нужно чисто выйти из процесса, то нужно сделать это «естественным» способом — просто закончить выполнение главной процедуры основного потока. Чтобы перейти к её концу из произвольного места, можно использовать Exit и/или Abort (с подходящей конструкцией обработки на верхнем уровне).

А если вам нужно экстренно завершить процесс, то используйте TerminateProcess.

Читать на сайте автора.

Задачка №25

Верно ли это утверждение?

В Windows процесс завершается только тогда, когда завершается выполнение всех его потоков?

Читать на сайте автора.

В трёх экземплярах, будьте добры

Это перевод Windows Confidential: In Triplicate, Please? Автор: Реймонд Чен.

Однажды клиент заметил, что размер файла, о котором сообщал Explorer, не меняется, пока приложение, которое обновляет

Читать на сайте автора.

При отключении службы планировщика заданий происходят всякие плохие вещи. Это плохо или нет?

Это перевод All sorts of bad things happen when we disable the Task Scheduler service, is that bad? Автор: Реймонд Чен.

Клиент при помощи групповой политики

Читать на сайте автора.

Ранняя история файловых атрибутов Windows, и почему в них есть место между System и Directory

Это перевод The early history of Windows file attributes, and why there is a gap between System and Directory. Автор: Реймонд Чен.

Если вы посмотрите на

Читать на сайте автора.