GPU虚拟化实现(七)

章节回顾

在上一章,分析了项目的主要代码模块功能:共享内存和初始化、GPU 内存管理、GPU 利用率管理以及锁机制,在这一章将继续分析其他的代码模块功能。

进程管理

void init_proc_slot_withlock() {
   
    int32_t current_pid = getpid(); // 获取当前进程的 PID
    lock_shrreg(); // 加锁
    shared_region_t* region = region_info.shared_region; // 获取共享内存区域 shared_region 的指针
    // 检查共享内存中的进程计数 proc_num 是否达到最大限制
    if (region->proc_num >= SHARED_REGION_MAX_PROCESS_NUM) {
   
        exit_withlock(-1); // 退出程序
    }

	// 调用 signal() 函数为 SIGUSR1 和 SIGUSR2 信号注册处理函数
    signal(SIGUSR2,sig_swap_stub);
    signal(SIGUSR1,sig_restore_stub);
    // If, by any means a pid of itself is found in region->proces, then it is probably caused by crashloop
    // we need to reset it.
    int i,found=0;
    // 遍历共享内存中的进程槽位数组 region->procs,检查是否存在当前进程的 PID(current_pid)
    for (i=0; i<region->proc_num; i++) {
   
	    // 如果找到,将该槽位的状态 status 设置为 1(表示活跃),并用 memset() 清空该槽位的两个数组
        if (region->procs[i].pid == current_pid) {
   
            region->procs[i].status = 1;
            memset(region->procs[i].used,0,sizeof(device_memory_t)*CUDA_DEVICE_MAX_COUNT);
            memset(region->procs[i].device_util,0,sizeof(device_util_t)*CUDA_DEVICE_MAX_COUNT);
            found = 1;
            break;
        }
    }
    // 如果未找到自己的 PID(found == 0),在当前进程计数 proc_num 对应的槽位上分配一个新槽位
    if (!found) {
   
        region->procs[region->proc_num].pid = current_pid;
        region->procs[region->proc_num].status = 1;
        memset(region->procs[region->proc_num].used,0,sizeof(device_memory_t)*CUDA_DEVICE_MAX_COUNT);
        memset(region->procs[region->proc_num].device_util,0,sizeof(device_util_t)*CUDA_DEVICE_MAX_COUNT);
        region->proc_num++;
    }

    clear_proc_slot_nolock(current_pid, 1);
    unlock_shrreg();
}
  • 为当前进程在共享内存区域中分配或重用一个进程槽位,初始化该槽位的状态和数据,并设置信号处理函数以支持进程间通信或恢复机制
int rm_quitted_process(){
   
	// 使用 popen() 调用系统命令 ps ax,并以只读模式("r")打开一个文件流 wstream,用于读取命令输出。ps ax 会列出系统中所有运行进程的信息
    FILE *wstream;
    wstream=popen("ps ax","r");
    char tmp[256];
    char *atmp;
    int pidmap[SHARED_REGION_MAX_PROCESS_NUM];
    memset(pidmap,0,sizeof(int)*SHARED_REGION_MAX_PROCESS_NUM);
    ensure_initialized();

    int32_t pid;
    int i = 0,cnt=0,ret=0;
    LOG_INFO("rm_quitted_process");
    lock_shrreg();
    if (wstream!=NULL){
   
        while (fgets(tmp,256,wstream)) {
   
            atmp = strtok(tmp," ");
            pid = atoi(atmp);
            if (pid!=0)
                for (i=0;i<region_info.shared_region->proc_num;i++)
                    if (region_info.shared_region->procs[i].pid==pid){
   
                        pidmap[i]=1;
                    }
        }
        // 遍历共享内存中的进程列表 procs,检查 pidmap[i] 的值
        for (i=0;i<region_info
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想看一次满天星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值