Pregunta

Los sistemas operativos leídos desde el disco más de lo que un programa solicita en realidad, porque un programa es probable que se necesitan cerca de información en el futuro. En mi solicitud, cuando voy a buscar un elemento desde el disco, me gustaría mostrar un intervalo de información alrededor del elemento. Hay un equilibrio entre la cantidad de información que solicito y espectáculo, y la velocidad. Sin embargo, ya que el sistema operativo ya se lee más de lo que solicitó, el acceso a estos bytes en la memoria ya está libre. ¿Qué puedo usar la API para averiguar lo que está en el caché del sistema operativo?

Como alternativa, podría utilizar archivos mapeados de memoria. En ese caso, el problema se reduce a saber si una página se intercambia en el disco o no. Se puede hacer esto en cualquier sistema operativo común?

EDIT: relacionados con el papel http://www.azulsystems.com/events/mspc_2008 /2008_MSPC.pdf

¿Fue útil?

Solución

Si lo necesitas puedes utilizar el segundo método, al menos en Linux. mmap() el archivo, a continuación, utilizar la función mincore() para determinar qué páginas son residentes. Desde la página del manual:

  

int mincore(void *addr, size_t length, unsigned char *vec);

     

mincore() devuelve un vector que   indique si las páginas de la llamada   la memoria virtual del proceso son residentes   en el núcleo (RAM), y así no causará una   el acceso al disco (error de página) si   se hace referencia. Los rendimientos del núcleo   información acerca de la residencia   las páginas que empiezan en la dirección de addr,   y continuando por bytes length.

Hay, por supuesto, una condición de carrera aquí - mincore() se puede decir que una página es residente, pero podría entonces ser intercambiado justo antes de que acceda a ella. C'est la vie .

Otros consejos

Usted está partiendo de una presunción equivocada. Al menos en Linux, el sistema operativo va a tratar de averiguar los patrones de acceso del programa. Si se lee un archivo secuencial, el kernel precargar secuencialmente. Si saltas por el archivo mucho, el núcleo probablemente será confundido al principio, pero luego se detendrá la obtención previa.

Así que si realmente son acceso a su archivo de forma secuencial, ya sabes lo que probablemente prefetched: el siguiente bloque de datos. Si usted está buscando al azar, probablemente nada más en las proximidades se prefetched.

Trate de acercarse a este de una manera diferente. Antes de llamar a read () para obtener la información que necesidad , llamada fadvise () para permitir que el sistema operativo sabe lo que desea para que se inicie la carga ..

También tengo curiosidad por saber qué tipo de aplicación que se está utilizando que puede funcionar correctamente sólo opera en los datos que le pasa a estar en el archivo de caché por casualidad. Siento que pudimos encontrar una buena manera de hacer frente a sus necesidades si publicado un poco más de información.

Desde luego, no se puede hacer en Windows. En las ventanas del comportamiento futuro de lectura es hasta el sistema operativo, e incluso si pudiera decirle lo mucho que había leído antes, no le haría ningún bien, porque tan pronto como se había descubierto, en la páginas de memoria que son se utiliza para almacenar en caché podría haber sido recuperada por algún otro uso.

Lo mismo vale para determinar si una página es residente o no. Tan pronto como se haya encontrado la respuesta podría cambiar cuando algún otro hilo necesita la memoria para otra cosa.

Si realmente quería hacer adelgaza tipo de cosas en Windows puede desactivar el almacenamiento en búfer y gestionar los buffers de sí mismo. Este es el camino más rápido IO, pero también es el más complejo -. Usted tiene que tener mucho cuidado, ya menudo el sistema operativo todavía puede hacerlo mejor

  

¿Qué API que puede utilizar para averiguar lo que está en el caché del sistema operativo?

Ciertamente no hay manera estándar de hacer esto para cualquier sistema POSIX, y no al tanto de ninguna manera específica no estándar de Linux. El único que se puede saber (casi) seguro es que el sistema de archivos se habrá leído en un múltiplo del tamaño de la página, por lo general 4kB. Por lo tanto, si su lecturas son pequeñas, se puede saber con alta probabilidad (aunque no seguro) que los datos en la página de los alrededores está en la memoria.

Se podría, supongo, hacer cosas como tricksy momento cuánto tiempo se tardó un sistema de lectura al completo. Si es rápido, es decir 100s de microsegundos o menos, probablemente fue un acierto de caché. Una vez que se levanta a una milésima de segundo o así, era probablemente un error de caché. Por supuesto, esto no realmente le ayuda mucho, y es muy muy frágil.

Tenga en cuenta que una vez que el sistema de archivos ha copiado los datos a los búferes de usuario, es libre para descartar inmediatamente los amortiguadores que sostienen los datos del disco. Probablemente no lo hace de inmediato, pero no se puede decir con seguridad.

Finalmente, la sugerencia de segundos @ Karmastan: explicar el extremo más ancho que estamos tratando de lograr. Es probable que haya una manera de hacerlo, pero el que usted ha sugerido que no lo es.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top