当前位置: 首页 > ai >正文

GPU虚拟化实现(七)

GPU虚拟化实现(七)

  • 章节回顾
  • 进程管理
  • 资源限制和环境变量
  • 利用率监控线程
  • 信号处理
  • 退出处理
  • 代码具体运作流程
  • 怎么限制SM的
  • 总结

章节回顾

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

进程管理

void init_proc_slot_withlock() {int32_t current_pid = getpid(); // 获取当前进程的 PIDlock_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
http://www.xdnf.cn/news/3344.html

相关文章:

  • MySQL基础关键_003_DQL(二)
  • 动态规划简单题
  • 【验证技能】验证质量活动及其执行注意事项
  • 权限提升—Linux提权内核溢出漏洞辅助项目
  • 【QNX+Android虚拟化方案】138 - USB 底层传输原理
  • 实验五 完整性
  • 初学者如何学习AI问答应用开发范式
  • PostgreSQL数据类型
  • 使用Python和Pandas实现的Amazon Redshift权限检查与SQL生成用于IT审计
  • 【DeepMLF】具有可学习标记的多模态语言模型,用于情感分析中的深度融合
  • EBO的使用
  • 基于python的人工智能应用简述
  • Spring 提供了多种依赖注入的方式
  • C#泛型集合深度解析(九):掌握System.Collections.Generic的核心精髓
  • 电池预测 | 第27讲 基于CNN卷积神经网络的锂电池剩余寿命预测
  • x86架构详解:定义、应用及特点
  • C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 18)
  • 人工智能对未来工作的影响
  • 治理和管理的区别
  • Linux内核notify通知笔录
  • 软件测评中心如何保障软件质量与性能?评测范围和标准有哪些?
  • Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)
  • Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10
  • 2025五一杯数学建模A题:支路车流量推测问题,思路分析+模型代码
  • 拉宾公钥密码算法实现
  • 面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解
  • IDEA在项目中添加模块出现Error adding module to project: null(向项目添加模块时出错: null)的解决方法
  • 位运算切换大小写
  • 数字智慧方案6158丨智慧医疗解决方案精华版(58页PPT)(文末有下载方式)
  • Spark,集群搭建之Yarn模式