IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> libvirt线程模型分析 -> 正文阅读

[Java知识库]libvirt线程模型分析

libvirtd启动之后,会创建一系列线程,本文就是针对libvirtd进程创建的线程进行分析:

libvirtd:是libvirt的daemon进程

rpc-worker:是libvirtd接收客户端发送的命令处理的线程

pri-rpc-worker

qemu-event:

udev-event:

vm-instance-000:线程,这个线程比较奇怪,每启动一个虚拟机,就会多出一个这样的线程,看名字明显是和VM的名字相关,原因是线程设定的名字只能是15个字符,所以会出现名字相同的情况。但是这个线程的作用是什么呢?

qemuDomainObjStartWorker
	|
	|--threadName = vm-instace-000{因为限定15个字符,后面的名字就看不到了}
	|
	|--priv->eventThread = virEventThreadNew(threadName)
		|
		|--evt = VIR_EVENT_THREAD(g_object_new(VIR_TYPE_EVENT_THREAD, NULL)
		|
		|--virEventThreadStart
			|
			|--evt->thread = g_thread_try_new(thname, virEventThreadWorker)
			|	|
			|	|--virEventThreadWorker{这个是新的线程,运行glib事件循环}
			|		|
			|		|--running = g_idle_source_new(){创建空闲的事件}
			|		|
			|		|--g_source_set_callback(running, virEventThreadNotify, data, NULL)
			|		|	|
			|		|	|--virEventThreadNotify
			|		|		|
			|		|		|--data->running = TRUE
			|		|		|
			|		|		|--g_cond_signal(&data->cond){这里让主线程继续向下运行}
			|		|
			|		|--g_source_attach(running, data->context)
			|		|
			|		|--g_main_loop_run(data->loop){循环阻塞}
			|		|
			|		|--virEventThreadDataFree(data){释放资源}
			|
			|--while (!data->running)->g_cond_wait(&data->cond, &data->lock){这里会阻塞等待glib事件线程创建成功}
走到这里就创建一个GMainLoop循环的线程,里面有一个idle事件,会将这个idle事件添加到context中

上面创建的source没有关联任何fd,只是创建一个线程来运行事件循环机制;后面的其他source可以关联到这个context上,运行相应的事件响应回调函数。

qemuMonitor监控:

qemuConnectMonitor
	|
	|--qemuMonitorOpen(vm, priv->monConfig, retry, timeout, virEventThreadGetContext(priv->eventThread), &monitorCallbacks, driver)
		|
		|--fd = qemuMonitorOpenUnix(config->data.nix.path, vm->pid, retry, timeout){监听的fd}
		|
		|--qemuMonitorOpenInternal(vm, fd, context, cb, opaque)
			|
			|--mon->fd = fd
			|--mon->context = g_main_context_ref(context)
			|--mon->cb = cb{设置的回调函数}
			|--mon->callbackOpaque = opaque{回调函数的参数}
			|--mon->socket = g_socket_new_from_fd(fd, &gerr){得到监听的socket}
			|--qemuMonitorRegister(mon)
				|
				|--g_socket_create_source(mon->socket, cond, NULL){创建监控的事件,cond=G_IO_IN | G_IO_OUT}
				|
				|--g_source_set_callback(mon->watch,(GSourceFunc)qemuMonitorIO,mon)
				|
				|--g_source_attach(mon->watch, mon->context)

QMP Monitor:

qemuProcessQMPConnectMonitor
	|
	|--qemuMonitorOpen{流程同上}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-14 23:36:51  更:2022-04-14 23:39:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:19:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码