6 FPS

卡拉彼丘

  • 信息差:发现分布以及落单对方,灵活跑动隐藏自身,干扰对方准备好时,对方换弹/倒地时补射。
    • 躲避对方多枪线,己方架多枪线,多路线包围
    • 一个位置偷一枪,就换位置。不要再露头。
    • 对枪注意弦化
    • 位置的选择:一要有掩体,二要有安全的退路通道和队友大部队汇合,不要被敌人包夹。
    • 不要急于补人,要观察有没有被敌人包
    • 进阶:时刻预瞄出人点,
      • 弦化靠左墙,预瞄靠左,因为向右出掩体,准星会被向右移动。
      • 学习弹道,反向压枪。
  • 注意不要冲动,以身试陷(除非是突破位)

角色特点

  1. 熊当掩体(带闪光弹,烟雾弹),熊会自动冲锋并结冰
  2. 防守方
    1. 米雪儿:适合压制补枪,技能适合补枪。引诱敌方到背面炮台射程里
  3. 进攻方:
    1. 明:侦察 + 干扰器,风场雷

地图,高空卡墙脚。

  1. 欧拉港口/海湾图:复杂的短距离(掩体之间的距离)小路。适合白墨(带烟雾弹增加自身能力)和熊。白墨攻击走中间,抄底路偷对面的大狙。或者A点上上下下,适合近身跳散弹。
    1. 防守走A
  2. 404基地/巨炮图:白墨可以中路强压。
    1. 防守方 熊,进攻方沙猫无敌B
  3. 88区/古风图,大图远视野,适合大狙,大机枪。还有熊
    1. 禁止白墨。
  4. 风曳镇:大狙和小画家
    1. 防守必选熊(AB滑)和信(传送)
    2. 禁止白墨。

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

Scons

Scons

  • SCons is a software construction tool that can be used as an alternative to traditional build systems like Make and CMake.
  • It is a Python-based build tool that provides a convenient and flexible way to define and manage the build process for software projects, including C++ programs.

Scons VS cmake

  1. 基于python语言的构建工具,对开发者来说过度自然,简单,no need to learn domain-specific language like cmake

其余cmake有的, Scons 也有。

  1. cross-paltform,
  2. SCons has built-in support for dynamic dependency analysis, meaning it can automatically detect changes in source files and rebuild only what’s necessary. This can result in faster builds for large projects.

Project structure

  1. Sconstruct python file as compile entry

framework grammar

  1. add option for scons command

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    AddOption('--buildDir', 
    dest='buildDir',
    type='string',
    default="build/",
    # default=False,
    nargs=1,
    action='store', # meaning save the string
    # or action='store', meaning True or false
    metavar='DIR',
    help='Base build directory'
    )
    baseBuildDir = GetOption('buildDir')
  2. add sub scons config file and build result path using variant_dir

    1
    env.SConscript("src/SConscript", variant_dir=buildDir, exports= {'env' : env.Clone()})     
  3. achive debug mode

    using scons debug=1 command.

    1
    2
    3
    4
    env = Environment()
    debug = ARGUMENTS.get("debug", 0)
    if int(debug):
    print "in debug mode"

main construct grammar

  1. Define the Build Environment:
    In the SConstruct file, define the build environment by creating an Environment object. You can specify compiler options, flags, include paths, library paths, and other build settings within this object.

    1
    2
    env = Environment(CXX='g++', CCFLAGS=['-O2', '-Wall'], CPPPATH=['include'], LIBPATH=['lib'])
    libEnv = env.Clone()
  2. Specify Source Files and Targets:
    Define the source files for your C++ program and specify the target(s) you want to build using the Program() function.

    1
    2
    3
    4
    source_files = ['main.cpp', 'util.cpp', 'other.cpp']
    # or select the src files
    Object('hello.cpp')
    program = env.Program(target='my_program', source=source_files)

    In this example, main.cpp, util.cpp, and other.cpp are the source files, and my_program is the name of the target executable.

  3. static or dynamic lib

