¿Cómo se implementan las tablas hash en el kernel de Linux? ¿Cómo funcionan para diferentes tipos de datos y estructuras?

Las tablas hash son estructuras de datos importantes, y el núcleo las utiliza en muchos subsistemas. Es bastante común que cada usuario implemente su propia versión, según las necesidades y la complejidad. Sin embargo, en general, las estructuras de datos como estas están bastante integradas en el corazón de los componentes que las utilizan.

Se deben considerar tres factores al decidir si usar una tabla hash o alguna otra estructura de datos más elegante / más compleja, como los árboles. Estos son (i) la clave y el método hash, (ii) la cantidad de objetos ( n ) y (iii) la cantidad de cubos ( m ) en la tabla. Dado que las búsquedas son O(n/m) , tener una relación 1: 1 se acercará naturalmente a la complejidad constante, O(1) y, por lo tanto, reducirá las colisiones y hará un uso ideal de dichas estructuras de datos. Es por esto que el núcleo no tiene una forma única de manejar las tablas hash, y es mejor que cada usuario decida las mejores condiciones para el trabajo. Del mismo modo, se sabe que las tablas hash son útiles para situaciones en las que el rendimiento es crítico (rutas activas) y es mejor eliminar cualquier sobrecarga adicional que pueda imponer alguna biblioteca / módulo .

En 2012, Sasha Levin pudo unificar algunas de las tablas hash en el kernel, proporcionando un conjunto de interfaces simple y directo. Algunos usuarios populares incluyen las colas de trabajo, el programador de elevadores para bloques de E / S y las páginas transparentes (THP) en la administración de memoria, entre otros. Todos estos están asignados estáticamente .

Por otro lado, las tablas asignadas dinámicamente pueden ser mucho mejores en escenarios desconocidos y permiten una mejor escalabilidad. Esto normalmente se hace usando alguna variante de kmalloc() o alloc_large_system_hash() . La función posterior es particularmente útil para tablas hash grandes y sistemas NUMA, ya que la memoria se distribuye entre los nodos, por lo que tiene una mejor localidad de datos. Esta memoria proviene del inicio temprano. Los usuarios incluyen futexes, la tabla PID y el dcache.

More Interesting

¿Qué algoritmo es mejor para una variante 4 * 4 * 4 * 4 del último dedo del pie tic-tac considerando un límite de tiempo de 15 segundos?

Dada una matriz S de n enteros, ¿hay elementos a, b, c en S tales que a + b + c = 0? ¿Encuentra todos los tripletes únicos en la matriz que da la suma de cero?

Cómo entender un algoritmo de búsqueda CSP

¿Por qué los temas 'estructura de datos' y 'algoritmo' siempre están conectados? ¿Hay un curso o libro que solo se ocupe de la estructura de datos?

¿Por qué está completo el problema de la mochila NP incluso cuando tiene complejidad O (nW)?

¿Cómo abordar este problema gráfico? ¿Es NP-completo?

Cómo encontrar el enésimo número de Ulam rápidamente

Cómo construir un gráfico si se proporciona el recorrido DFS y el recorrido BFS

Como programador autodidacta de 24 años, ¿debo comenzar con la programación competitiva o el desarrollo web?

¿Existen constructores de algoritmos comerciales Plug and Play que no requieren ninguna habilidad de codificación?

¿Dónde puedo encontrar un algoritmo de relevancia marginal máxima en Python para la eliminación de redundancia en dos documentos?

¿Qué tipos de algoritmos o códigos no valen la pena publicar en trabajos académicos de estudiantes graduados?

¿Cuáles son los usos prácticos de 2-3 árboles o árboles rojo-negros?

¿Cuáles son los mejores libros para aprender el comercio algorítmico con Python?

¿Por qué el tiempo de espera corta cwnd a 1 y 3 ACK duplicado a la mitad en el algoritmo de control de congestión?