我的笔记说线程调度算法有两大类,抢占式和分时式。我想弄清楚这些在 Java 中是如何工作的。
据我所知(如果我稍微错了,请纠正我!)抢占允许更高优先级的线程在进入可运行状态时从低优先级线程接管 CPU。它会独占 CPU 直到更高优先级的线程出现,还是只会消耗大部分 CPU 时间,但较低优先级的线程也有机会运行?我在这里假设没有调用像 yield() 或 sleep() 这样会放弃 CPU 的方法。
在时间共享中,更高优先级的线程是否获得更多的 CPU 时间份额?
我猜我对先发制人的解释(以及我提出的问题)不可能是正确的,因为它似乎与分时相同!但我想确定细节。
我想,这一切是如何实施的?JVM 还是操作系统调度线程,还是依赖于 JVM 实现?
在进行CUDA编程时,我们都知道一个线程块会被调度在一个SM上,不会迁移到其他SM上。对于线程块中的一个线程来说,它在整个执行过程中是停留在单个SP上,还是可以将其指令任意调度到不同的SP上?
我的问题是关于扭曲和调度。我在这里使用 NVIDIA Fermi 术语。我的观察如下,它们正确吗?
A. 同一经线中的线程执行相同的指令。每个经线包括 32 根线。
根据 Fermi 白皮书:“Fermi 的双扭曲调度器选择两个扭曲,并从每个扭曲向一组十六个内核、十六个加载/存储单元或四个 SFU 发出一条指令。”
从这里开始,我认为一个经线(32 个线程)被安排了两次,因为 32 个核心中有 16 个被组合在一起。每个调度器在一个周期内向 16 个内核发出一半的扭曲,总的来说,两个调度器在一个周期内将两个扭曲的一半发布到两个 16 核的调度组中。换句话说,在这种费米架构中,一个经线需要安排两次,一半一半。如果一个 warp 只包含 SFU 操作,那么这个 warp 需要发出 8 次(32/4),因为一个 SM 中只有 4 个 SFPU。
B.当大量线程(比如一维数组,320个线程)启动时,连续的线程会自动分成10个warp,每个warp有32个线程。因此,如果所有线程都在做相同的工作,它们将执行完全相同的指令。在这种情况下,所有经线总是携带相同的指令。
问题:Q1。哪个部分处理线程分组(进入经线)?软件还是硬件?如果是硬件,它是经线调度程序吗?以及硬件扭曲调度程序是如何实现和工作的?
Q2。如果我有 64 个线程,线程 0-15 和 32-47 正在执行相同的指令,而 16-31 和 48-63 执行另一条指令,调度程序是否足够聪明以将非连续线程(具有相同指令)分组到同一个扭曲中(即,将线程 0-15 和 32-47 分组到同一经纱中,并将线程 16-31 和 48-63 分组到另一个经纱中)?
Q3。将扭曲大小(32)大于调度组大小(16 核)有什么意义?(这是一个硬件问题)因为在这种情况下(费米),无论如何都会调度两次扭曲(在两个周期内)。如果一个warp 是16 宽,那么只会安排两个warp(也是在两个周期内),这似乎与前面的情况相同。我想知道这个组织是否是由于性能问题。
我现在可以想象的是:可以保证同一 warp 中的线程同步,这有时很有用,或者其他资源(例如寄存器和内存)按 warp 大小组织。我不确定这是否正确。
有一项任务需要每天由两个人执行,并且有一个团队可用。
这个想法是将两个不同的人分配给该任务,每种可能的组合至少分配一次。
此外,理想情况下,应尽可能从前一个分配日开始分配任何特定人员。
例子:
给定球队:A、B、C、D、E、F
该任务的时间表可以是:
Day 1 = A, D
Day 2 = B, E
Day 3 = C, F
Day 4 = A, E
Day 5 = B, F
Day 6 = C, D
Day 7 = A, F
Day 8 = B, D
Day 9 = C, E
Day 10 = E, D
Day 11 = B, E
Day 12 = C, A
...
Run Code Online (Sandbox Code Playgroud)
请注意,相同的字母被分配与前一次有一定距离。例如,A 分配给第 1、4、7、12 天,D 分配给第 1、6、8、10 天。另请注意,所有可能的组合都存在。
目前,我可以“手动”对小团队(6 - 8 人)的配对进行组合和排序,但对于较大的团队,我无法想出一种算法。
有什么算法可以帮助我吗?
奖励积分: …
我正在寻找一个用于nodejs的schedular/cron。但我需要一个重要的功能 - 如果作业没有完成(当它再次开始的时间到来时),我希望它不开始/延迟时间表。例如,我需要每 5 分钟运行一次作业。该工作于8:00开始,但仅在8:06完成。所以我希望8:05的作业要么等到8:06,要么根本不开始,等待8:10的下一个周期。有一个包可以做到这一点吗?如果没有,实现此目的的最佳方法是什么?
根据我的阅读,有一个由硬件调用的定时器中断,它经常执行并将控制权从正在运行的进程转移回内核/调度程序,然后内核/调度程序能够确定正在运行的进程是否已超过其时间量,如果是,则运行另一个任务.
这似乎不精确。
例如:如果定时器中断是每 1 个单位
并且调度程序算法将 cpu 绑定进程时间量确定为 1.5 个单位,它实际上将获得 2 个单位的 CPU 时间。
或者调度程序是否只以中断计时器为单位为进程提供时间量?
我正在对作业进行排队,以便在 1 分钟后从控制器运行,并且作业正确显示在“作业”表中,但根据文档,我必须运行 php artisanqueue:work 才能执行作业,但在我的情况下,它们是在没有任何命令的情况下执行的在 Ubuntu 服务器 (AWS ec2) 上。这些作业也会进入失败的作业表,因为它们正在读取我之前更改的控制器的一些旧代码。注意:如果我运行 php artisanqueue:work,则某些作业将由此处理并使用新代码执行,而不会生成任何错误,而某些作业则由该未知后台进程执行并生成旧代码错误
php arisan 列表的结果
"root@ip-172-31-30-76:/var/www/html# php 工匠列表
Laravel 框架 5.5.32
用法:
命令[选项][参数]
选项:
-h, --help 显示此帮助消息
-q, --quiet 不输出任何消息
-V, --version 显示此应用程序版本
--ansi 强制 ANSI 输出
--no-ansi 禁用 ANSI 输出
-n, --no-interaction 不要问任何交互式问题
--env[=ENV] 命令应运行的环境
-v|vv|vvv, --verbose 增加消息的详细程度:1 表示正常输出,2 表示更详细的输出,3 表示调试
可用命令:
clear-compiled 删除已编译的类文件
down 将应用程序置于维护模式
env 显示当前框架环境
help 显示命令的帮助
list 列出命令
migrate 运行数据库迁移
优化框架以获得更好的性能(已弃用)
预设 为应用程序交换前端脚手架
在 PHP 开发服务器上提供应用程序服务
Tinker 与您的应用程序交互
up 将应用程序退出维护模式
应用程序
app:name 设置应用程序命名空间
授权 … 我是否需要在调用set_current_state()之前调用schedule()以安排运行队列中的下一个进程?
我看过很多代码,其中内核线程函数set_current_state()用于将状态设置为TASK_RUNNING或TASK_UNINTERRUPTIBLE。
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
....
schedule();
.....
}
__set_current_state(TASK_RUNNING);
Run Code Online (Sandbox Code Playgroud)
是否有必要调用set_current_state()与TASK_INTERRUPTIBLE调用之前schedule()?
在这个示例代码中,将状态设置为TASK_RUNNING退出kthread_should_stop()循环后有什么用?
我正在为我的OS类做一些Linux CFS分析,并且有一个我无法解释的观察.
对于两个相同的进程,当它们使用SCHED_OTHER策略执行时,我发现自愿上下文切换比使用SCHED_FIFO或SCHED_RR策略执行它们多50%.
这对于非自愿切换不会让我感到意外,因为SCHED_OTHER的优先级要低得多,所以它必须放弃CPU.但为什么自愿开关会出现这种情况.为什么SCHED_OTHER会比实时流程更频繁地自愿放弃CPU?这是一个完全相同的过程,因此只有志愿者在切换到I/O时放弃CPU,对吗?我不认为政策的选择会影响I/O尝试的频率.
任何Linux人都有自己的想法?谢谢!
请考虑以下问题:当一个任务/进程在单个处理器系统上运行时,另一个任务必须等待其执行,直到第一个任务被挂起或终止(取决于调度算法)。内核还包含各种任务,这些任务使用同一CPU来完成与OS相关的工作-例如调度,内存管理,响应系统调用等。
因此,当内核调度一个特定的任务/进程给它CPU时间时,它会放弃对CPU的控制吗?即它会立即停止吗?如果不是,当其他进程在CPU上运行时,它如何继续持续运行以执行所有与OS相关的任务?调度程序是否会移开以在CPU中执行下一个任务?如果是,是什么使调度程序又继续进行进一步的调度活动?这个问题类似,但是没有足够的细节- 内核如何一直运行?
我对这部分感到困惑,我无法理解这是如何工作的,请有人详细解释一下。如果您可以通过示例进行解释,将很有帮助。