1
2
3
4
5
6
# static
Library("t", Glob("src/*.cpp"))
# dynamic
source = Glob("src/*.cpp")
SharedLibrary("t", source)
Program(["hello.cpp"], LIBS=["t"], LIBPATH=".")
  1. execute command during compilation
  • this is usually to print info
  • The command is executed when any of the specified dependencies (allSrcs, ".git/index", or "SConstruct") change.
1
2
3
4
5
6
7
8
9
10
env.Command(
target='bar.out',
source='bar.in',
action=["rm -f $TARGET", "$BAR_BUILD < $SOURCES > $TARGET"],
ENV={'PATH': '/usr/local/bin/'},
)
env.Command(
versionFile,
allSrcs + [".git/index" "SConstruct"],
'printf "#define ZSIM_BUILDDATE \\"`date "+%Y-%m-%d %T"`\\"\\n#define ZSIM_BUILDVERSION \\"`python misc/getver.py`\\"" >>' + versionFile)

Command

1
2
scons -c  # Clean
scons debug=1 # Rebuild using `SConstruct` file in debug mode

scons-project analysis

TODO: multipim how to add a singel head file during compilation process.

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

https://scons.org/doc/production/PDF/scons-man.pdf

0 Overview

工作外的内容聚焦于几个方面:

  1. 家庭、环境和高雅娱乐
  2. 额外职业技能的培养
  3. 额外的计算机技术的使用(网络和主页网站配置)
  4. 各种设备(主要是科技设备)
  5. 影视相关
  6. 游戏相关

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

3.3 EfficientWorkLearning

科研工作的目标

  1. 从底层的优化做起,自底向上的。对整个AI训练的难点有个全面细致的认知。
  2. 或者从应用的问题出发建模,从上到下有个全面的认知。
  3. 往架构师的方向努力

淡而不厌,简而文,温而理,知远之近,知风之自,知微之显,可与人德矣。

科研学习

狠狠吸收

华为实习部门的都是手握A会的博士大佬。本人望尘莫及,我会狠狠吸收的。

科研的长远与犀利的眼光

  1. 如何识别伪装信息 和被包装的工作
  2. 明确理论目标上限,当前的差距,实现路径

研究理解与实现

  1. 跨领域知识:公众号,订阅
  2. follow前沿论文:follow学者, 公众号,
  3. 实际问题、需求的发现
    1. 技术论证:理论上限,可行方案
    2. 独立任务分割
    3. 高效实现(解决问题)

科研工作的全局观念

  • 自顶向下的设计规划、工作全局观 (从目标、需求、愿景出发。不断细化实现点)
    • 顶:论文全流程思路图(构思与其余工作的对比):当前实现和问题、兼顾创新性的方法 和 设计目标期望效果。
    • 中:代码实现逻辑框架图
    • 底:代码语言具体实现:高内聚低耦合的重要性,解耦,拆分,这样就容易重构了。独立的微服务
  • 自底向上的知识积累 与研究方法提出
    • 底:领域的基础知识
    • 中:领域的主流方法和解决方案
    • 顶:行业痛点和有待补完的领域空白。
  • 当两者相联,目标才能顺利的达成,

高效学习的过程中注意点

  1. 学习的优先级:用20%时间先掌握80%的基础知识或者感兴趣的关键
    1. 难的问题可以讨论合作得出
  2. 提问式主动学习:不是被动学习,尝试通过提问、讨论、教授他人等方式来加深理解和巩固所学内容。
  3. 合作学习: 不仅能头脑风暴idea。对概念的理解,表达能力,心理健康有好处
  4. 交叉与分割学习: 概念文字、视频和案例分析交叉理解。长时间执行单一学习会枯燥,效率降低。切换学习一些新鲜东西:每日关注LLM的有趣实现。
  5. 理论实践交融:实际运行或者编写测试代码运行来深入理解
  6. 持续反馈与评估:每天每周对学习的进度和效果进行分析、来调整学习计划和研究方向。可以遵循STAR 法则。

具体研究点的克服

体系结构量化分析方法,重点就在于量化分析开销,比较然后进行tradeoff。当前前提是你要有基本的相关概念。

