Programación de memoria transaccional de AIX

La memoria transaccional (TM) es una construcción de sincronización de memoria compartida que permite a las hebras de proceso realizar operaciones de almacenamiento que parecen ser atómicas para otras hebras de proceso o aplicaciones.

Visión general

TM es una construcción que permite la ejecución de secciones críticas basadas en bloqueo del código sin adquirir un bloqueo. El procesador IBM® POWER 8 es el primer procesador que implementa la programación de TM.

Utilice el recurso TM en algunos de los escenarios siguientes:
  • Ejecución optimista de aplicaciones basadas en bloqueo-TM soporta la ejecución especulativa de secciones críticas de código sin adquirir un bloqueo. Este método proporciona las ventajas de un bloqueo preciso para las aplicaciones utilizando los bloqueos actuales que no están ajustados para el rendimiento.
  • Programación transaccional en lenguajes de alto nivel-El modelo de programación transaccional es un estándar creciente en toda la industria que ofrece ganancias de productividad en relación con los programas de memoria compartida basados en bloqueo.
  • Uso de punto de comprobación/retrotracción-TM se utiliza como punto de comprobación para restaurar el estado arquitectónico. Este método permite optimizaciones de compilador especulativas durante la optimización de código de tiempo de ejecución o la generación y simulación de puntos de comprobación.

Para utilizar el recurso TM, una hebra de proceso marca el principio y el final de la secuencia de accesos de almacenamiento o transacción con las instrucciones tbegin. y tend. . La instrucción tbegin. inicia la ejecución transaccional, durante la cual las cargas y las tiendas parecen producirse de forma atómica. La instrucción tend. finaliza la ejecución transaccional.

Si una transacción se detiene de forma prematura, las actualizaciones de almacenamiento que se han realizado después de ejecutar la instrucción tbegin. se retrotraen. De forma correspondiente, el contenido de un subconjunto de los registros también se retrotrae al estado anterior a la ejecución de la instrucción tbegin. . Cuando una transacción se detiene de forma prematura, se inicia un manejador de errores de software. La anomalía puede ser del tipo transitorio o del tipo persistente. El manejador de anomalías puede reintentar la transacción o elegir utilizar una construcción de bloqueo o vía de acceso lógica diferente que dependa de la naturaleza de la anomalía.

El sistema operativo AIX® admite el uso de TM, incluido el manejo de la gestión de estado de TM entre conmutadores de contexto e interrupciones.

Estado de punto de comprobación

Cuando se inicia una transacción, se guarda un conjunto de registros que representan el estado de punto de comprobación del procesador. En caso de una anomalía de transacción, se restaura un conjunto de registros en el punto anterior al inicio de la transacción. El estado de punto de comprobación del procesador también se llama estado pretransaccional. El estado de punto de comprobación incluye los registros grabables de estado de problema excepto los registros CR0, FXCC, EBBHR, EBBRR, BESCR , los registros del supervisor de rendimiento y los SPR de TM.

