Programación del sistema Linux C (11) gestión de subprocesos control de subprocesos

Control de subprocesos: la configuración de los atributos de un subproceso es una operación avanzada. Este atributo afecta el comportamiento del núcleo, por lo que estos atributos generalmente no se modifican, especialmente el tamaño de la pila del núcleo del subproceso.


1 Crear y destruir estructura de atributos

Al usar la función pthread_create para crear un hilo, puede establecer el atributo del hilo a través del segundo parámetro attr, establecer en NULL para usar los atributos predeterminados del sistema para crear el hilo, los atributos del hilo se organizan en una estructura. La estructura es la siguiente:

//线程属性结构
typedef struct
{
   int                detachstate;   //线程的分离状态
   int                schedpolicy;   //线程调度策略
   struct sched_param schedparam;    //线程的调度参数
   int                inheritsched;  //线程的继承性
   int                scope;         //线程的作用域
   size_t             guardsize;     //线程栈末尾的警戒缓冲区大小
   int                stackaddr_set;
   void *             stackaddr;     //线程栈的位置
   size_t             stacksize;     //线程栈的大小
}pthread_attr_t;

Use pthread_attr_init para inicializar la estructura de atributos, use la función pthread_attr_destroy para destruir una estructura de atributos no utilizada. El prototipo de la función es el siguiente:

//pthread_attr_init 函数为属性结构分配内存空间,通过这个参数返回首地址。
int pthread_attr_init (pthread_attr_t *attr);
//pthread_attr_destroy将前者分配的内存空间释放;
int pthread_attr_destroy (pthread_attr_t *attr);
参数attr:一个指向线程属性结构的指针。
函数执行成功返回0,失败返回错误号。

Nota: Los dos deben aparecer juntos, de lo contrario, provocará una pérdida de memoria (uno es la asignación de direcciones y el otro es la liberación de la dirección).


2 atributos de hilo

2.1 Estado de separación de hilos

Estado de separación de subprocesos: determine cómo termina un subproceso. Hay dos estados:

  1. Estado no separado (predeterminado): en este momento, el hilo original espera el final del hilo creado. Solo cuando la función pthread_join () regresa, el hilo creado se termina y los recursos del sistema ocupados por él pueden liberarse.
  2. Estado de separación: otros subprocesos no esperan el subproceso de separación. Cuando finaliza la operación, el subproceso finaliza y los recursos del sistema se liberan inmediatamente.

Use pthread_attr_getdetachstate para obtener el estado separado del hilo, y pthread_attr_setdetachstate para establecer el estado separado del hilo. El prototipo de la función es el siguiente:

int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr,intdetachstate);
参数:
Attr   线程属性变量
Detachstate  线程的分离状态属性,有两个值
    PTHREAD_CREATE_DETACHED,以分离状态启动线程;
    PTHREAD_CREATE_JOINABLE,以非分离状态启动线程;
返回值:若成功返回0,若失败返回-1。

Instrucciones de uso: si sabemos que no necesitamos saber el estado de terminación del hilo al crear el hilo, podemos usar el atributo detachstate thread en la estructura pthread_attr_t para permitir que el hilo comience en un estado separado.

2.2 Configuraciones de pila

Cuando pthread_create crea un hilo, si no especifica el tamaño de la pila asignada, el sistema asignará un valor predeterminado. El método para ver el valor predeterminado es el siguiente:

ulimit -s

Use pthread_attr_getstacksize para obtener el tamaño de la pila del hilo, use pthread_attr_setstacksize para establecer el tamaño de la pila del hilo. El prototipo de la función es el siguiente:

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
参数:
attr            线程属性变量
inheritsched    线程的栈大小,stacksize以字节为单位
返回值:若成功返回0,若失败返回

En términos de alcance profesional personal, esta configuración se encuentra principalmente en el entorno integrado. Debido a que la memoria no es muy grande en el incrustado, el uso del valor predeterminado causará memoria insuficiente, por lo que debe configurar esta pila de antemano antes de crear un subproceso.

2.3 Estrategia de programación

La política de programación de subprocesos se puede establecer a través de la API, use pthread_attr_getschedpolicy para obtener la política de programación, use pthread_attr_setschedpolicy para establecer la política de programación. El prototipo de la función es el siguiente:

int pthread_attr_getschedpolicy(const pthread_attr_t*attr,int *policy);
int pthread_attr_setschedpolicy(pthread_attr_t *attr,intpolicy);
参数:
attr           线程属性变量
policy         调度策略
	SCHED_FIFO(先进先出),支持优先级1-99
	SCHED_RR(轮转法),支持优先级1-99
	SCHED_OTHER(其它),不支持优先级
