【G-thinker】G-thinker部分源码解析

article/2025/8/21 5:49:53

一、main

  1. 子图匹配程序run.cpp中主要使用到worker.h和comper.h分别对应线程和进程单位,接下来我们从main函数入手解析源码
    在这里插入图片描述
    从主函数可以看到,子图匹配程序中GMatchWorker继承了worker,主函数声明了workerparams并且传入了路径和线程参数,设置了继承了Trimmer作为节点过滤的GMatchTrimmer和继承了作为结果汇总的Aggregator的GMatchAgg,然后运行worker中的run函数,可以看出work类似进程,在此处开启了worker进程。

二、worker

  1. 进入Worker.h中,查看worker的构造函数,我们传入了线程数,每个线程对应一个comper,req_counter中记录本worker到其他的worker的请求数量,同时声明一个新的CTable作为vertex的缓存,利用idle_set记录当前worker中线程comper是够空闲,初始化为不空闲。
    在这里插入图片描述

  2. 接下来我们看worker中的run函数,开始如果为master worker需要对用户传入的输入路径进行一次检查。
    在这里插入图片描述

  3. 接下来进行文件的读取,其中arrangement为记录分配到各节点进行读取的二维vector,每个vector对应一个worker,记录其该进行读取的文件,利用作者提供的put程序上传时可以将整个大文件进行分片,然后通过这里进行分配。master worker需要通过调用dispatchRan函数进行文件的分配。
    在这里插入图片描述

  4. dispatchRan函数首先对路径文件夹进行遍历,同时对得到的文件名和大小进行存储,接下来根据文件大小对文件进行升序排列,然后进行文件分配,分配原则为最大空闲空间有限策略,及对读取文件大小总量最小的worker有限分配,函数返回assignment指针。
    在这里插入图片描述

  5. 返回之后的到assignment指针,得到分配策略,接下来调用masterscatter函数将得到的分配策略通过mpi通信将结果发送至其余slave节点
    在这里插入图片描述
    masterscatter函数主要利用ibinstream输入流将结果通过MPI通信接口发送至其他节点。

  6. 完成通信之后,master从arrangement中取出自己需要读取文件部分,调用load_graph函数对部分文件进行图加载。
    在这里插入图片描述
    在这里插入图片描述
    load_graph函数中首先生成调用在run.cpp中重写的toVertex函数对读入的文件进行vertex转化,得到相应的vertex集合,接下来调用之前run.cpp重写的顶点剪枝器Trimmer对不满足条件的节点进行剪枝,留下满足条件的vertex集合。

  7. 接下来进行同步图的操作
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    sync_graph函数对本地读取起来的vertex集合进行hash分配,其中hash策略在vertex.h中进行了重写,将节点分配到了所有work中,其中调用了比较重要的all_to_all函数进行worker之间的通信,刚白分配都是所有worker将自己读到的节点进行了分配,这时候需要将所有分配到其他worker的vertex传送到其他节点,同时需要接收其他节点的传送过来的vertex。

  8. vertex分配到各个worker之后则设置vertex位置初始化为0,同时将得到的vertexes结果设置为local_table
    在这里插入图片描述

  9. 更新本地表后进行下一步,启动reqserver,作为请求服务器,接收其他worker对它的请求,接收到请求后从localtable得到vertex并返回给请求worker;然后开启计算线程,具体下一步说明;接着开启响应服务器,当从其他worker接收到vertex消息时,进行处理,并加到cachetable中并更新对应的task
    在这里插入图片描述

