1.skynet源码结构、命码启动流程以及多线程工作原理
2.方舟编译器学习笔记22 MAPLE IR和LLVM IR中module层面的令源信息对比
3.带你用SmartNoteBook探索SageMath
skynet源码结构、启动流程以及多线程工作原理
本文主要介绍skynet源码目录结构、指令启动流程以及其多线程工作原理。参考
1、手册skynet目录结构
只允许上层调用下层,命码ethminer源码而下层不能直接调用上层的令源api,这样做层次清晰。指令
2、参考skynet启动流程
启动skynet方式:终端输入./skynet exmaple/config
启动入口函数为skynet_main.c/main,手册 config作为args[1]参数传入
调用skynet_start.c/skynet_start函数
3、skynet多线程工作原理
线程创建工作由skynet_start.c/start完成,命码主要有以下四类线程:
1、令源moniter线程
初始化该线程的指令key对应的私有数据块
每5s对所有工作线程进行一次检测
调用skynet_monitor_check函数检测线程是否有卡住在某条消息处理
2、timer定时器线程
每隔微秒刷新计时、参考唤醒等待条件触发的手册linux c memcpy 源码工作线程并检查是否有终端关闭的信号,如果有则打开log文件,将log输出至文件中,在刷新计时中会对每个时刻的链表进行相应的处理.
3、socket套接字线程
处理所有的套接字上的事件,该线程确保所有的工作线程中至少有一条工作线程是处于运行状态的,以便可以处理套接字上的事件。
4、worker工作线程
从全局队列中取出服务队列对其消息进行处理,其运行函数thread_worker的工作原理:首先初始化该线程的key对应的私有数据块,然后从全局队列中取出服务队列对其消息进行处理,最后当全局队列中没有服务队列信息时进入等待状态,等待定时器线程或套接字线程触发条件。
4、skynet消息处理如何保证线程安全?
以上介绍了skynet源码中的mysql proxy 源码分析目录结构以及各部分功能,接着介绍了skynet的启动流程,最后介绍了skynet的多个线程是如何进行协同工作的。
方舟编译器学习笔记 MAPLE IR和LLVM IR中module层面的信息对比
对比了MAPLE IR和LLVM IR的模块层面信息,二者虽然都包含模块概念,对应单一编译单元,但呈现不同。
MAPLE IR在`MapleIRDesign.md`中有“Module Declaration”专门介绍模块层面信息,包括id、entryfunc、import、importpath、numfuncs等。
LLVM IR则将这些信息分散在“High Level Structure”文档中,具体包括源文件名、nginx windows 源码安装目标三元组、数据布局、模块级内联汇编等。
对比分析如下:
1. MAPLE IR的id提供模块唯一标识,LLVM IR通过源文件名实现。虽然LLVM IR能对应源码文件,MAPLE IR的id是否对应文件需进一步验证。
2. MAPLE IR的entryfunc明确入口函数名称,而LLVM IR默认使用main函数。这一差异可能与方舟支持Java和dex输入相关。
3. MAPLE IR引入import和importpath功能,允许导入类型文件和指定搜索目录,LLVM IR未提供类似功能。
4. MAPLE IR显示模块内函数数量,源码包安装ntfsLLVM IR缺少类似信息,但在实际需求时可统计,过多信息可能造成冗余。
5. MAPLE IR中globalXXX信息在模块层面显式声明,原因尚不明晰。LLVM IR未包含类似细节。
6. MAPLE IR未提供类似LLVM IR的Data Layout和Target Triple信息,可能因当前方舟仅支持ARM。
7. 通过HelloWorld.mpl等测试用例分析,发现id在特定目录下具有唯一性,但文档描述可能有局限性。
整体来看,MAPLE IR在模块层面信息描述上更为清晰,但文档可能过于偏向当前支持的前端和后端,需要适应未来多样性的需求进行调整。
更新:年9月日,添加了对测试用例mpl文件的分析,以验证文档对比分析结果。原有内容保持不变。
致谢:感谢@NJU-范伟杰 的提醒,补充了对测试用例mpl文件分析的内容。
带你用SmartNoteBook探索SageMath
探索SageMath,从SmartNotebook开始
SageMath,一个免费、开源的数学软件系统,结合众多Python包,采用Python语言编写,支持多种语言,旨在成为Matlab、Magma、Maple 和 Mathematica的开源替代。SmartNotebook(SNB)通过优化SageMath引擎和Notebook特性,减少安装和配置复杂度,实现即开即用,方便大家学习和使用。
利用SNB探索SageMath功能
创建一个Sagemath内核的Notebook,输入标题,选择内核,轻松启动。
创建Code Cell,输入Sage代码,执行操作。
例子:进行的素数因子分解。
利用SageMath帮助系统
使用“?”获取函数或命令的详细信息和使用方法。
查看源代码:使用“?”探索命令源码。
例如,查看factor()函数源码。
SageMath作为计算器使用
进行基础算术运算,如加、减、乘、除、指数等。
整数除法和因式分解
使用运算符//计算商和%计算余数。
使用divmod()函数同时获取商和余数。
检查整数是否能整除。
使用divides()和divisors()方法分析整数。
素数检查和素因数分解
使用is_prime()判断素数,factor()进行素因数分解。
最大公约数和最小公倍数
使用gcd()和lcm()计算。
标准函数和常量
包含max、min、floor、ceiling、三角函数等。
处理精度问题
注意floor和ceil操作的计算精度。
平方根计算
使用sqrt()获取平方根,指定基数和指数。
三角函数
包括正弦、余弦、正切等。
特殊角度简化
简化特定角度的正弦和余弦值。
数值和符号计算
使用符号计算π、e等常数,获取数值近似。
探索更多功能
持续关注后续文章,了解更多SageMath应用。