我知道一般理论,但我不能适应细节.
我知道程序驻留在计算机的辅助内存中.程序开始执行后,它将完全复制到RAM中.然后处理器一次检索一些指令(它取决于总线的大小),将它们放入寄存器并执行它们.
我也知道计算机程序使用两种内存:堆栈和堆,它们也是计算机主存储器的一部分.堆栈用于非动态内存,堆用于动态内存(例如,与newC++中的运算符相关的所有内容)
我无法理解的是这两件事是如何联系起来的.用于执行指令的堆栈在什么时候?指令从RAM,堆栈到寄存器?
我很好奇,为什么Sun决定以JVM堆栈为基础,Google决定以DalvikVM注册为基础?
我想JVM不能真正假设目标平台上有一定数量的寄存器,因为它应该是平台无关的.因此,它只是将寄存器分配等推迟到JIT编译器.(如我错了请纠正我.)
所以Android人员认为,"嘿,那效率很低,让我们马上去找一个基于寄存器的vm ......"?但等等,有多个不同的Android设备,Dalvik的目标是多少个寄存器?Dalvik操作码是否针对一定数量的寄存器进行了硬编码?
目前市场上所有Android设备的寄存器数量是否相同?或者,是否在dex-loading期间执行了寄存器重新分配?这一切如何结合在一起?
jvm computer-architecture dalvik cpu-registers vm-implementation
我一直在读句子
不要依赖大小为8位的1字节
使用
CHAR_BIT而不是8作为常量来转换位和字节
等等.今天有什么现实生活系统,这是真的吗? (我不确定C和C++之间是否存在差异,或者它是否与语言无关.如果需要,请重新加入.)
正如comp.lang.c常见问题所述,有一些架构,其中空指针不是所有位零.所以问题是实际检查以下结构:
void* p = get_some_pointer();
if (!p)
    return;
我是否p与机器相关的空指针进行比较或者我是否p与算术零进行比较?
我应该写
void* p = get_some_pointer();
if (NULL == p)
    return;
相反,为这样的架构做好准备还是仅仅是我的偏执?
有人知道在perf stat结果中stalled -cycles-frontend和stalled-cycles-backend是什么意思吗?我在互联网上搜索但没有找到答案.谢谢
$ sudo perf stat ls                     
Performance counter stats for 'ls':
      0.602144 task-clock                #    0.762 CPUs utilized          
             0 context-switches          #    0.000 K/sec                  
             0 CPU-migrations            #    0.000 K/sec                  
           236 page-faults               #    0.392 M/sec                  
        768956 cycles                    #    1.277 GHz                    
        962999 stalled-cycles-frontend   #  125.23% frontend cycles idle   
        634360 stalled-cycles-backend    #   82.50% backend  cycles idle
        890060 instructions              #    1.16  insns per cycle        
                                         #    1.08  stalled cycles per insn
        179378 branches                  #  297.899 M/sec                  
          9362 branch-misses             #    5.22% of all …linux optimization performance cpu-architecture computer-architecture
从以前的问题,在这个论坛上,我了解到,在大多数存储系统中,L1缓存L2缓存的子集,是指从L2删除任何条目也从L1删除.
所以现在我的问题是如何在L1缓存中为L2缓存中的条目确定相应的条目.存储在L2条目中的唯一信息是标签信息.根据此标记信息,如果我重新创建addr,如果L1和L2缓存的行大小不相同,它可能会跨越L1缓存中的多行.
该体系结构是否真的打扰了两条线路,或者它只是保持具有相同线路大小的L1和L2缓存.
我知道这是一个政策决定,但我想知道常用的技术.
为了防止错误共享,我想将数组的每个元素对齐到缓存行.所以首先我需要知道缓存行的大小,因此我为每个元素分配了大量的字节.其次,我希望数组的开始与高速缓存行对齐.
我使用的是Linux和8核x86平台.首先,我如何找到缓存行大小.其次,如何与C中的缓存行对齐.我正在使用gcc编译器.
因此,假设高速缓存行大小为64,结构将遵循.
element[0] occupies bytes 0-63
element[1] occupies bytes 64-127
element[2] occupies bytes 128-191
等等,当然假设0-63与高速缓存行对齐.
我试图在我的机器(1 Gb RAM 160 Gb HD Windows平台)上计算出最大程度上可以使用多少内存.
我读到malloc可以分配的最大内存仅限于物理内存(堆上).
此外,当程序超过内存消耗到某个级别时,计算机将停止工作,因为其他应用程序无法获得所需的足够内存.
所以要确认一下,我在C写了一个小程序:
int main(){  
    int *p;
    while(1){
        p=(int *)malloc(4);
        if(!p)break;
    }   
}
我希望有一段时间内存分配失败并且循环会中断,但是我的计算机挂起,因为它是一个无限循环.
我等了大约一个小时,最后我不得不强行关闭电脑.
一些问题:
c malloc operating-system memory-management computer-architecture
从我迄今为止发现的内容可以清楚地看出,针对64位架构编译的程序使用的内存量是其32位替代品的两倍 - https://superuser.com/questions/56540/32-bit-vs- 64位系统.
这是否意味着为64位编译的代码平均使用的RAM是32位版本的两倍?
我不知何故怀疑它,但我想知道真正的开销是什么.我想,小类型,如short,byte与char相同大小的64位架构?我不是很确定byte.鉴于许多应用程序使用大型字符串(如Web浏览器等),char在大多数实现中主要由数组组成,因此开销可能不会太大.
因此,即使数字类型在64位上更大int且long更大,是否会对RAM的使用产生重大影响?
我试图弄清楚"单词"是什么意思,我查看了维基,定义含糊不清.所以我的问题是什么是"字大小"?它是数据总线,地址总线的长度吗?