返回值:
若成功返回0,若失败返回-1。

Descripción detallada de las estrategias SCHED_FIFO y SCHED_RR:

  1. Estrategia SCHED_FIFO: comenzará a ejecutarse pronto, a menos que ya se esté ejecutando o bloqueando un subproceso de mayor prioridad.
  2. Estrategia SCHED_RR (round robin): establecer segmentos de tiempo.

Nota:

  1. Si un hilo de política SCHED_RR se ejecuta durante más de un período fijo (intervalo de tiempo) sin bloqueo, y otro hilo de política SCHED_RR o SCHBD_FIPO de la misma prioridad está listo, el hilo en ejecución se adelantará para preparar el hilo Puede ser ejecutado
  2. Cuando los subprocesos con la política SCHED_FIFO o SCHED_RR retienen o esperan una variable de condición y bloquean el mismo mutex, se despertarán en orden de prioridad. Es decir, si un subproceso SCHED_FIFO de baja prioridad y un subproceso SCHED_FIFO de alta prioridad esperan el mismo bloqueo de mutex, entonces, cuando el mutex está desbloqueado, el subproceso de alta prioridad siempre se desbloqueará primero.

2.4 Parámetros de programación

Los parámetros de programación de subprocesos se pueden establecer a través de la API, use pthread_attr_getschedparam para obtener los parámetros de programación, use pthread_attr_setschedparam para establecer los parámetros de programación. El prototipo de la función es el siguiente:

int pthread_attr_getschedparam(const pthread_attr_t*attr,struct sched_param *param);
int pthread_attr_setschedparam(pthread_attr_t *attr,conststruct sched_param *param);
参数:
attr           线程属性变量
param          sched_param结构
返回值:若成功返回0,若失败返回-1。

Esto implica una estructura sched_param, que se implementa de la siguiente manera:

struct sched_param
{
    int sched_priority; // 该参数的本质就是优先级
};

El miembro secundario sched_priority de la estructura sched_param controla un valor de prioridad (cuanto mayor es el valor, mayor es la prioridad). Los valores de prioridad máxima y mínima admitidos por el sistema se pueden obtener utilizando la función sched_get_priority_max y la función sched_get_priority_min, respectivamente.

Nota especial: si no está escribiendo un programa en tiempo real, no se recomienda modificar la prioridad del hilo. Si la estrategia de programación no se usa correctamente, dará lugar a errores de programa, lo que provocará varios problemas, como un punto muerto. Por ejemplo, en una aplicación multiproceso, establecer diferentes niveles de prioridad para subprocesos puede conducir a la inversión de prioridades debido a los recursos compartidos.

2.5 Herencia

La herencia determina si los parámetros de programación se heredan del proceso creado o si usan la información de programación establecida explícitamente en los atributos schedpolicy y schedparam. Use pthread_attr_getinheritsched para obtener información de herencia, use pthread_attr_setinheritsched para establecer información de herencia. El prototipo de función correspondiente es el siguiente:

int pthread_attr_getinheritsched(const pthread_attr_t*attr,int *inheritsched);
int pthread_attr_setinheritsched(pthread_attr_t *attr,intinheritsched);
参数:
attr            线程属性变量
inheritsched    线程的继承性
    PTHREAD_INHERIT_SCHED表示新现成将继承创建线程的调度策略和参数
    PTHREAD_EXPLICIT_SCHED表示使用在schedpolicy和schedparam属性中显式设置的调度策略和参数
返回值:若成功返回0,若失败返回-1。

Pthreads no especifica un valor predeterminado para herencia, si le preocupa la estrategia de programación y los parámetros del hilo, primero debe establecer este atributo.


Método de consulta de funciones de la serie 3 pthread

Hay muchas funciones en la serie pthread. Si se usa, no podemos usar directamente el comando man en Linux para realizar consultas, sino instalar el manual de la página man de pthread thread. Los comandos de instalación son los siguientes:

sudo apt-get install manpages-posix-dev

Verifique la instalación:

man -k pthread 

Puede enumerar pthreads. Ver la versión actual de la biblioteca pthread:

getconf GNU_LIBPTHREAD_VERSION

Cuando se usa la biblioteca de hilos, la compilación gcc necesita agregar -lpthread (minúscula L)

Publicado 289 artículos originales · elogiados 47 · 30,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/vviccc/article/details/105166567
Recomendado
Clasificación