No, no es inherentemente bloqueo. Solo se bloquea si la toma de escucha que le pasó no se marcó como no bloqueante.
¿Una llamada de bloqueo no desperdiciaría recursos innecesariamente hasta que algún cliente intente conectarse?
A diferencia de DOS, todos los sistemas operativos tipo Unix son multitarea . Si un proceso en particular realiza una llamada al sistema que bloquea, el núcleo simplemente lo pone en suspensión y reanuda la ejecución de algún otro proceso que no esté en estado de bloqueo. No se desperdician recursos innecesariamente.
- ¿Es el curso de seguridad de red el mejor para construir nuestro futuro?
- ¿Cómo podemos extraer la carga útil de Wireshark?
- ¿Cuál es la diferencia entre una red de difusión y una red conmutada?
- ¿Cómo funciona la conexión PPPoE?
- ¿Cómo conectar dos computadoras en una red doméstica?
Esta es la razón por la cual el modo predeterminado de todas las operaciones de E / S bajo sistemas operativos tipo Unix es el bloqueo: simplifica la lógica del código en la mayoría de los casos (“mi conexión aún no está aquí; el núcleo me pondrá a dormir y me despertará cuando llegue) , y continuaré como de costumbre, no se preocupe “), mientras se garantiza la máxima utilización de todos los recursos.
Si está escribiendo una aplicación C10K, o de lo contrario necesita que su E / S no se bloquee por cualquier razón, puede marcar sus descriptores de E / S como no bloqueantes , pero luego tendrá que volver para verificarlos y más, que es exactamente el tipo de desperdicio del que te estás quejando.
O bien, puede usar llamadas del sistema como select, poll y epoll en una gran cantidad de descriptores de bloqueo normales, que se bloquearían hasta que cualquiera de sus descriptores esté listo para hacer cualquier E / S que desee realizar. Esto ayuda a evitar una situación en la que está bloqueando un descriptor mientras que otros 20 están “listos para funcionar”.