具体知识来源的优先级,或者说如何使用搜索引擎:

  1. 明白原理,设计实验,实际机器测量
    1. 认知概念,理解 (图解 >> 列表对比 >> 文字list >> 大段描述)
  2. 阅读相关的论文以及书籍
  3. 国内大佬的博客和大论文
  4. 国外论坛Stack Overflow > 国内知乎 > 博客园 > csdn > 其他
    1. 资料的来源(论文 >> 官方文档 >> 英文博客 >> 高质量中文资料)

在理解概念,量化了具体场景的数值后,就可以开心进行tradeoff了。

  1. 思维导图、摘要,来理清概念 和思路
  2. 结合PPT 数据与图表展示效果

注意项目的可读性和可拓展性一般与性能是不兼容的。这取决于项目的checkpoint/middleValue的保存,在性能优化时往往会消除中间变量。这样会导致代码的可读性和可拓展性下降。

check-point的合理设置

  1. 合理的检查点,既是阶段性的成果,又能在此衍生出无限的可能
  2. 需要能高效的复现与重构

关于如何解决困难

困难的定义可以基于以下几个要素进行评估:

  1. 个人技能能力:困难的程度可以取决于个人所具备的技能和能力水平。对于一个人来说,某项任务可能很容易,而对另一个人来说可能很困难,这取决于他们的专业知识、经验和技能。如果一个人已经具备了必要的知识和技能,那么他们可能更容易应对困难任务。相反,如果缺乏必要的知识和技能,任务就会更具挑战性。
  2. 任务量评估:任务的规模和复杂性也是评估困难程度的重要因素。任务量的多少以及任务本身的复杂性(比如需要解决的问题、涉及的步骤等)会对困难程度产生影响。
    1. 多人合作:效率会由于沟通同步而减半
    2. 量化分析加深理解:对于某些任务,特别是涉及复杂问题解决或决策制定的情况,进行量化分析可以加深对问题本质的理解。这种理解的深度也会对困难程度产生影响,因为解决关键核心会对整个任务的理解的评估进行重大修正。
    3. 对未知领域的任务量评估,会随着了解而变得准确。(这不是产品经理的工作吗?
  3. 时间的紧迫程度:完成任务所要求的时间紧迫程度也是评估困难程度的因素之一。如果任务需要在很短的时间内完成,那么它可能会被认为是更具挑战性和困难的。

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

3.2 taskPriority

工作优先级四象限(优先级矩阵)

  • 基础版本(艾森豪威尔)
    • 对于紧急又重要的事情马上做。如果这类事情过多,那就想办法规划时间,减少此类事情。
    • 对于重要但不紧急的事情计划做。尽可能地把时间花在重要但不紧急的事情上,这样才能减少产生重要且紧急的工作量。
    • 对于紧急但不重要的事情授权做。处理原则是授权,让别人去做。
    • 最后对于不重要不紧急的事情减少做
  • 额外的维度
    • 依赖关系:工作中显露的潜在工作会打断工作的交付,砍半降低交付效率
      • 尽可能全面

拓展版本

  • 当前工作优先级评估由 四个连续值维度 + 三个逻辑指标 组成
  • 优先级评估的时候不止是自己的视角,还有别人的视角(别人在心里的权重 * 重要性 * 紧迫性)。其中别人在心里的权重,一般来说: 父母、爱人、子女 > 领导 > 我

四个连续值维度

  • 喜好程度
  • **估计工作量(投入收益比)**。这一点其实很难量化,自己都没有做怎么知道,只能横向收集友商的数据。
  • 紧急的纬度由DDL时间确定,这点可以和工作量指标互动。
  • 重要性由以下几点确定,都能提高对工作的重要性评价:
    • 增加对工作的喜爱程度的任务: 高效插件与可视化工具的学习使用,
    • 提高工作效率的任务:学习基础知识,
    • 减少长期的工作量:学习、制造和使用轮子;自动化工作。

三个逻辑指标

  • 工作间依赖关系
  • 专注度要求(与疲劳度互补,清醒时才能做思考工作,一天工作后也能进行的简单工程工作)
  • 是否属于未知的领域。(与专注度要求不是正交的关系,是集合的包含关系。需要动脑的事情,肯定是未知的)

经常遇到的实际情况

相同的指标

  1. 紧急程度:不紧急。我一般会比较焦虑,所以工作会较早立项。
  2. 重要程度:我认为重要的才会主动去做,无论是对眼前的毕业考核,还是长远的考虑
  3. 喜好程度:我认为有趣的才会主动去做
  4. 工作间的依赖关系:我会遵守逻辑

不同的指标:

  1. 是否未知:阅读信息的需求
  2. 是否需要专注: 思考需求

两者结合:纯思考 > 阅读加稍微思考 > 初步的阅读收集信息 > 纯机械工作

任务周期内:时间分配和执行顺序

之前的任务优先级评判,都是从完成任务的角度考虑。但是实际情况是每个任务都需要很久(许多任务周期)才能完成。

按照优先级的指标,例如:

紧急性(3) 重要性(3) 喜好(1) 工作量(3) 总分 分配 要求
report 3 0 0 0 3 一天欠 2
thesis 3 3 0 3 9 两天多 3
AI 2 2 1 2 7 两天欠 1
OpenCL 2 1 1 1 5 一天多 1
web 1 0 0 1 2 一天欠 1
Summary 26
  1. 紧急性: 迫在眉睫(几天), 稍等几周,稍等几月,半年一年,可有可无
  2. 重要性: (当下)重大转折,(潜在)深远影响, 一年内小方向,与我无瓜
  3. 喜好:特别喜欢,有点意思,毫无波澜,有点厌恶
  4. 预估工作量(专心情况下):半年以上,一个季度,一个月,一周
  5. 要求(专注度):纯思考 > 阅读加稍微思考 > 初步的阅读收集信息 > 纯机械工作 (3~0)

注意

  • 工作安排 “必须做”占 40%,“愿意做”限制在 30% 左右,剩下30%处理出现的未发现的依赖任务和计划外工作。
  • 涉及到合作的工作:要与对方商量好,自己的选择(为什么把你鸽了,不是)

理想中的二维可视化细节

  • 科研工作与生活各自独立一张图。处理的时间段不同。
  • 横坐标是时间DDL表示紧急程度Urgency,纵坐标是重要性Impact(代表能增强自身和造轮子,还是繁琐小事)
    • 横坐标会随时间自动移动,
    • 标记出四块或者9块颜色
  • 节点可以可视化的部分
    • 颜色深浅表示喜好程度、投入收益比
    • 大小表示工作量绝对值(难易程度)
      • 会根据每日的任务自动调整
      • 甘特图 Gantt:的长条状,中间塞进度条的百分比实现。
    • 和连线表示工作依赖关系
    • 特殊颜色/形状 表示设置里程碑(北极星)任务,完成后自己会收获什么(能力属性标签)
  • 节点额外的属性值(不可视化)
    • 任务的风险
    • 需要的合作者,资源
    • DoD (完成标准,验收标准)
  • 根据公式和数据, 计算工作的优先级并给出推荐。
    • 考虑WIP(Work in Progress)
  • 实现日历功能
  • 为了能激励自身,引入信息增长统计
    • 过去一周/月/季度/年,完成的各类型的Task
      • 引入勤劳值(工作量统计),和收获值(能力增长统计)
    • 能力属性标签, 数值是否随时间衰减

已有的优先级矩阵产品

  • ducalis
  • 另一种维度,将紧急程度与工作量交换:pic

团队合作的优先级

团队合作中,解决问题的策略与优先级

对象:领导、部门的同事团队( 其余部门的同事团队),个人主体。

思考的基础与前提(多沟通,深分析,找关键):

  1. 找到问题的关键,并提出实用有效的方法
  2. 问题考虑全面,目光长远,设计方法可持续

情形:

  1. 别人遇到问题求助
    1. 授人以鱼不如授人以渔
    2. 如果有其余需求,归纳到最后一点统计决策
  2. 自己遇到问题
    1. 研究瓶颈
      1. 在充分的调研与汇总整理后,向同事或者上级咨询与求助
    2. 两难抉择: 返工的bug修复,新功能,新业务,新研究方向与现有的工作的时间冲突
      1. 工作优先级四象限:根据重要性、紧急程度、喜好程度、工作量(投入收益比)与依赖关系分类
      2. 要与提出需求的对方商量好,解释自己的选择和困难

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

3 EfficientJumpingRunning

jumping the branch task

五大阻碍工作完成时间的罪魁祸首

  1. 过多的Work in Progress
    1. 太多WIP会导致很多问题:交付延误、品质下降和员工情绪恶化
    2. 利特尔定律
      $$平均周期时间 =\frac{平均WIP量 }{平均产出量 }$$
  2. 未知的依赖工作
    1. 常见依赖关系有3种:

      架构(软件和硬件):一个组件的变更可能破坏另一个组件导致它停止运行
      专业知识:从专家那里获得建议或帮助(需要怎样做某事)
      活动:直到活动完成才能取得进展

  3. 计划外工作(妨碍你完成某事或导致你无法实现里程碑的干扰事项)
  4. 优先级冲突(相互竞争的项目和任务。当你不确定做什么事情是最重要的时候,就会加剧这种冲突)
  5. 被忽视的工作(技术债)

如何相互影响

  1. 信念/意志确实很重要
    1. 强烈的信念能让你的工作迈出坚实的第一步,而且每一步都走得是否有力
    2. 但是前提是你要十分明确努力的方向,对工作的不自信会减半工作热情。
      1. 工作的优先级冲突,这将导致过多的WIP,从而导致更长的周期时间。
  2. 明确任务的优先级,并分阶段、逐步击破是最好的选择。

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

DeviceExpansion

拯救者 R7000 2020(1650ti)

内存条

内存为两根8GB DDR4-3200内存组成双通道。 如果要拓展,需要全部升级为 16GB * 2。 拓展视频图文教程

M2固态

可以加装一条2280的固态, 但是无法加机械了。

B450M (主机主板)

内存条

  1. 芯片组最高支持DDR4 2933的内存频率,
  2. 单条内存最大32GB,总容量最大128GB,
  3. 向下可以兼容DDR4 2133、DDR4 2200、DDR4 2400、DDR4 2666。

M2

PCIe 3.0的数据传输速度每通道1GB/s,PCIe 2.0是其一半

B450迫击炮有两个M2插槽,一个是满速pcie3.0×4(4GB/s) 一个是半速的pcie2.0×4(2GB/s)。价格差不多的话还是用M2 nvme协议 的SSD

一点没人提过的,b450m迫击炮装上第二个m2以后,第二个pcie2.0*16的扩展(pcie_4)是没法用的。

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

Weekly

Content

  1. Background, history
  2. Doing, Situation, Problem, Achievement
  3. Next Plan

year 2023

Weekly 230925-231001

  1. Wednesday 0927
    1. Afternoon: compile and test MultiPIM on icarus0, suffered from python2.7 and lose package dependency. But still encounter
      pin failed problem

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

周报是一周的总结和思考,

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

Disordered Ideas

2

重要说明:

这里存放着未被整理、分类,和仔细对比讨论过的 ideas。

Read more

Wake Up Process

Linux 多进程的竞争休眠机制

基本是基于Linux的时间片轮转机制。A process/thread is woken up by inserting it in the queue of processes/threads to be scheduled.

内核调度算法

CFS(Completely Fair Scheduler)是一种用于 Linux 操作系统的调度算法,它旨在实现对 CPU 时间的公平分配。CFS 是 Linux 内核中默认的调度器,自 Linux 2.6.23 版本以来就成为了标准调度器。

CFS 调度算法的主要目标是确保各个任务在相同的时间片内能够获得公平的CPU时间,不会因为优先级等因素而造成资源争夺不均。以下是 CFS 调度算法的一些关键特点和原则:

  1. 虚拟化时钟: CFS 使用了一种称为虚拟化时钟(virtual runtime)的概念,而不是传统的时间片。每个任务都有一个虚拟运行时间,调度器根据虚拟运行时间来决定哪个任务应该被调度。

  2. 权重: CFS 引入了权重的概念,用于调整不同任务的相对优先级。较高权重的任务会在相同时间间隔内获得更多的虚拟运行时间,从而实现按比例分配CPU资源。

  3. 累积虚拟运行时间: 调度器会根据每个任务的权重和已累积的虚拟运行时间,计算出每个任务的应有的虚拟运行时间片。任务在使用完它的时间片后,会根据虚拟运行时间进行重新排队。

  4. 红黑树结构: CFS 使用红黑树来管理任务队列,这种数据结构使得在插入、删除和搜索任务时的时间复杂度保持在对数级别。

除了 CFS,Linux 内核还有其他调度算法,如:

  • 实时调度器(Real-Time Scheduler): 用于实时任务,提供硬实时和软实时的调度策略,确保实时任务在指定的时间内执行完成。

  • O(1) 调度器(O(1) Scheduler): 是 Linux 2.4 内核中使用的调度器,它的时间复杂度为常数级别。然而,随着多核系统的出现,O(1) 调度器在多核环境下的性能表现受到限制,因此被 CFS 替代。

这些调度算法在不同的场景和需求下,对于多任务操作系统的调度提供了不同的方法和策略。选择适合的调度算法可以根据系统的应用和性能要求来进行。

问题

在高强度竞争之后,有些进程陷入长期sleep,并且在核空闲的时候,也不再重新运行?为什么?

原因可能是程序逻辑阻塞了,或者在等待IO

查看进程Sleep的原因

首先 计算机对一个进程是如何判断sleep的,是某时间内的计算占比低于某个阈值吗?

htop s 可以查看kernel 是不是阻塞, l 可以查看是不是读写同一个文件导致阻塞了。

Sleep的瓶颈在哪里

sleep for what, waiting for what?

实践1 strace

strace -p PID 可以显示一些信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ strace -p 4005042
wait4(-1, # 等待任意子进程结束

# check subprocess
$ pstree -p 4005042
pinbin(4005042)---BC_Compute(4005082)-+-{BC_Compute}(4005187)
|-{BC_Compute}(4005188)
|-{BC_Compute}(4005252)
|-{BC_Compute}(4005296)
|-{BC_Compute}(4005299)
`-{BC_Compute}(4005302)

$ strace -p 4005082
strace: Process 4005082 attached
futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL
# futex - fast user-space locking(seems to be used in OpenMP)
# It is typically used as a blocking construct in the context of shared-memory synchronization.


$ strace -p 4005188
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0 # repeat
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe536dbc0) = 0

It seems this is a subprocess repeating sleep leading to all other process to wait in the synchronization.

Use gdb -p PID to attach the process to locate the infinite loop (need Debug Symbols).

futex解释

futex 是 Linux 下的一个系统调用,用于实现用户空间线程间的同步和通信。让我们逐个解释这个系统调用中的每个参数的含义:

  1. 0x7fffe52de1b8: 这是一个指向内存地址的指针(或称为地址),通常是用于表示需要同步的资源或变量的地址。在这里,它表示需要等待的共享资源或变量的地址。
  2. FUTEX_WAIT: 这是一个指定 futex 要执行的操作的标志。FUTEX_WAIT 表示线程正在等待 futex 的值发生变化,即等待条件满足。当某个线程执行 FUTEX_WAIT 操作时,如果 futex 的值与预期不符,则该线程将被置于休眠状态,直到 futex 的值发生变化或超时。
  3. 2: 这是一个表示期望的 futex 值的参数。当调用 FUTEX_WAIT 时,线程将检查 futex 的当前值是否等于此参数指定的值。如果不等于,则线程将休眠等待。
  4. NULL: 这是一个指向 timespec 结构的指针,用于设置超时。这里为 NULL 表示调用没有设置超时,即线程将一直等待,直到 futex 的值发生变化。

总的来说,futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL) 表示线程正在等待位于内存地址 0x7fffe52de1b8 的 futex 变量的值等于 2。如果 futex 的值不是 2,则线程将一直等待直到 futex 的值变为 2 或者超时。这样的同步机制在多线程编程中用于等待条件满足后再执行某些操作,从而避免资源竞争和提高程序的并发性能。

nanosleep解释

这是一个系统调用 nanosleep 的输出,通常用于让线程休眠一段时间。让我们逐个解释这个系统调用的含义:

1
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0
  1. nanosleep: 这是 Linux 下的一个系统调用,用于使线程休眠一段指定的时间。

  2. {tv_sec=0, tv_nsec=2000000}: 这是传递给 nanosleep 的第一个参数,是一个指向 timespec 结构的指针。timespec 结构用于表示时间间隔,包括秒(tv_sec)和纳秒(tv_nsec)。

    在这里,tv_sec=0 表示秒数为 0,tv_nsec=2000000 表示纳秒数为 2000000。因此,这个 nanosleep 调用将会使线程休眠 2 毫秒(1 秒 = 1000000000 纳秒,所以 2000000 纳秒就是 2 毫秒)。

  3. 0x7fffe5368bc0: 这是传递给 nanosleep 的第二个参数,表示一个 timespec 结构的指针。这个参数用于存放未休眠完成的剩余时间,如果 nanosleep 被中断(例如收到信号),它将在这个指针中返回剩余的时间。在这个输出中,剩余时间被存储在内存地址 0x7fffe5368bc0 处。

  4. = 0: 这是 nanosleep 的返回值,表示成功完成。返回值为 0 表示 nanosleep 成功休眠了指定的时间。

综上所述,这个输出表示线程成功休眠了 2 毫秒。

实践2: zsim模拟程序

程序直接执行正常,zsim模拟直接sleep?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ strace -p 303359
read(10,

$ pstree -p 303359 │
gups_vanilla(303359)-+-gups_vanilla(303449)-+-orted+ │
| `-{gups+ │
|-{gups_vanilla}(303360) │
|-{gups_vanilla}(303361)

$ pstree -p 303449 │
gups_vanilla(303449)-+-orted(303451)-+-{orted}(303452) │
| |-{orted}(303642) │
| |-{orted}(303643) │
| `-{orted}(303644) │
`-{gups_vanilla}(303450)

这是一个 Open MPI(Message Passing Interface)的启动命令,用于启动一个 MPI 程序,并配置一些运行时参数。让我们逐个解释这个命令中的每个选项和参数的含义:

1
orted --hnp --set-sid --report-uri 11 --singleton-died-pipe 12 -mca state_novm_select 1 -mca ess hnp -mca pmix ^s1,s2,cray,isolated

部分参数含义如下:

  • orted: 这是 Open MPI 的一个工具,用于启动和管理 MPI 进程。
  • -mca state_novm_select 1: 这是一个 MCA(Modular Component Architecture)选项,用于指定某个模块或组件的参数设置。在这里,state_novm_select 设置为 1,可能是指定某个组件或模块在运行时的选项。
  • -mca pmix ^s1,s2,cray,isolated: 这是另一个 MCA 选项,用于配置 PMIx(Process Management Interface for Exascale)的相关设置。^s1,s2,cray,isolated 表示排除 s1、s2、cray 和 isolated 这些模块,可能是禁用某些特定的组件或功能。
pid strace output explanation
303451 restart_syscall(<… resuming interrupted read …>
303452 futex(0xabba001ec8, FUTEX_WAIT, 2, NULL
303642 epoll_wait(18, … epoll_wait 系统调用,用于等待文件描述符18上的事件
303643 select(50, [48 49], NULL, NULL, {tv_sec=2, tv_usec=0} 如下
303644 select(53, [51 52], NULL, NULL, {tv_sec=2167, tv_usec=944465}
  • restart_syscall表示系统调用被中断后重新启动的过程。它通常出现在系统调用的执行过程中,当某个信号(例如 SIGSTOP 或 SIGCONT)中断了系统调用的执行,然后系统调用在信号处理完成后被重新启动。
  • select 是一个用于在多个文件描述符上进行 I/O 多路复用(I/O multiplexing)的系统调用,它可以监视多个文件描述符,并在其中任何一个文件描述符准备好进行 I/O 操作时返回。
    • select 调用的输出,它将监视文件描述符 48 和 49,并在其中任何一个文件描述符准备好读取数据或超时(2 秒后)时返回。
    • 完全无法理解呢! 可能需要深入了解MPI的实现栈细节才能明白。

命令行唤醒Sleep进程

The only way to “wake it up” is to arrange for the condition to be met. 用户是无法更改的状态的。

传统kill进程

1
2
3
4
# find pid , state S+ meaning sleep
ps aux | grep name
# gracefully kill process
kill -15 pid

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。