Embudo (computación concurrente)


En Informática , un embudo es una primitiva de sincronización utilizada en el desarrollo del kernel para proteger los recursos del sistema. Utilizados por primera vez en Digital UNIX como una forma de "canalizar" la ejecución del controlador de dispositivo en un solo procesador, los embudos ahora se utilizan en el kernel de Mac OS X para serializar el acceso a la parte BSD de XNU . [1]

Un embudo es un mecanismo de exclusión mutua ( mutex ) que evita que más de un subproceso acceda a ciertos recursos del núcleo al mismo tiempo. Cada subproceso adquiere un embudo cuando ingresa a una parte sincronizada del kernel y lo libera cuando sale. Si un subproceso se bloquea (duerme) mientras sostiene un embudo, el kernel obliga al subproceso a soltar automáticamente el embudo, lo que permite que otros subprocesos ingresen a la parte sincronizada del kernel.

Debido a que un embudo se descarta automáticamente cuando un subproceso se bloquea, se debe tener cuidado para garantizar que los recursos sincronizados se adquieran nuevamente después de cualquier operación de bloqueo. Específicamente, adquirir un embudo puede ser una operación de bloqueo, por lo que si se necesitan varios embudos, deben adquirirse a la vez. Esto limita la utilidad de los embudos porque aumenta la granularidad del bloqueo cuando es necesario mantener varios embudos a la vez.

Solo hay un embudo en OS X 10.4 y superior. Antes de la versión 10.4, había dos embudos: uno protege los recursos de la red y el otro protege otros recursos del núcleo BSD. A un hilo solo se le permitía contener un embudo a la vez, y mantener ambos causaría un pánico en el núcleo . Como resultado de estas limitaciones y la falta de granularidad, los embudos se están eliminando gradualmente de Mac OS X. Por ejemplo, el embudo de red se reemplazó por mecanismos de bloqueo de grano más fino.