三、Comper

  1. 从worker中调用了create_compers函数,comper类似线程的作用,一个进程对应多个线程,一个worker对应多个comper。
    在这里插入图片描述
    首先根据设定的线程数初始化comper数组,生成对应的taskmap数组,每个comper对应一个taskmap,然后设置为全局变量,同时global_tasknum_vec记录每个线程中的任务数量,并开启相应comper。start函数中开启了调用了run函数线程。
    在这里插入图片描述

  2. 在run函数中主要实现了任务的执行过程,要满足cache容量充足和task数量不超过设置的task阈值的条件下进行task的执行
    在这里插入图片描述

  3. 在pop_task中,当任务小于batch_num,需要进行任务的读取,task的读取中主要遵循以下三个优先级,首先调用file2queue函数从本地文件中读取任务到q_task中,该文件记录了超出任务最大数量之外的任务;如果本地磁盘不存在时则需要调用push_task_from_taskmap函数从taskmap中获取任务并且获取到task_buf为空,如果taskmap中为空,则需要调用locTable2queue将本地图中生成种子任务加到q_task中。当q_task为空时,无论是哪种情况,都会读任务到q_task中,然后通过读取q_task执行。
    在这里插入图片描述
    在这里插入图片描述
    从本地获取任务时会通过global_vertex_pos类似访问指针的作用进行获取,每个task可以通过线程锁保证同步,每次对本地vertex进行以TASK_BATCH_NUM数量的访问,如果满足条件则生成相应的种子任务
    在这里插入图片描述
    push_task_from_taskmap函数中主要是从task_buf获取task,调用我们之前重写的compute函数,每次调用只会执行一次,对没有执行完的任务会加入q_task,执行完的task则进行删除,在run中重写的compute分为两步,在这里会在第一次执行完之后加入q_task中继续执行。

  4. 任务添加到q_task,当任务添加到队列时,判读是否达到3 * TASK_BATCH_NUM,如果达到则将2* TASK_BATCH_NUM到3 * TASK_BATCH_NUM的vertex输出到本地。
    在这里插入图片描述

  5. q_task中,task执行过程中需要进行vertex的拉取时,通过调用pull_all函数进行节点的拉取操作,拉取完之后task会加入到taskmap中的taskbuf通过compute函数继续进行计算,任务完成之后则删除相应的任务,这样循环执行完之后确定task队列中没有未完成的task时则完成任务。
    在这里插入图片描述
    在这里插入图片描述
    当要拉取的点则先从本地进行检查,如果在远处即其他worker中则需要调用相应的函数获取远处的节点,主要通过之前实现的ReqServer和RespServer机制进行vertex的拉取。
    在这里插入图片描述
    拉取完之后则将task加入到taskmap的task_buf中,然后再通过push_task_from_taskmap进行task的执行。

  6. 所有task完成之后再次对taskmap进行检查,确定没有task之后则将该comper设为空闲。
    在这里插入图片描述

四、 Worker续

  1. 查看程序,在steal_planning函数中实现了worker之间task的负载均衡,将繁忙worker中的task转移到task较少的worker中。
    在这里插入图片描述
    对于slave worker主要负责收master的消息,确定分配策略;master负责任务分配,分配原理主要是使用优先队列实现最大堆和最小堆,将worker根据task数量加到堆中。
    在这里插入图片描述
    分配策略为取出最大堆最多task中取出TASK_BATCH_NUM数量的vertex转移到最小堆的最小task中,然后将计划存到plans中,并将这些计划保存和发送到其他slave中。

  2. 分配计划完成之后则需要执行分配计划,接收task主要将收到的task输出到磁盘文件中,后面的task读取可以获取。发送task首先确定数量是否依然很大,然后先从磁盘生成种子task,生成不了再从磁盘文件中读取,如果都读不到则发送空消息。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 当最后任务全部完成时,则需要通过master同步消息将全部空闲进行发送,然后slave和master一同关闭。
    在这里插入图片描述


http://chatgpt.dhexx.cn/article/TRjhVmUN.shtml

相关文章

python用thinker库制作一个进制转换器(可打包exe)

进制类型分为: 二进制 字母B表示 八进制 字母O表示 十进制 字母D表示 十六机制 字母H表示 进制转换之间很麻烦,还得计算,如果可以做一个进制转换器多nice,其实也不难,就利用一个tkinter库就能制作,废话不多…

Thinker Board 2开发板上使用奥比中光 astra 深度相机

Thinker Board 2 国产开发板 arm架构 上使用奥比中光 astra 深度相机 准备工作 1、下载astraSDK 选择linux_arm 下载 https://developer.orbbec.com.cn/download.html?id53 2、下载openNI https://dl.orbbec3d.com/dist/openni2/OpenNI_2.3.0.66.zip 开始安装 1、安装fre…

think

我167,97斤,胸d,腰很细,反手轻松摸肚脐那种,骨架小,总结就是身高刚好人瘦胸大屁股大腿细腰细肤白。走路腰杆能挺到天上,气质挺好。漂亮女生太多了,想取胜只能从气质下手了。脸呢&…

Python基于thinker实现的简单的俄罗斯方块小游戏源代码:一、搭建界面

文章目录 一、搭建界面搭建基础窗体第一步:创建画板大小第二步:在画板上作画 绘制俄罗斯方块第一步:绘制o形俄罗斯方块第二步:绘制其他形状方块 记录俄罗斯方块小游戏的游戏思路和过程 一、搭建界面 **目标:**搭建基础…

thinker board s debian系统安装配置

thinker board s debian系统安装配置 好多年前买了一块thinker board s,装安卓系统来用,结果经常性卡死不知道为啥,可能是供电问题,也可能是系统bug,之后就吃灰不怎么用了,最近想装一个计算服务器&#xff…

python利用thinker制作多页面切换的桌面应用实例教程