Nota: No se puede acceder directamente al estado de punto de comprobación a través del estado del supervisor o del estado del problema.
El estado de punto de comprobación se copia en los registros respectivos después de que se ejecute la nueva instrucción treclaim. . Este proceso permite que el código privilegiado guarde o modifique los valores. El estado de punto de comprobación se copia de nuevo en los registros especulativos de los registros accesibles por el usuario respectivos después de la ejecución de la nueva instrucción trechkpt. .
Los siguientes TM SPR se añaden al estado de la máquina para el procesador:
Nombre Título Descripción Mtspr con privilegios Mfspr con privilegios Tamaño (bits) SPR
FSCR Registro de estado y control de instalaciones Controla los recursos disponibles en estado de problema e indica la causa de una interrupción de recurso no disponible. 64 153
TEXASR Excepción de transacción y registro de resumen Contiene el nivel de transacción y la información de resumen que utilizan los manejadores de anomalías de transacción. Los 0:31 bits contienen la causa de la anomalía. No No 64 130
TFHAR Registro de dirección de manejador de errores de transacción Registra el EA del manejador de errores de software. El registro TFHAR siempre se establece en el NIA para la instrucción tbegin. que ha iniciado la transacción. No No 64 128
TFIAR Registro de dirección de instrucción de anomalía de transacción Establézcalo en el EA exacto de la instrucción que causa la anomalía, cuando sea posible. La exactitud del registro TFIAR se registra en el campo Exacto (bit 37) del registro TEXASR. No No 64 129
TEXASRU Excepción de transacción y registro de resumen (mitad superior) Media de orden alto del registro TEXASR. No No 32 131
El nuevo registro TEXASR contiene información relacionada con el estado de una transacción y la causa de una anomalía de transacción. La tabla siguiente describe los campos incluidos en el registro TEXASR:
Campo Valor-Significado Bits
Código de anomalía (Nota: el bit 7 se conoce como campo Anomalía persistente) Códigos de anomalía de transacción 0:7
No permitido 0b1 -La instrucción de tipo de acceso no está permitida 8
Anidamiento de desbordamiento 0b1 -Se ha superado el nivel máximo de transacción. 9
Desbordamiento de ocupación 0b1 -Se ha superado el límite de seguimiento para los accesos de almacenamiento transaccional. 10
Conflicto autoinducido 0b1 -Se ha producido un conflicto autoinducido en estado suspendido. 5
Conflicto no transaccional 0b1 -Se ha producido un conflicto con un acceso no transaccional por parte de otro procesador. 6
Conflicto de transacción 0b1 -Se ha producido un conflicto con otra transacción. 13
Conflicto de invalidación de conversión 0b1 -Se ha producido un conflicto con una invalidación de TLB. 14
Aplicación específica 0b1 -Una condición específica de la implementación ha hecho que la transacción fallara. 15
Conflicto de captación de la instrucción 0b1 -Una captación de instrucción por parte de la hebra u otra hebra que se ha realizado desde un bloque que se ha grabado anteriormente de forma transaccional. 16
Reservado para casos de anomalía futuros   17:30
Terminar anormalmente 0b1 -Se ha producido una terminación anormal debido a la ejecución de una determinada instrucción TM. 31
Suspendido 0b1 -La anomalía se ha registrado en estado Suspendido. 32
Reservado   33
Privilegio La hebra estaba en estado de privilegio ([MSRHV||PR]) en el momento del registro de anomalías. 34:35
Resumen de anomalías (FS) 0b1 -Se ha detectado y registrado una anomalía. 36
TFIAR Exacto

0b0 -El valor del campo TFIAR es un valor aproximado.

0b1 -El valor del campo TFIAR es un valor exacto.

284
ROT

Establézcalo en 0b0 cuando se ejecute una instrucción tbegin. que no sea ROT.

Establézcalo en 0b1 cuando se inicie una ROT.

38
Reservado   39:51
Nivel de transacción (TL) El nivel de transacción (profundidad de anidamiento + 1) para la transacción activa tiene los valores siguientes:
  • 0 si la transacción más reciente se ha completado correctamente.
  • El nivel de transacción en el que ha fallado la transacción más reciente, si la transacción no se ha completado correctamente.
Nota: Un valor de 1 corresponde a una transacción externa. Un valor mayor que 1 corresponde a una transacción anidada.
52:63
Notas:
  • Exactamente 1 bit de los 8-31 bits del registro TEXASR se establece cuando se registra la anomalía de transacción. El bit único que se establece indica que la instrucción o el suceso determinado han causado la anomalía.
  • Una transacción de sólo retrotracción (ROT) es una secuencia de instrucciones que se ejecuta como una unidad o las instrucciones no se ejecutan. Esta construcción permite la ejecución especulativa de una gran parte de las instrucciones con un coste mínimo. Una ROT no tiene la naturaleza atómica completa como transacción normal o sus propiedades de sincronización y serialización. Por lo tanto, las ROT no se deben utilizar para manipular datos compartidos.

Manejador de errores de software

Cuando una transacción falla, el hardware de la máquina redirige el control al manejador de anomalías que está asociado con la transacción más externa. Cuando una transacción falla, el control se redirige a la instrucción que sigue a la instrucción tbegin. , CR0 se establece en
0b101 || 0
o
0b010 || 0
Por lo tanto, la instrucción después de la instrucción tbegin. debe ser una instrucción de bifurcación predicada en el bit 2 de CR0. Por ejemplo, después de ejecutar la instrucción tbegin. , la instrucción de ramificación beq predicada en el bit 2 de CR0. El destino de la ramificación debe ser una sección de código que maneje las anomalías de transacción. Cuando la instrucción tbegin. se ejecuta correctamente al inicio de la transacción, CR0 se establece en
0b000 || 0 or 0b010 || 0
Nota: Los bits 0:31 de TEXASR notifican la causa de la anomalía. El campo de código de anomalía (FC) en bits 0-7, se utiliza para los escenarios siguientes:
  • El supervisor privilegiado o el código de hipervisor provoca la anomalía utilizando la instrucción treclaim. .
  • El código de estado de problema provoca la anomalía utilizando un formato de la instrucción tabort. .
