hao.li
@hao.li
hao.li
@hao.li
-
书上的停止状态对应 PPT 里的 Stopped 状态。书上的终止状态对应着 PPT 里的 Terminated/Zombie 状态。
书上的运行状态有点语焉不详,有可能包括了 PPT 里的 Blocked(阻塞状态)
下面按照 PPT 的 4 种状态解释一下
-
Running 是指进程正在被执行,或者正在等待被执行。所谓等待被执行的意思是,如果现在操作系统决定调度这个进程,这个进程立刻就会开始执行指令。
-
Blocked 状态是指,进程由于等待一些事件(往往是 I/O,比如从磁盘或者网络读数据),暂时无法执行。所谓暂时,就是说如果事件完成了,这个进程就会继续执行。
-
Stopped 状态是指,进程被用户强制的停止了(比如 ctrl+z 发送的 SIGSTOP 信号),这种停止在用户不主动同意的情况下,是会永远持续下去的。
-
Terminated 状态,进程已经结束了,等待被回收的情况。
主要区分一下 2 和 3 两个状态。
2 状态下,操作系统仍然认为该进程很可能被执行,因此操作系统会时不时的去看看(调度)这个进程,如果阻塞的操作完成了(比如读到了想读的数据),那么就会自动继续执行下去,进入状态 1;
3 状态下,操作系统认为这是程序员有意的停止程序,就不会再去调度这个进程了,这个进程必须被主动的唤醒(程序员发送特殊的信号),操作系统才会重新调度这个进程。
更简短的版本:
状态 1 中,进程要么正在被执行,要么在等待 CPU 调度;
状态 2 中,进程在等待阻塞的操作完成,然后才能进入状态 1;
状态 3 中,进程在等待用户主动许可唤醒,然后才能进入状态 1;
状态 4 中,进程只能等待被回收。Post #4 ❤️ 2 likes -
-
2x1a 在理想情况下,是可以将 int+ 的 CPE 降低一半的。这个理想情况要求
x OP (results of d[i] OP d[i+1])(以下称为操作 1)与d[i+2] OP d[i+3](以下称为操作 2)完全同时完成。在实际情况下,这两个操作很难完全同时完成。原因如下
- 这两个操作本身是不直接依赖对方的,但是存在间接依赖,即操作 1 实际上依赖上一个循环的操作 2。所以这两条流水线其实并不是完全独立的。
- int+ 消耗一个 cycle 是理想情况,实际上,由于有 cache miss、页表 miss 等等情况,int+ 有可能在某些时候消耗更多的 cycle。
- 这种波动的性能,会导致两条流水线不能完全排齐,即操作 1 和操作 2 不能完全同时完成。那么最终的性能其实就是两个操作在时间轴上的并集决定的。
综上,这导致了 2x1a 并不能理想的降低 int+ 的 CPE 到 0.5。在我们这个 case 里,它甚至没有性能提升。
下面回答几个相关问题
-
为什么 2x2 可以降的多一些?
看上面的第一个原因,2x2 构建了完全独立的两条流水线,这之间不存在直接依赖也不存在间接依赖。这样受到性能波动的影响就小一些(仅会受到自己这个操作的性能波动影响,不会受到对方操作的影响)。 -
为什么 double+ 可以直接降到 0.5?
单个操作的性能波动情况在 double+ 中同样存在,但是,单次 double+ 需要 3 个 cycle,这意味着微小的性能波动对整体性能的影响更小,反映在 CPE 上就被忽略了。这也是为什么在 NxN 的循环展开里(N 足够大),int+ 总能最终达到 0.5 CPE:我们在单次循环里放进了更多没有数据依赖的操作,这使得单次循环变重,从而稀释了性能波动。
Post #4 ❤️ 1 like -
绝对难度并不高,但是需要投入的时间和精力比较多。
课堂上要跟上老师,课下还需要大量时间做 Lab。
往年学生的反馈大多是“难且爽,有很大帮助”。另外会让大三的原理课变简单。
本学期选课人数已经达到 190 人,这对老师和助教也是新的挑战。
但仍然欢迎感兴趣的同学选课或旁听。Post #4 ❤️ 4 likes