标签: virtual-memory

Redis - 默认阻塞虚拟机

阻塞虚拟机的性能总体上更好,因为在同步、线程生成和恢复阻塞的客户端等待值方面没有时间损失。因此,如果您愿意偶尔接受较高的延迟,那么阻止虚拟机可能是一个不错的选择。特别是如果交换很少发生并且大多数经常访问的数据恰好适合您的内存。

这是 Redis 的默认模式(我相信现在 VM 在 2.6 中已弃用),让操作系统来处理分页(如果/需要时)。我的理解是正确的,启动/启动时需要一些时间才能变得“热”。当在具有 16GB 数据集的 1GB RAM 节点上工作时,Redis 是否会在启动时尝试将其全部加载到虚拟内存中,从而立即调出 90% 以上,并且只有在大量使用之后,上述陈述才成立?

virtual-memory redis

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

二级分页中的有效寻址时间

我目前正在操作系统上的一些项目上工作,我知道如何在单级分页中找到 EAT

EAT = (MAT+TLB-AT)*a+(2*MAT+TLB-AT)*(1-a)

在哪里

MAT is memory access time, 
TLB-AT is TLB hit time
a is hit ratio
Run Code Online (Sandbox Code Playgroud)

我试图分两个级别找出EAT,如果 TLB 未命中或四次,它是否会访问内存 3 次。

paging caching operating-system virtual-memory tlb

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

在上下文切换上刷新 TLB

这可能取决于操作系统,但一般来说,据我所知,当发生页面错误(所需的页面不在主内存中)时,操作系统将指示CPU从磁盘读取页面,我想知道操作系统是否分派到另一个处理磁盘 I/O 时?如果确实如此,那么上下文切换时将完全刷新 TLB,对吗?

operating-system context-switch virtual-memory tlb page-tables

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

为什么execve函数映射私有区域?

我正在阅读一本教科书,其中将 eexecve函数描述为:

假设当前进程中运行的程序进行如下调用:

execve("a.out", NULL, NULL);

execve 函数在当前进程中加载​​并运行包含在可执行目标文件 a.out 中的程序,有效地用 a.out 程序替换当前程序。加载和运行a.out需要以下步骤

  1. 删除现有用户区域
  2. 映射私人区域。为新程序的代码、数据、bss 和堆栈区域创建新的区域结构。所有这些新区域都是私有的写时复制

在此处输入图片说明

  1. 映射共享区域
  2. 设置程序计数器

我对第 2 步有点困惑,所以假设fork()分叉一个子进程并让子进程运行execve一个新程序,那么为什么execve将子进程的新区域映射为私有的写时复制?父进程不会与子进程共享内存,因为父子进程映射到不同的对象,为什么子进程害怕其他进程可能会写一些东西来影响它?

c linux virtual-memory

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

究竟什么是分页?OSDEV

我正在尝试编写自己的操作系统,但到了需要设置分页的地步。我写了一些似乎有效的代码,但我意识到我不明白分页是如何工作的。现在我将尝试解释我是如何理解事物的,我将有一些问题!

所以据我所知,分页是一种将地址映射到其他地址的方式,以便每个应用程序都可以看到完整的地址空间(?)。有一种叫做页目录的东西,它存储 1024 个 4 字节的条目,每个条目包含一个指向页表的指针,该页表也有 1024 个条目。页表的每个条目都有一个指向 4 KiB 物理地址块开头的指针。这意味着 4096 字节 * 页表中的 1024 个条目 * 页目录中的 1024 个条目 = 可以映射的 4 GiB 内存。例如,我可以将应用程序加载到 0x80000000 并将该地址映射到 0x00000000,应用程序将看到其地址从 0x00000000 开始。

问题:

  1. 每个应用程序都有自己的页面目录还是只有一个页面目录,应用程序如何访问页面以及它们具体做什么?
  2. 如果应用程序获得 4 KiB 的空间块或一页,他们应该如何查看完整的地址空间?
  3. 你如何将页面写入硬盘驱动器?
  4. 我们应该如何分配页面供应用程序使用?

paging x86 osdev virtual-memory page-tables

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

页表项的大小

页表项的大小是否取决于进程的逻辑/虚拟内存空间的总大小?

paging operating-system cpu-architecture virtual-memory page-tables

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

既然有了虚拟内存,为什么还需要内存保护呢?

通过内存保护,我的意思是以下程序将在许多机器上抛出运行时异常:

#include <iostream>

int main() {
    int* my_int = new int[12];
    std::cout << my_int[20000];
    delete[] my_int;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序给出以下错误:

Exception thrown at 0x00007FF7A467101A in myprogram.exe: 0xC0000005: Access violation reading location 0x000002794CA635C0.
Run Code Online (Sandbox Code Playgroud)

由于每个进程都有自己的虚拟内存,因此其他程序已经受到保护,免受我的代码中的访问冲突的影响。在我看来,正确的程序会付出运行时成本,因为不正确的程序可能会访问未分配的内存。

为什么计算机在调试模式之外还要费力地防止访问违规?

编辑:这个问题的一个很好的初步答案是“这些检查通常是在硬件中完成的”。接下来的问题是“如果不需要在访问冲突上引发异常,是否可以制造出更快的硬件? ”由于 CPU 硬件优化的大部分内容都与空间有关,我认为答案是“肯定是的,但不是”足够值得了。” 我们在硬件上为访问违规检查支付了多少成本?

c++ memory-management allocation virtual-memory access-violation

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

"32位操作系统","32位处理器":这些术语究竟是什么意思?

"32位操作系统","32位处理器"的确切含义是什么?

  • 它会影响地址总线的大小吗?
  • 它是否会影响可以生成的虚拟地址数量?
  • 它如何影响寄存器大小意味着寄存器大小?
  • 它对虚拟内存/内存管理有何影响

我是这个领域的初学者; 如果你有任何合适的文件,请指出我.

谢谢.

operating-system memory-management computer-architecture virtual-memory

0
推荐指数
1
解决办法
2083
查看次数

从另一个应用程序访问(读/写)虚拟内存进程

我有简单的程序:

#include <stdio.h>

int a = 5;

int
main(void)
{
    while(1)
    {
        int i;
        sleep(1);
        printf("%p %i\n", &a, a);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出(Ubuntu x64):

0x601048 5
0x601048 5
0x601048 5
0x601048 5
Run Code Online (Sandbox Code Playgroud)

我正在学习C中的指针,我已经知道你可以用来memcpy在过程的虚拟内存中的任何地方(几乎)编写数据.但是,是否可以通过使用另一个应用程序(当然使用自己的虚拟内存)来修改int a放置在0x601048地址的值?这该怎么做?我只对C的解决方案感兴趣

c linux virtual-memory

0
推荐指数
1
解决办法
1853
查看次数

是否可以将套接字映射到虚拟内存?

我正在寻找类似于内存映射文件的东西.它会使虚拟内存与字节的字节输出匹配,并在没有收到新字节时阻塞.这可能吗?

我正在寻找专门针对Rust的解决方案,但如果有人知道另一种语言具有这样的功能,我可能能够与它进行交互.

sockets io virtual-memory rust

0
推荐指数
1
解决办法
545
查看次数