Red de conocimiento informático - Material del sitio web - Cómo determinar si Solaris admite E/S asíncronas

Cómo determinar si Solaris admite E/S asíncronas

En el libro "Solaris Internals", el autor menciona un fragmento de código que detecta si el sistema admite E/S asíncronas.

Es muy útil comprender la implementación de E/S asíncronas y llamadas al sistema en sistemas Solaris.

Enumerelo aquí para compartirlo con todos.

1. Código fuente:

/*

* Prueba rápida de kaio. Lea 1k bytes de un archivo mediante E/S asíncrona.

* Compilar:

* cc -o aio aio.c -laio

* Ejecutar:

* aio file_name

*/

#include lt;stdio.hgt;

#include lt;sys/types.hgt;

#include lt;sys /fcntl.hgt;

#include lt;sys/aio.hgt;

#define BSIZE 1024

main(int argc, char *argv[] )

{

aio_result_t res;

char buf[BSIZE]

int fd

si ((fd=open(argv[1], O_RDONLY)) == -1) {

perror("open");

exit(-1);

}

aioread(fd, buf, BSIZE, 0L, SEEK_SET, amp; res);

aiowait(0); res.aio_return == BSIZE) {

printf("aio tuvo éxito\n");

close( fd); /p>

}

perror("aio");

}

2. Compilar:

# cc - o aio aio.c -laio

3. Ejecute:

Primero pruebe el dispositivo básico:

# truss -t kaio, lwp_create ./aio /dev / rdsk/c0t0d0s1

kaio(5, 0xFFBEF640, 0x00000000, 0xFF21FB68, 0x00000000, 0xFFBEF648, 0x00000000) = 0

lwp_create( 0xFFBEF640, 0, 0xFF2 1FF5C) = 2

lwp_create() (devuelve nuevo lwp...) = 0

kaio(AIOREAD, 3, 0xFFBEF9C0, 1024, 0, 0xFFBEFDC0) = 0

kaio(AIOWAIT , 0x00000000) = 4290706880

Éxito de AIO

Vemos que para el dispositivo sin formato, la llamada IO asíncrona final de Solaris se completa a través de AIOREAD y la operación asincrónica es exitosa.

Para lectura normal de archivos del sistema de archivos:

# truss -t kaio, lwp_create ./aio /a.sh

kaio(5, 0xFFBEF650, 0x00000000, 0xff21fb68, 0x00000000, 0xffbef658, 0x00000000) = 0

LWP_CREATE (0xffbef650, 0, 0xff21ff5c) = 2

lwp_create() (Regresar al nuevo LWP...) = 0 0

kaio(AIOREAD, 3, 0xFFBEF9D0, 1024, 0, 0xFFBEFDD0) Err#48 ENOTSUP

lwp_create(0xFFBEF5F0, 0, 0xFF20DF5C) = 3

lwp_create () (devuelto como nuevo lwp...). ) = 0

lwp_create(0xFFBEF5F0, 0, 0xFF1FBF5C) = 4

lwp_create() (devuelve nuevo lwp...) = 0

lwp_create(0xFFBEF5F0 , 0, 0xFF1E9F5C) = 5

lwp_create() (devuelve nuevo lwp....) = 0

lwp_create(0xFFBEF5F0, 0, 0xFF1D7F5C) = 6

lwp_create() (devuelve un nuevo lwp...) = 0

lwp_create(0xFFBEF5F0, 0, 0xFF1C5F5C) = 7

lwp_create() (devuelve un nuevo lwp.. .. ) = 0

lwp_create(0xFFBEF5F0, 0, 0xFF1B3F5C) = 8

lwp_create() (devuelve nuevo lwp...) = 0

lwp_create(0xFFBEF5F0 , 0, 0xFF1A1F5C) = 9

lwp_create() (devuelve nuevo lwp...) = 0

lwp_create(0xFFBEF5F0, 0, 0xFF18FF5C) = 10

p>

lwp_create() (devuelve un nuevo lwp...) = 0

lwp_create(0xFFBEF5F0, 0, 0xFF17DF5C) = 11

lwp_create() (devuelve un nuevo lwp... ) = 0

kaio(AIOWAIT, 0x00000000) = 1

kaio(AIONOTIFY, -13008896) = 0

AIO exitosa

Notamos que primero recibimos un error Err#48 para el sistema AIOREAD, lo que indica que el sistema de archivos no admitía IO asíncrona.

Finalmente, la operación tiene éxito y, de hecho, el sistema convierte la llamada IO asíncrona en una lectura previa.

En la salida completa del truss, puede ver la siguiente línea:

pread64(3, "7F E L F010201\0\0/0\0". , 1024, 0 ) = 1024

Y la IO asincrónica exitosa se completa leyendo la siguiente línea:

kaio(AIOREAD, 3, 0xFFBEF9C0, 1024, 0, 0xFFBEFDC0) = 0.