我正在学习 Java 中的多线程,我有一个简短的问题。我有一个同步块或方法和 2 个(或更多)线程。而且我只有一个只有一个核心的CPU,因此当CPU决定从一个线程切换到另一个线程时,2个线程将按顺序工作。
public synchronized void doSomething() {
// do something
}
Run Code Online (Sandbox Code Playgroud)
因此,一次只有一个线程会执行此方法,因为它是同步的。另一个线程被阻塞,在第一个线程完成执行之前无法执行该方法。
我认为有两种情况,CPU可以在thread1完成doSomething()的执行之前将执行从thread1切换到thread2。如果CPU这样做,则意味着线程1将停止执行doSomething()并让它未完成,线程2将看到doSomething()被锁定,因为线程1执行了它。之后我认为CPU会切换回thread1并继续执行doSomething()。在 CPU 切换回线程 2 之前,线程 1 可能会再次开始执行 doSomething() 。
第二种情况,线程1执行doSomething(),线程2在线程1执行该方法的整个期间被阻塞。当线程 1 完成 doSomething() 的执行后,CPU 将切换到线程 2,该线程将开始执行 doSOthing(),因为此时该方法尚未锁定。
有人可以向我解释什么是正确的情况吗?
我必须制作一个显示核心信息的C++程序.
我的问题是:我不知道什么是核心?我在谷歌搜索但对我来说,它就像一个CPU.问题是我必须制作另一个显示有关CPU信息的c ++程序.
有人可以解释核心和CPU之间的区别吗?
我正在研究计算机体系结构,但我不明白是什么真正使一台机器的软件与另一台机器“兼容”。让我们以两台使用相同 intel cpu 的机器(例如 Mac OS 和 Windows)为例。现在,如果操作码相同,它们的软件怎么可能彼此不兼容?
1)有人可以概述一下兼容性词所涉及的内容吗?
2)除了CPU的操作码之外,还有哪些因素可以使两台机器相互兼容?
这是我在大学的最后一个学期,副课叫做微处理器的体系结构和编程,教授写了这段代码,我只是无法理解他在做什么。尤其是有面具的部分。这是代码。谁能帮我理解一下吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
uint32_t Instruction_Memory[0x2000];
uint32_t PC = 0;
uint32_t Registers[32];
uint32_t Data_Memory[0x3000];
uint32_t get_instruction(uint32_t input){
uint32_t temp = input/4;
return Instruction_Memory[temp];
}
void print_registers() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
printf("x%d: %x \t", i*8+j, Registers[i*8+j]);
}
printf("\n");
};
};
uint32_t get_bits(uint32_t input, int start, int numberOfBits){
uint32_t t4 = input >> start;
uint32_t mask = (1 << numberOfBits) - 1; …Run Code Online (Sandbox Code Playgroud) 除了运行无限循环之外,是否有任何技巧(如可能缓存未命中?)使CPU尽可能热?
这可能是特定于体系结构的.
cpu temperature cpu-architecture cpu-usage computer-architecture
我知道CPU可以重新排序指令
load A
load B
Run Code Online (Sandbox Code Playgroud)
但是CPU会重新排序以下代码吗?(换句话说,在另一个核心上运行的第二个线程会以相反的顺序看到结果吗?)
some_array[array_index] = new_value;
++array_index;
Run Code Online (Sandbox Code Playgroud)
我猜它永远不会因为第二行依赖于第一行.我对吗?
举个例子,我想确切地知道哪个x86处理器系列支持该fisttp指令.我很确定它在奔腾4及更高版本上得到了支持,但我想对此进行一些官方验证.更重要的是,我想知道它是否得到了进一步的支持:它是否可以在Pentium III上使用?
我尝试了所有明显的谷歌搜索术语,但在网上几乎没有关于这个特定指令的任何内容.即使有,这也不是一个好的通用解决方案.
我了解英特尔IA-32架构的手册,可在网上点击这里.查看指令集参考,A-Z,我可以找到我感兴趣的指令以及有关它的大量有趣信息.但是在那本手册中没有任何地方告诉我哪些处理器系列支持每条指令,甚至是第一次引入时.
我试图找到本手册的旧版本(即奔腾III系列),但我空了 - 所有链接都指向上面链接的页面,并附有当前版本的手册.此外,为每个家庭挖掘手册是很多工作,看看我关心的指令是否存在.
当然,这些信息是其他人经常查看的信息......他们使用什么资源?
注意:对于粗心的读者,请注意我不会询问如何在运行时以编程方式确定此信息.我想坐在我的办公桌前.
因此,当我学习编程时,我了解到一个简单的'x%2'将是一个很好的快速方法来确定一个数字是否是偶数.我已经开始使用'x&1',因为我相信它在CPU中更快(尽管今天的速度可能毫无意义).任何了解CPU的人都可以了解这是否真的更快,或者是否有一些简单的编译器优化?
假设有两条顺序指令,如下所示:
instruction A
instruction B
Run Code Online (Sandbox Code Playgroud)
由于 CPU 流水线的原因,B 将在 A 完成之前启动。
是否存在一种机制来确保 B 在 A 完成后启动?
更新:
很抱歉我没有准确描述问题。我的意思是,这两条指令具有应用程序级排序依赖性,但没有危险。例如,在事务系统中,第一条指令将日志刷新到持久存储,第二条指令通知客户端有关事务提交的信息。因此,在第一条指令完成之前,我们无法执行第二条指令。如何提供这个执行指令?
UInt62.max/2在内存中由0100..0000表示.添加1,它将是0100..0001.所以,标志的第一位.我们拿-1.但CPU认为它是-9 223 372 036 854 775 808.为什么它如此复杂?
你可以看到它是真的,因为Swift游乐场中的问题:为什么在Swift中UInt64 max等于-1?
var max = UInt64.max / 2 + 1 // playground shows -1 because it treats it as Int64
Run Code Online (Sandbox Code Playgroud) cpu ×10
assembly ×3
c ×2
c++ ×2
barrier ×1
core ×1
cpu-usage ×1
instructions ×1
intel ×1
java ×1
locking ×1
memory ×1
optimization ×1
peripherals ×1
pipelining ×1
processor ×1
swift ×1
synchronized ×1
temperature ×1
x86 ×1