我有一个可能非常简单的问题,但我对子网掩码的一般概念及其在不同路由协议中的使用感到困惑。
虽然我了解子网掩码的基本用例,但我想知道所有路由算法(外部和内部)在路由时是否都使用 IP 地址的子网部分?如果有区别,您能否提供一个例子并说明为什么某个协议不使用它?
我已经对进程之间的上下文切换问题感到困惑,给定了某个时间片的循环调度程序(这是unix/windows在基本意义上都使用的).
因此,假设我们在一台核心机器上运行了200个进程.如果调度程序使用的是1ms时间片,则每个进程每200ms就会获得一次,这可能不是这种情况(想象一下Java高频应用程序,我不认为它会每200ms调度一次以满足请求).话虽如此,我在图片中遗漏了什么?
此外,java和其他语言允许将正在运行的线程休眠例如100ms.我是否正确地说这不会导致上下文切换,如果是这样,这是如何实现的?
在 Java 应用程序中,如果对对象状态的访问发生在同一线程上(在最简单的情况下,在单线程应用程序中),则无需同步以强制更改的可见性/一致性,如发生在关系规范:
“两个动作可以通过先发生关系排序。如果一个动作先发生在另一个动作之前,那么第一个动作对第二个动作可见并在第二个动作之前排序。
如果我们有两个动作 x 和 y,我们写 hb(x, y) 来表示 x 发生在 y 之前。
如果 x 和 y 是同一线程的动作,并且 x 在程序顺序中排在 y 之前,则 hb(x, y)。”
但是现代架构是多核的,所以 Java 线程可以在任何给定时间在其中任何一个上执行(除非这不是真的并且 Java 线程被固定到特定的内核?)。因此,如果是这种情况,如果一个线程写入变量 x,将其缓存在 L1 缓存或 CPU 寄存器中,然后开始在另一个内核上运行,该内核先前访问过 x 并将其缓存在寄存器中,则该值是不一致的.. . 当线程从 CPU 上取下时是否有某种机制(隐式内存屏障)?
java concurrency synchronization memory-model memory-barriers
我知道getter也应该同步,但是下面给出了代码
Object get() { return val; }
synchronized void set(Object val) { ... }
Run Code Online (Sandbox Code Playgroud)
编译器如何搞乱一个简单的return语句,这是一个原子的(从mem简单读取)?它与每处理器缓存有关吗?