基本是基于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 调度算法的一些关键特点和原则:
虚拟化时钟: CFS 使用了一种称为虚拟化时钟(virtual runtime)的概念,而不是传统的时间片。每个任务都有一个虚拟运行时间,调度器根据虚拟运行时间来决定哪个任务应该被调度。
权重: CFS 引入了权重的概念,用于调整不同任务的相对优先级。较高权重的任务会在相同时间间隔内获得更多的虚拟运行时间,从而实现按比例分配CPU资源。
累积虚拟运行时间: 调度器会根据每个任务的权重和已累积的虚拟运行时间,计算出每个任务的应有的虚拟运行时间片。任务在使用完它的时间片后,会根据虚拟运行时间进行重新排队。
红黑树结构: CFS 使用红黑树来管理任务队列,这种数据结构使得在插入、删除和搜索任务时的时间复杂度保持在对数级别。
除了 CFS,Linux 内核还有其他调度算法,如:
实时调度器(Real-Time Scheduler): 用于实时任务,提供硬实时和软实时的调度策略,确保实时任务在指定的时间内执行完成。
O(1) 调度器(O(1) Scheduler): 是 Linux 2.4 内核中使用的调度器,它的时间复杂度为常数级别。然而,随着多核系统的出现,O(1) 调度器在多核环境下的性能表现受到限制,因此被 CFS 替代。
这些调度算法在不同的场景和需求下,对于多任务操作系统的调度提供了不同的方法和策略。选择适合的调度算法可以根据系统的应用和性能要求来进行。
在高强度竞争之后,有些进程陷入长期sleep,并且在核空闲的时候,也不再重新运行?为什么?
原因可能是程序逻辑阻塞了,或者在等待IO
首先 计算机对一个进程是如何判断sleep的,是某时间内的计算占比低于某个阈值吗?
htop s 可以查看kernel 是不是阻塞, l 可以查看是不是读写同一个文件导致阻塞了。
Sleep的瓶颈在哪里
sleep for what, waiting for what?
strace -p PID 可以显示一些信息
1 | $ strace -p 4005042 |
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 是 Linux 下的一个系统调用,用于实现用户空间线程间的同步和通信。让我们逐个解释这个系统调用中的每个参数的含义:
0x7fffe52de1b8: 这是一个指向内存地址的指针(或称为地址),通常是用于表示需要同步的资源或变量的地址。在这里,它表示需要等待的共享资源或变量的地址。FUTEX_WAIT: 这是一个指定 futex 要执行的操作的标志。FUTEX_WAIT 表示线程正在等待 futex 的值发生变化,即等待条件满足。当某个线程执行 FUTEX_WAIT 操作时,如果 futex 的值与预期不符,则该线程将被置于休眠状态,直到 futex 的值发生变化或超时。2: 这是一个表示期望的 futex 值的参数。当调用 FUTEX_WAIT 时,线程将检查 futex 的当前值是否等于此参数指定的值。如果不等于,则线程将休眠等待。NULL: 这是一个指向 timespec 结构的指针,用于设置超时。这里为 NULL 表示调用没有设置超时,即线程将一直等待,直到 futex 的值发生变化。总的来说,futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL) 表示线程正在等待位于内存地址 0x7fffe52de1b8 的 futex 变量的值等于 2。如果 futex 的值不是 2,则线程将一直等待直到 futex 的值变为 2 或者超时。这样的同步机制在多线程编程中用于等待条件满足后再执行某些操作,从而避免资源竞争和提高程序的并发性能。
这是一个系统调用 nanosleep 的输出,通常用于让线程休眠一段时间。让我们逐个解释这个系统调用的含义:
1 | nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0 |
nanosleep: 这是 Linux 下的一个系统调用,用于使线程休眠一段指定的时间。
{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 毫秒)。
0x7fffe5368bc0: 这是传递给 nanosleep 的第二个参数,表示一个 timespec 结构的指针。这个参数用于存放未休眠完成的剩余时间,如果 nanosleep 被中断(例如收到信号),它将在这个指针中返回剩余的时间。在这个输出中,剩余时间被存储在内存地址 0x7fffe5368bc0 处。
= 0: 这是 nanosleep 的返回值,表示成功完成。返回值为 0 表示 nanosleep 成功休眠了指定的时间。
综上所述,这个输出表示线程成功休眠了 2 毫秒。
程序直接执行正常,zsim模拟直接sleep?
1 | $ strace -p 303359 |
这是一个 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)中断了系统调用的执行,然后系统调用在信号处理完成后被重新启动。The only way to “wake it up” is to arrange for the condition to be met. 用户是无法更改的状态的。
1 | # find pid , state S+ meaning sleep |
暂无
暂无
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Our technology,our machines,is part of our humanity.We created them to extend ourself,and that is what is unique about human beings. - Ray Kurzweil”
have merged 2 topdown site
Script: Email notifications when machine is free
login to free SMTP server(qq, google) to send email to others.
ping mail.ustc.edu.cnAccording to ref1.
1 | # install ca-certificates |
1 | sudo apt-get install mailutils |
send but the same, more crazy thing is the -v and -d flag is not supported. and --debug-level=trace0 isn’t recognized. many same question in StackOverflow
sudo tail -n 30 /var/log/mail.log or mail.error show more info.
We try ref2 ssmtp, sudo vim /etc/ssmtp/ssmtp.conf
1 | TLS_CA_FILE=/etc/pki/tls/certs/ca-bundle.crt |
The config get work but not well configed, e.g., TLS_CA_FILE
sending a email using gmail took about 13 mins.
1 | $ ssmtp [email protected] < mail.txt |
1 | $ sendmail [email protected] < mail.txt |
get to work after well config gmail setting.
| command | snode6 time(mins) | icarus1 |
|---|---|---|
| 4 | 1s | |
| ssmtp | 13 | |
| sendmail | 6 |
ref using QQ apppassword and python.
Create a Bash Script: Create a Bash script that checks the CPU usage and sends an email if it’s below 30%. For example, create a file named cpu_check.sh:
1 |
|
Make the script executable:
1 | chmod +x cpu_check.sh |
Modify [email protected] with your actual email address.
Schedule the Script: Use the cron scheduler to run the script at regular intervals. Edit your crontab by running:
1 | crontab -e |
Add an entry to run the script, for example, every 5 minutes:
1 | */5 * * * * /staff/shaojiemike/test/cpu_check.sh >> /staff/shaojiemike/test/cpu_check.log |
Replace /path/to/cpu_check.sh with the actual path to your Bash script.
Save and Exit: Save the crontab file and exit the text editor.
Now, the script will run every 5 minutes (adjust the cron schedule as needed) and send an email notification if the CPU usage is below 50%. You should receive an email when the condition is met.
Please note that this is a basic example, and you can modify the script to include more details or customize the notification further as needed. Additionally, ensure that your server is configured to send emails; you may need to configure SMTP settings for the mail or sendmail command to work correctly.
暂无
暂无
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
zsim-tlb simulate in icarus0
1 | pinbin: build/opt/zsim.cpp:816: LEVEL_BASE::VOID VdsoCallPoint(LEVEL_VM::THREADID): Assertion `vdsoPatchData[tid].level' failed. |
1 | VOID VdsoCallPoint(THREADID tid) { |
vDSO (virtual dynamic shared object) is a kernel machanism for exporting a carefully set kernel space routines (eg. not secret api, gettid() and gettimeofday()) to uservDSO__vdso_getcpu() C library, and kernel will auto move it to user-spacevDSO overcome vsyscall(first linux-kernel machanism to accelerate syscall) drawback.vDSO have only four function enum VdsoFunc {VF_CLOCK_GETTIME, VF_GETTIMEOFDAY, VF_TIME, VF_GETCPU};1 | // Instrumentation function, called for EVERY instruction |
INS_Address is from pin-kit, but INS_InsertCall is pin api.
.level is just show the level of nested vsyscall. I think comment the assert which trigerd when callfunc before entryfunc is just fun.
暂无
暂无
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
Anaconda和Miniconda都是针对数据科学和机器学习领域的Python发行版本,它们包含了许多常用的数据科学包和工具,使得安装和管理这些包变得更加简单。
解决了几个痛点:
Anaconda是一个全功能的Python发行版本,由Anaconda, Inc.(前称Continuum Analytics)提供。
Miniconda是Anaconda的轻量级版本(50MB),它也由Anaconda, Inc.提供。
修改~/.condarc
1 | ssl_verify: true |
1 | # 激活环境(base),路径为指定的 conda 安装路径下的 `bin/activate` 文件 |
conda packconda pack 用于将现有的 Conda 环境打包成一个压缩文件(如 .tar.gz),便于在其他系统上分发和安装。conda-unpack 来修复路径,使其在新环境中正常工作。conda-pack 可以将 Conda 环境打包成一个 .tar.gz 文件,以便于跨机器或系统移动和还原环境。以下是使用 conda-pack 打包和还原环境的步骤:
假设要打包的环境名为 my_env:
1 | conda pack -n my_env -o my_env.tar.gz |
这会在当前目录生成一个 my_env.tar.gz 文件。你可以将这个文件复制到其他系统或机器上解压还原。
在一个特定的 conda 环境目录(例如 /home/anaconda3)下还原和激活打包的环境,可以按以下步骤操作:
假设场景
conda 激活路径:/home/anaconda3/bin/activatemy_env.tar.gzmy_env步骤
解压文件到 conda 环境目录
首先,将打包文件解压到指定的 conda 环境目录下的 envs 目录:
1 | mkdir -p /home/anaconda3/envs/my_env |
这里的 --strip-components 1 会去掉 tar.gz 包中的顶层目录结构,使内容直接解压到 my_env 文件夹内。
激活并修复环境
激活该环境,并运行 conda-unpack 来修复路径:
1 | source /home/anaconda3/bin/activate /home/anaconda3/envs/my_env |
现在,my_env 环境已在 /home/anaconda3 目录下的 envs 文件夹中完成还原,可以正常使用。
conda env exportconda env export > freeze.yml 用于导出当前 Conda 环境的配置,包括所有安装的包和它们的版本信息,以 YAML 格式保存。conda env create -f freeze.yml 可以根据导出的 YAML 文件创建一个新环境。在conda命令无效时使用pip命令来代替
1 | while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt |
The double pipe (“||”) is a control operator that represents the logical OR operation. It is used to execute a command or series of commands only if the previous command or pipeline has failed or has returned a non-zero status code.
conda create -n 新环境名称 --clone 原环境名称 --copy
在任意层级的SHELL配置文件里添加
1 | export http_proxy=http://yourproxy:port |
1 | ps -eo pid,lstart,cmd |grep bhive |
1 | sudo ps -ef | grep 'bhive-re' | grep -v grep | awk '{print $2}' | sudo xargs -r kill -9 |
华为实习要结束了,作为二次元,在中国秋叶原怎么能不好好逛逛呢?
上海真是包容性极强的地方。原本内心对二次元的热爱,竟然这么多人也喜欢。不必隐藏,时刻伪装。可以暂时放松自我的感觉真好。
爱或者热爱是最浓烈的情感。对象一般是可以交互的人物,物体说不定也可以。但是至少要能与他持续产生美好的回忆和点滴,来支持这份情感。
比如说,我一直想让自己能热爱我的工作,就需要创造小的阶段成功和胜利来支持自己走下去。
三次元的人物包括偶像歌手,和演员。需要演出,演唱会来与粉丝共创回忆,演员也需要影视剧作品。
二次元人物大多数来自于动画,因为游戏一般不以刻画人物为目的,比如主机游戏 当然galgame和二次元手游除外。
日本动画以远超欧美和国创的题材和人物的细腻刻画(不愧是galgame大国,Band Dream it’s my go到人物心里描写简直一绝)创造了许多令人喜爱的角色。
女朋友 > 喜欢二次元(连载 > 完结) >> 追星
23.08.27 to do
暂无
暂无
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无
UnimportantView: Anime Recommendation
不同于恋爱番,催泪番,这样的分类。其实我更在意作品想表达的主题,作者想展现给读者什么。 无论是各种道理,还是就是某个环境,虚幻世界。
羁绊:对人的爱,爱情、亲情、友情。
| 番剧名 | 精神内核 | 评语 | 喜爱的角色 | 音乐 |
|---|---|---|---|---|
| Happy Sugar Life | 守护你是我的爱语 | 难以理解的爱的世界里,两位迷途少女相遇,救赎,领悟爱的蜜罐生活 | 砂糖、盐 | 金丝雀、ED、悲伤小提琴 |
我推的孩子(第一集)
Violet Garden
BanG Dream It’s my go !!!!! 初羁绊(友情,百合,重女)的破碎和reunion
未来日记
家有女友、渣愿
百合类的成长:终将成为你,
我心危
命运石之门
RE0
寒蝉鸣泣之时
魔法少女小圆
复杂、紧张的鸿篇巨制。多非单一的精神内核可以概括。多为群像剧。
Fate Zero
钢炼
EVA
刀剑
四谎
CLANND
龙与虎
巨人
超炮
凉宫
鲁鲁修
轻音
暂无
暂无
上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。
无