CPU如何从内存中读取数据?缓存如何发挥重要作用

时间:2017-08-29 05:55:04

标签: c memory memory-management memory-leaks memcached

我编写了一段代码,我将内存分配给变量Bextradata(它是使用malloc分配的结构的成员)

$error = array();
foreach($videos as $ip){
    $sql = "INSERT INTO hindisongs (S.No) VALUES ('$ip')";
    mysqli_query($con,$sql);
    if(!mysqli_query($con,$sql)){
         $error[] = $ip;
    }
}

var_dump($error);

后来尝试在一些其他文件中读取此变量只是一次。所以这个变量将如何从内存中读取。它会将此变量放在缓存中,还是从主内存中读取它。

先谢谢

1 个答案:

答案 0 :(得分:1)

在了解CPU的工作原理之前,您需要了解一些术语。 CPU由ALU(用于算术和逻辑运算),控制单元和一堆寄存器组成。 CPU中的寄存器数量取决于架构并且各不相同。存在的寄存器类型是通用寄存器,专用寄存器指令指针和其他一些寄存器。你可以阅读它们。现在,当我们通常说32位处理器或64位处理器时,我们指的是CPU寄存器的大小。

现在让我们看看以下代码:

int *ptr = NULL;
printf(*ptr);

加载上述程序时,它的指令存储在主存储器中。程序中的每条指令都存储在主存储器中的某个位置。每个位置都有一个特定的大小(取决于架构,但我们假设它是一个字节)。每个位置都有一个地址。 RAM中特定位置的地址大小等于指令指针的大小。在64位系统中,指令指针的大小为64位。这意味着它可以解决最多2 ^ 64-1个位置。由于1个位置通常是1个字节,因此理论上64位系统的总RAM可能是16艾字节。 (对于32位系统,它是2 ^ 32-1~4 GB)

现在让我们看一下第一条指令a = 10.这是一个存储操作。计算机可以执行以下基本操作 - 添加,乘法,减法,除法,存储,跳转等。您可以阅读任何处理器的指令集,有关详细信息。指令集再次因系统而异。返回,当程序加载到内存时,指令指针指向第一个地址或基址。在这种情况下,它是a = 10.该位置的内容被带到CPU的通用寄存器之一。由此得知ALU,其理解这是存储操作(添加了附加位,其将其表示为存储操作)。然后,ALU将其存储在RAM中的一个位置以及缓存中。将其存储在缓存中的决定取决于编译器和称为硬件预取的概念。当编译器解析程序时,它会查看常用变量并使它们能够存储在缓存中。在这种情况下,我们可以看到变量'a'将再次被使用,因此编译器会向程序添加额外的中间指令,以便将其存储在缓存中。为什么?为了更快的访问。 (在速度方面总是记住寄存器>缓存> RAM>光盘)

执行第一条指令后,指令指针递增,现在指向第二条指令,即b = 20.同样的情况也是如此。

第三个是a = a + b。为此,实际上有四个操作(如果您查看程序集级别),即1)获取a,2)获取b,3)将a和b,4)存储结果添加到a中。现在,由于变量a和b存在于缓存中,因此它们来自这些位置。然后添加它们,结果存储回。

我希望你明白它是如何运作的。

此外,您需要知道当程序加载到主内存中时,它占用一定的空间。此空间称为段。它有一个基地址和一个最终地址。您可以将基址作为第一条指令,将最终地址作为最后一条指令。如果从您的程序中尝试取消引用指向该段外部的指针,则会出现着名的错误 - 分段错误。例如:

{{1}}

这会给我一个分段错误,因为我试图取消引用一个存储一个值为NULL的地址的指针,因为NULL不在段中,它会产生一个seg错误。