MST

星途 面试题库

面试题:C语言Linux多线程优先级设置与系统资源竞争优化

在一个复杂的Linux C语言多线程应用中,存在多个线程对系统资源(如CPU、内存、I/O等)进行竞争,其中部分线程需要高优先级执行以确保关键任务及时完成。请设计一套完整的方案,利用多线程优先级设置以及相关的资源管理机制(如互斥锁、信号量等),在满足关键线程优先执行的同时,最大程度优化整体系统性能,减少资源竞争带来的性能损耗。要求详细阐述设计思路、涉及到的技术细节,并给出核心代码实现。
44.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 线程优先级设置:利用Linux的SCHED_FIFO或SCHED_RR调度策略来设置关键线程的高优先级。SCHED_FIFO适合于那些需要一直运行直到完成的关键任务,而SCHED_RR则适合需要定期调度的关键任务。非关键线程可以使用较低优先级的调度策略,如SCHED_OTHER。
  2. 资源管理机制
    • 互斥锁(Mutex):用于保护共享资源,确保同一时间只有一个线程可以访问共享资源,防止数据竞争。
    • 信号量(Semaphore):用于控制对有限资源的访问数量。例如,对于I/O设备,可以使用信号量来限制同时访问设备的线程数量。

技术细节

  1. 线程优先级设置
    • 使用pthread_setschedparam函数来设置线程的调度参数,包括调度策略和优先级。
    • 优先级值的范围是0到SCHED_RR_MAXSCHED_FIFO_MAX,数值越大优先级越高。
  2. 互斥锁
    • 使用pthread_mutex_init初始化互斥锁。
    • 在访问共享资源前使用pthread_mutex_lock锁定互斥锁,访问结束后使用pthread_mutex_unlock解锁。
  3. 信号量
    • 使用sem_init初始化信号量,设置初始值(即允许同时访问的线程数量)。
    • 使用sem_wait等待信号量,当信号量值大于0时,将其值减1并继续执行;否则线程阻塞。
    • 使用sem_post释放信号量,将其值加1。

核心代码实现

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <semaphore.h>

// 定义互斥锁
pthread_mutex_t mutex;
// 定义信号量
sem_t sem;

// 共享资源
int shared_resource = 0;

// 关键线程函数
void* critical_thread(void* arg) {
    struct sched_param param;
    // 设置线程调度策略为SCHED_FIFO
    param.sched_priority = sched_get_priority_max(SCHED_FIFO);
    if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &param) == -1) {
        perror("pthread_setschedparam");
        return NULL;
    }

    // 访问共享资源
    pthread_mutex_lock(&mutex);
    sem_wait(&sem);
    shared_resource++;
    printf("Critical thread incremented shared resource: %d\n", shared_resource);
    sem_post(&sem);
    pthread_mutex_unlock(&mutex);

    return NULL;
}

// 非关键线程函数
void* non_critical_thread(void* arg) {
    struct sched_param param;
    // 设置线程调度策略为SCHED_OTHER
    param.sched_priority = sched_get_priority_min(SCHED_OTHER);
    if (pthread_setschedparam(pthread_self(), SCHED_OTHER, &param) == -1) {
        perror("pthread_setschedparam");
        return NULL;
    }

    // 访问共享资源
    pthread_mutex_lock(&mutex);
    sem_wait(&sem);
    shared_resource--;
    printf("Non - critical thread decremented shared resource: %d\n", shared_resource);
    sem_post(&sem);
    pthread_mutex_unlock(&mutex);

    return NULL;
}

int main() {
    pthread_t tid1, tid2;

    // 初始化互斥锁
    if (pthread_mutex_init(&mutex, NULL) != 0) {
        printf("\n mutex init has failed\n");
        return 1;
    }

    // 初始化信号量,允许同时有3个线程访问
    if (sem_init(&sem, 0, 3) != 0) {
        printf("\n semaphore init has failed\n");
        return 1;
    }

    // 创建关键线程
    if (pthread_create(&tid1, NULL, critical_thread, NULL) != 0) {
        printf("\n ERROR creating thread 1");
        return 1;
    }

    // 创建非关键线程
    if (pthread_create(&tid2, NULL, non_critical_thread, NULL) != 0) {
        printf("\n ERROR creating thread 2");
        return 1;
    }

    // 等待线程结束
    if (pthread_join(tid1, NULL) != 0) {
        printf("\n ERROR joining thread");
        return 2;
    }
    if (pthread_join(tid2, NULL) != 0) {
        printf("\n ERROR joining thread");
        return 2;
    }

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);
    // 销毁信号量
    sem_destroy(&sem);

    return 0;
}