小编Rag*_*thy的帖子

当发生中断时,管道中的指令会发生什么?

假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.

(这些样本说明不准确,但我相信这一点会被理解)

在第五个时钟周期,这些指令将在管道中,如下所示.

添加a,b,c [IF ID EX MEM WB]

添加a,b,d [IF ID EX MEM]

添加a,b,e [IF ID EX]

添加a,b,f [IF ID]

现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?

computer-architecture

22
推荐指数
1
解决办法
1万
查看次数

Bounds检查64位硬件

我正在hacks.mozilla.org上阅读64位Firefox版本的博客.

作者说:

对于asm.js代码,增加的地址空间还允许我们使用硬件内存保护来安全地从asm.js堆访问中删除边界检查.收益非常显着:asmjs-apps上的8%-17%- * - arewefastyet.com上报告的吞吐量测试.

我试图了解64位硬件如何对C/C++进行自动边界检查(假设编译器支持硬件).我在SO中找不到任何答案.我找到了一篇关于这个主题的技术论文,但我无法理解这是怎么做到的.

有人可以在边界检查中解释64位硬件辅助吗?

c c++ x86-64 sandbox virtual-memory

18
推荐指数
1
解决办法
548
查看次数

为什么64位计算机上存在内存碎片问题?

在32位机器中,每个进程获得4GB虚拟空间.在这种情况下,人们可能会担心我们可能会因为碎片而面临麻烦.但是在64位机器的情况下,我们理论上有一个巨大的可寻址虚拟内存,那么为什么内存碎片仍然是一个问题(如果是)在64位机器上?

c memory-management memory-fragmentation

8
推荐指数
1
解决办法
1349
查看次数

锁中的唤醒/等待竞赛?

我正在阅读 Remzi 教授的 OSTEP 书 http://pages.cs.wisc.edu/~remzi/OSTEP/

我只能部分理解以下代码如何导致唤醒/等待竞争条件。(代码取自书籍章节。http: //pages.cs.wisc.edu/~remzi/OSTEP/threads-locks.pdf

void lock(lock_t *m) {
    while (TestAndSet(&m->guard, 1) == 1); //acquire guard lock by spinning
        if (m->flag == 0) {
            m->flag = 1; // lock is acquired
            m->guard = 0;
        } else {
           queue_add(m->q, gettid());
           m->guard = 0;
           park();  
        }
    }
}

void unlock(lock_t *m) {
    while (TestAndSet(&m->guard, 1) == 1); //acquire guard lock by spinning
        if (queue_empty(m->q))
            m->flag = 0; // let go of lock; no one wants it
        else
            unpark(queue_remove(m->q)); // …
Run Code Online (Sandbox Code Playgroud)

multithreading operating-system locks

6
推荐指数
1
解决办法
1162
查看次数