Un valor de l en el bit 7 de TEXASR indica que la anomalía es persistente y que la transacción está vinculada a la anomalía cuando se intenta de nuevo la transacción. Los códigos de anomalía reservados por el sistema operativo AIX indican la causa de la anomalía definida en el directorio /usr/include/sys/machine.h. .

Una transacción de ejemplo

El siguiente ejemplo de código de ensamblador muestra una transacción simple que escribe el valor de GPR 5 en la dirección de GPR 4, que se supone que se comparte entre varias hebras de ejecución. Si la transacción falla debido a una causa persistente, el código vuelve a otra vía de acceso de código en la etiqueta lock_based_update . El código para la vía de acceso alternativa no se muestra.
trans_entry:
  tbegin                             # Start transaction
  beq          failure_hdlr          # Handle transaction failure
  stw          r5, 0(r4)             # Write to memory pointed to by r4.
  tend.                              # End transaction
  b            trans_exit
failure_hdlr:                        # Handle transaction failures:
  mfspr        r4, TEXASRU           # Read high-order half of TEXASR
  andis.       r5, r4, 0x0100        # Is the failure persistent?
  bne          lock_based_update     # If persistent, acquire lock and 
                                     # then perform the write.
  b            trans_entry           # If transient, try again.

lock_based_update:

trans_exit:

Determinación en tiempo de ejecución de la prestación Memoria transaccional

Un programa puede determinar si un sistema soporta la categoría TM de POWER ISA leyendo la variable del sistema SC_TM_VER utilizando la subrutina getsystemcfg . Se proporciona una macro __power_tm() en el archivo /usr/include/sys/systemcfg.h para determinar la capacidad TM dentro de un programa. Esta macro es útil para software que utiliza condicionalmente la capacidad TM cuando está presente, o utiliza el equivalente funcional a vías de acceso de código basadas en bloqueo cuando la capacidad TM no está presente.

Estructura de contexto ampliada

Las versiones anteriores del sistema operativo AIX presentaban soporte para estructuras de contexto ampliadas para dar soporte al estado de vector y a las claves de usuario. El soporte de estructura de contexto ampliado existente se amplía adicionalmente para dar soporte al estado de máquina que requiere TM.

Un contexto ampliado se asigna y se establece para cada hebra de proceso transaccional cuando utiliza por primera vez TM. Si el área de contexto ampliada no se puede asignar y anclar, el proceso recibe una señal SIGSEGV que da como resultado la terminación del proceso.

La información de contexto de máquina se incluye en la estructura sigcontext que se proporciona a los manejadores de señales. Cuando se devuelve un manejador de señales, se activa el contexto de máquina presente en la estructura sigcontext . La estructura sigcontext es en realidad un subconjunto de la estructura ucontext más grande. Las dos estructuras son idénticas hasta sizeof(struct sigcontext). Cuando el sistema operativo AIX crea un contexto de señal que se debe pasar a un manejador de señales, se crea una estructura ucontext en la pila del manejador de señales. La porción de contexto de máquina de un contexto de señal debe contener todo el estado activo de la máquina, incluyendo el estado volátil y no volátil para el contexto interrumpido involuntariamente. La estructura ucontext contiene un indicador para determinar si la información de contexto ampliada está disponible.

El campo __extctx de la estructura ucontext es la dirección de una estructura de contexto ampliada definida en el archivo /usr/include/sys/context.h . El campo __extctx_magic de la estructura ucontext indica si la información de contexto ampliada es válida cuando el valor del campo __extctx_magic es igual a __EXTCTX_MAGIC. El estado de máquina adicional para una hebra que utiliza la prestación TM se restaura y se guarda como miembro de la extensión de contexto, en la estructura ucontext como parte de la entrega y devolución de señal.

Si una aplicación opta por habilitar explícitamente el uso de la memoria transaccional, toma una estructura ucontext de tamaño ampliado que ya tiene espacio para el campo __extctx que incluye la definición implícita de __EXTABI__ por parte del compilador. La estructura ampliada de ucontext también se puede seleccionar mediante una definición explícita de __AIXEXTABI.

