О разветвлении процессов в Windows
2014-09-17 09:26 pmНекоторые люди не понимают, почему в Win32 API нет аналога системного вызова fork(2) из POSIX API. Ведь его можно реализовать на основе функции NtCreateProcess из NT Native API! В справочнике Гэри Нэббета даже есть соответствующий пример.
Это достаточно просто объяснить: разветвление процессов несовместимо с глобальными (межпроцессными) мьютексами. Если на момент разветвления мьютекс находился в заблокированном состоянии, тогда какой из двух процессов должен оказаться владельцем этой блокировки? И как уведомить о произошедшем событии lock elision библиотечный код, который не рассчитан на получение таких уведомлений?
В POSIX подсистеме Windows NT (MS Services for UNIX, также известной под торговой маркой Interix) есть fork, и следовательно нет глобальных мьютексов.
А в подсистеме Win32 есть глобальные мьютексы, а значит нет fork'а.
В "настоящих" POSIX-системах, таких как Linux и FreeBSD, есть и fork, и pthread-мьютексы, но природа этих мьютексов отличается от природы мьютексов Win32 — они процесс-локальны, примерно как критические секции в Win32. Таким образом, они могут пережить разветвление, не мешая друг другу в двух новых процессах.
Это достаточно просто объяснить: разветвление процессов несовместимо с глобальными (межпроцессными) мьютексами. Если на момент разветвления мьютекс находился в заблокированном состоянии, тогда какой из двух процессов должен оказаться владельцем этой блокировки? И как уведомить о произошедшем событии lock elision библиотечный код, который не рассчитан на получение таких уведомлений?
В POSIX подсистеме Windows NT (MS Services for UNIX, также известной под торговой маркой Interix) есть fork, и следовательно нет глобальных мьютексов.
А в подсистеме Win32 есть глобальные мьютексы, а значит нет fork'а.
В "настоящих" POSIX-системах, таких как Linux и FreeBSD, есть и fork, и pthread-мьютексы, но природа этих мьютексов отличается от природы мьютексов Win32 — они процесс-локальны, примерно как критические секции в Win32. Таким образом, они могут пережить разветвление, не мешая друг другу в двух новых процессах.