本篇文章主要讲解,python利用thinker制作多页面的桌面实例教程。可以在一个主界面中相互进行切换和设置相关的表单信息,布局等方法 代码片段的实际效果 视频演示: python使用thinker制作多窗口代码片段实例效果 gif动态图: 构建…

模型思维-THE MODEL THINKER

序言这本书是怎样写成的 Part1为什么需要模型思维 01做一个多模型思考者 使用模型来思考能够带给你的,远远不仅仅是工作绩效的提高。它还会使你成为一个更优秀的人,让你拥有更强的思考能力。你将更擅长评估层出不穷的经济事件和政治事件,更能…

展示一下用thinker做小软件的UI

有一个大坑给大家分享一下。ttk.Treeview可以改变列宽,却不能改变某一行的行高(可以改变整体的行高),其实就是Treeview没有自动换行功能,很痛苦,很折磨,......我一度放弃thinker,因为…

Python Thinker GUI的组件的简单总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Label二、Button三、Entry四、Text五、CheckButton六、RadioButton七、Menu八、Canvas九、Scale 前言 例如:随之前学过Java的基础,…

Thinker 使用详解

文章目录 Tinker基本介绍它主要包含以下几部分:为什么使用 Tinker Tinker 执行原理及流程简单的使用 Tinker1,在项目的gradle.properties 中添加2,在项目的 gradle中添加:3,在 app 中的 gradle 中添加:4,接着进行初始化,新建一个类…

python界面编程-thinker

一、介绍 thinker是python内置界面库不需要额外安装 二、控件使用 1、窗口 import tkintertop tkinter.Tk()#创建窗口 top.mainloop()#消息循环2、按钮 from tkinter import *def button_event():print("按钮按下\n")return#创建窗口 main_window Tk() #设置窗口…

python thinker(菜单,滚动条,回调函数,对话框)

菜单menu from tkinter import * root Tk() def lab():label0Label(root,text"hello world")label0.grid(column0) root.geometry("800x480")#窗口大小menu0Menu(root)#参数是父级控件 for x in [文件,编辑,视图]:menu0.add_command(labelx,commandlab)#…

永恒之蓝(勒索病毒)

1、要有一台靶机和一台攻击机,这里的攻击机为kali,靶机为Windows2008。 2、添加一个新的网卡,防止病毒传播到主机。 1、添加网卡: 注意:这里添加的子网ip不能和前面的重复。 3、给虚拟机设置网卡。 两台虚拟机要设置为…

老生常谈,永恒之蓝-winxp

老生常谈,永恒之蓝-winxp 环境说明: 攻击机:kali 靶机:windows xp sp2 靶机开放服务:无,IE浏览器版本 6.0 信息收集: 扫描当前网段存活主机,发现目标主机:IP&#xf…

msf渗透测试学习-与永恒之蓝漏洞案例

MSF是Metasploit Framework的缩写,是一款广泛使用的渗透测试工具,具有强大的攻击功能。它提供了一个模块化的平台,通过将各种攻击载荷、漏洞利用和辅助工具组装在一起,可用于模拟各种攻击,测试系统安全性,也…

永恒之蓝--Windows7

永恒之蓝是在Windows的SMB服务处理SMB v1请求时发生的漏洞,这个漏洞导致攻击者在目标系统上可以执行任意代码。通过永恒之蓝漏洞会扫描开放445文件共享端口的Windows机器,无需用户任何操作,只要开机上网,不法分子就能在电脑和服务…

win7永恒之蓝

一 使用msfconsole命令开启MSF,并使用search命令搜索永恒之蓝模块 search ms17-010 二 :使用搜索出来的第三个模块来进行探测目标是否存在永恒之蓝漏洞,并设置好以下参数进行扫描测试 >>>use auxiliary/scanner/smb/smb_ms17_010 …

永恒之蓝从渗透的复现

永恒之蓝又称为勒索病毒,同样这个漏洞成为了黑客现在训练的好方式(记住千万不可以攻击别人的电脑),这个漏洞在win7中十分常见,而永恒之蓝对应的是445端口,所以说我们将用win7虚拟机(受害者&…

永恒之蓝(Eternal Blue)复现

永恒之蓝介绍 什么是永恒之蓝 永恒之蓝(Eternal Blue)爆发于2017年4月14日晚,是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限,以此来控制被入侵的计算机。甚至于2017年5月12日, 不法分子通过改造“永恒之蓝…

kali与永恒之蓝

kali永恒之蓝攻击 写在前面一、永恒之蓝是何方神圣?二、神马是SMB协议?三、MSF四、攻击步骤1、攻击主机与靶机配置2、攻击步骤 五、种植后门 写在前面 这是我的第一篇CSDN博客,最近又参加了一个CTF比赛,当然,纯属兴趣爱…