Las subrutinas getcontext(), setcontext(), makecontext()y swapcontext() de libc no están soportadas mientras estén en estado transaccional o suspendido. Cuando se llama a las subrutinas dentro de la transacción, las subrutinas getcontext(), setcontext(), makecontext() dan como resultado una anomalía de transacción persistente del tipo TM_LIBC , que se define en el archivo /usr/include/sys/machine.h .

Cuando se llama a una subrutina swapcontext() dentro de una transacción, se produce el comportamiento siguiente:
  • Cuando una subrutina swapcontext() está en estado transaccional, da como resultado una anomalía de transacción persistente de tipo TM_LIBC .
  • Cuando una subrutina swapcontext() está en estado suspendido, da como resultado que la transacción esté condenada, la estructura ucontext especificada se intercambia y la ejecución del programa se reanuda mediante la estructura ucontext especificada. El estado resultante y el comportamiento posterior después de las devoluciones de la subrutina swapcontext() no están definidos.

Si las subrutinas getcontext(), setcontext()y swapcontext() se invocan en un estado no transaccional, las subrutinas no recuperan ni restauran ningún contexto de TM ampliado en o desde la estructura ucontext a la que apuntan los parámetros ucp o oucp . No se indica ningún error cuando se llama a las subrutinas setcontext() o swapcontext() con el contexto de TM ampliado presente.

Consulte el archivo de cabecera /usr/include/sys/context.h para obtener información detallada del contexto ampliado.

Entrega de señal

Las señales asíncronas que recibe una aplicación mientras está en una transacción se entregan de forma no transaccional. Cuando está en estado transaccional, no se permite la entrega de señales síncronas y, en su lugar, se produce una anomalía de transacción persistente del tipo TM_SYNC_SIGNAL , tal como se define en el archivo /usr/include/sys/machine.h .

Interrupciones de alineación e interrupciones de programa

En estado transaccional, las interrupciones de alineación y las interrupciones de programa se deben a una operación no permitida o a una operación que requiere emulación, lo que da como resultado una anomalía de transacción persistente de tipo TM_ALIGN_INT o tipo TM_INV_OP , tal como se define en el archivo /usr/include/sys/machine.h . Cuando está en estado suspendido, la alineación y las interrupciones de programa se procesan normalmente utilizando la semántica no especulativa.

Llamadas al sistema

Se sugiere que las llamadas al sistema no se invoquen dentro de una transacción. Las llamadas al sistema sólo están soportadas dentro de una transacción cuando la transacción se suspende mediante la instrucción tsuspend. .

Cuando se invoca una llamada al sistema mientras un procesador o hebra es transaccional y la transacción no se suspende, el kernel de AIX no invoca la llamada al sistema y la transacción asociada falla de forma persistente. Cuando se produce este error, el campo FC del registro TEXASR contiene el código de anomalía TM_ILL_SC , que se define en el archivo /usr/sys/include/machine.h .

Se presupone que las operaciones realizadas bajo una transacción suspendida cuando el programador de aplicaciones ha suspendido explícitamente la transacción están pensadas para que sean persistentes. Las operaciones realizadas por una llamada del sistema que se invoca mientras está en estado suspendido no se retrotraen aunque la transacción falle.

El sistema operativo AIX no da soporte a las llamadas al sistema que se deben realizar mientras esté en estado transaccional, porque no hay forma de retrotraer ninguna operación, incluida la E/S, realizada por AIX debajo de una llamada al sistema.

Subrutinas setjmp () y longjmp ()

Las subrutinas setjmp() y longjmp() de libc no están soportadas en estado transaccional o suspendido debido a los efectos de establecer un almacenamiento intermedio de salto y saltar de nuevo al almacenamiento intermedio. Considere los siguientes escenarios
  1. Si se llama a la subrutina setjmp() dentro de una transacción y se llama a la subrutina longjmp() correspondiente después de que finalice la transacción, el salto es a un estado especulativo que ahora no es válido.
  2. Si se llama a la subrutina setjmp() antes de la transacción, una subrutina longjmp() correspondiente pasa al estado anterior al inicio de la transacción, independientemente de si la transacción ha finalizado, ha fallado o ha terminado anormalmente.
  3. Si se llama a la subrutina setjmp() dentro de una transacción y, a continuación, la transacción termina anormalmente, las actualizaciones realizadas en el almacenamiento intermedio de salto por la subrutina setjmp() no parecerán haberse producido.

Cuando se llama a la subrutina setjmp() dentro de una transacción, se produce un error de transacción persistente de tipo TM_LIBC o de tipo TM_ILL_SC definido en el archivo /usr/include/sys/machine.h .

Cuando se llama a una subrutina longjmp() dentro de una transacción, se produce el comportamiento siguiente:
  • Cuando una subrutina longjmp() está en un estado transaccional, da como resultado una anomalía de transacción persistente de tipo TM_LIBC o tipo TM_ILL_SC que se define en el archivo /usr/include/sys/machine.h .
  • Cuando una subrutina longjmp() está en un estado suspendido, da como resultado que la transacción se condene al final, se restaure el almacenamiento intermedio de salto especificado y la ejecución del programa vuelva a la subrutina setjmp() correspondiente. El estado resultante y el comportamiento posterior no están definidos después de que la subrutina setjmp() devuelva la subrutina longjmp() .

Compiladores

Un compilador del sistema operativo AIX que dé soporte a la memoria transaccional debe ajustarse a AIX ABI. Cuando el TM está habilitado, un compilador C o C++ debe predefinir __EXTABI__. Consulte la documentación del compilador para obtener información detallada.

ensamblador

El ensamblador del sistema operativo AIX , en /usr/ccs/bin/as , da soporte al conjunto de instrucciones adicional definido para el TM en POWER ISA y tal como lo implementa el procesador POWER8 . Puede utilizar la modalidad de ensamblaje –m pwr8 o la pseudooperación .machine pwr8 dentro del archivo de origen para habilitar el ensamblaje de instrucciones TM. Para obtener más información, consulte la referencia del lenguaje de ensamblaje.

Depurador

El depurador de /usr/ccs/bin/dbx da soporte a la depuración a nivel de máquina de programas TM. Este soporte incluye la posibilidad de desensamblar las nuevas instrucciones de memoria transaccional y de ver los registros TM SPRs: TEXASR, TEXASRU, TFIARy TFHAR .

Si se establece un punto de interrupción dentro de una transacción, la transacción falla incondicionalmente siempre que se encuentra el punto de interrupción. Por lo tanto, el enfoque sugerido es depurar una transacción que no puede establecer un punto de interrupción en el manejador de anomalías de la transacción y, a continuación, ver los registros TEXASR y TFIAR cuando se encuentra el punto de interrupción para determinar la causa y la ubicación de la anomalía.

En dbx, los registros TEXASR, TFIARy TFHAR se pueden visualizar utilizando el submandato print con el parámetro $texasr, $tfiaro $tfhar . La línea de código que está asociada con la dirección que se encuentra en el TFIAR, y los registros de TFHAR se pueden ver a través del submandato list, por ejemplo:
(dbx) list at $tfiar
El submandato dbx tm_status se utiliza para ver e interpretar el contenido del registro TEXASR . Este submandato se utiliza para determinar la naturaleza de una anomalía de transacción.

La habilitación para depuradores de terceros se proporciona en forma de una nueva operación PTT_READ_TM ptrace para leer el estado TM de una hebra. Consulte la documentación de ptrace para obtener más detalles.

Soporte de rastreo

El recurso de rastreo de AIX se expande para incluir un conjunto de sucesos de rastreo para las operaciones de TM realizadas por el sistema operativo AIX , incluida la preferencia que provoca la anomalía de transacción y otras diversas operaciones que pueden provocar la anomalía de transacción. El identificador de suceso de rastreo 675 se puede utilizar como entrada para los mandatos trace y trcrpt para ver los sucesos de rastreo relacionados con TM.

Archivos de núcleo

El sistema operativo AIX también admite la inclusión del estado de la máquina TM como parte del archivo principal para procesos o hebras que utilizan TM. Si un proceso o hebra está utilizando o utiliza TM, el estado de la máquina TM se incluye en la imagen de núcleo para ese hilo.
Nota: El estado de TM sólo se admite en los formatos de archivo principales actuales para el sistema operativo AIX . Puede utilizar el mandato dbx para leer y ver el estado de la máquina TM de un archivo principal habilitado para TM.

Biblioteca de hebras de AIX

El uso de la memoria transaccional no está soportado para las aplicaciones que utilizan hebras M: N. El comportamiento no definido puede producirse en hebras transaccionales en un entorno en el que más de una hebra comparte una sola hebra de kernel. El uso de memoria transaccional por parte de una aplicación que utiliza hebras M: N puede dar lugar a un error de transacción persistente con el código de anomalía TM_PTH_PREEMPTED establecido en el registro TEXASR .