size_t即使数组的大小不足以超过int的大小,我在索引数组时也需要始终使用它吗?
这不是我何时应该使用的问题size_t。我只想知道,例如,一个程序是否具有2GB的可用内存(所有这些字段都可以由int32索引),但是此内存(虚拟内存)已分配给“字段” 14GB-计算机的16GB内存。
在这种情况下,如果我使用int32而不是size_t(或unsigned long int)来索引内存,它将总是失败吗?
也许问题更多是关于虚拟内存,而不是指针。
在具有16GB RAM的Windows Server 2008 x64上运行.NET应用程序.此应用程序需要获取和分析大量数据(大约64GB),并将其全部保存在内存中.
我期待看到的:流程大小扩展到16GB到64GB.Windows根据需要使用虚拟内存将额外数据分页到磁盘或从磁盘分页.这是经典的虚拟内存使用案例.
我实际看到的:进程大小仅限于物理内存量(16GB).应用程序将99.8%的时间花在垃圾收集器上.
为什么我们的应用程序无法使用虚拟内存?这是.NET垃圾收集器配置中的问题,还是Windows x64虚拟内存管理器本身的问题?我该怎么做才能让我们的应用程序使用虚拟内存而不仅限于物理内存?
谢谢.
- 布莱恩
更新:我写了一个非常小的程序,表现出相同的行为:
using System;
namespace GCTest
{
class Program
{
static void Main()
{
byte[][] arrays = new byte[100000000][];
for (int i = 0; i < arrays.Length; ++i)
{
arrays[i] = new byte[320];
if (i % 100000 == 0)
{
Console.WriteLine("{0} arrays allocated", i);
System.Threading.Thread.Sleep(100);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想尝试它,请确保为x64构建.您可能需要稍微修改常量以强调您的系统.我看到的行为是,当进程接近16GB的大小时,进程陷入困境.没有抛出错误消息或异常.性能监视器报告GC中的CPU时间百分比接近100%.
这不是不可接受的吗?虚拟内存系统在哪里?
在Linux下的C/C++中,我需要分配一个大的(几千兆字节)内存块,以便存储连接到以太网端口的传感器的实时数据和大约110MB/s的流数据.我想分配尽可能多的内存,以最大化我可以存储的数据序列的长度.但是,我还需要确保不会进行磁盘交换,因为产生的延迟和磁盘访问带宽有限会导致传感器(非常有限)的缓冲区溢出.
确定要分配多少内存的最佳方法是什么?我仅限于分配比报告的可用内存稍小的块,还是可以更直接地与linux虚拟内存管理器连接?
我已经了解到int操作系统(Linux),MMU可以通过页表数据结构将VA(虚拟地址)转换为PA(物理地址),看起来页面是VM管理的最小数据单元.但块怎么样?它是磁盘和系统内存之间传输的最小数据单元吗?希望有人能解决我长期困扰我的问题,谢谢你们!或者你可以给我一些关于这个主题的参考资料,再次感谢.
流程和流程图像之间有什么区别?
一个包含什么,另一个没有?有什么区别?
这都在过程控制结构和内存中的进程位置的上下文中.
在"低级编程:英特尔®64架构上的C,汇编和程序执行"一书中,我读到:
每个虚拟64位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有48位宽; 它被符号扩展为64位规范地址.它的特点是它的17个左位是相等的.如果不满足条件,则在使用时立即拒绝该地址.然后借助特殊表将48位虚拟地址转换为52位物理地址.
为什么虚拟地址和物理地址之间的差异为4位?
assembly memory-management virtual-memory memory-address mmu
我正在阅读"现代操作系统"一书.我对"页面大小"感到困惑.
在这本书中,作者说,
传入的16位虚拟地址分为4位页码和12位偏移量.对于页码,有4位,我们可以有16页,并且对于偏移有12位,我们可以寻址页面中的所有4096 个字节.
为什么4096字节?使用12位,我们可以在页面内处理4096个条目,这是正确的.但是,一个条目是一个地址(在这种情况下,地址大小= 16位).所以我认为我们可以解决4096(条目)*16(位)= 4096(条目)*2(字节)= 8KB,但为什么书中说我们可以解决4096(字节)?
提前致谢!:)
operating-system memory-management virtual-memory memory-mapping
我已经阅读了有关此参数的文档,但区别非常大!启用后,简单程序(见下文)的内存使用量约为7 GB,禁用时,报告的使用量约为160 KB.
top也显示大约7 GB,这有点证实了结果pages-as-heap=yes.
(我有一个理论,但我不相信它会解释这么大的差异,所以 - 请求一些帮助).
特别困扰我的是,大部分报告的内存使用情况都被使用std::string,而what?从未打印过(意思是 - 实际容量非常小).
我需要pages-as-heap=yes在分析我的应用程序时使用,我只是想知道如何避免"误报"
代码段:
#include <iostream>
#include <thread>
#include <vector>
#include <chrono>
void run()
{
while (true)
{
std::string s;
s += "aaaaa";
s += "aaaaaaaaaaaaaaa";
s += "bbbbbbbbbb";
s += "cccccccccccccccccccccccccccccccccccccccccccccccccc";
if (s.capacity() > 1024) std::cout << "what?" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
int main()
{
std::vector<std::thread> workers;
for( unsigned i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我希望一起使用System.INotify和System.IO.MMap来监视文件修改,然后快速执行差异以通过网络发送补丁.但是,在System.IO.MMap的文档中,有一些关于引用透明性的警告:
文件说明
如果您知道自己是唯一的用户,那么mmap文件是安全的.否则参考透明度可能会或可能不会受到影响.遗憾的是,语义在操作系统之间存在很大差异.
MMap返回的值,IO ByteString当我使用这个值时,putStr我每次都期望得到不同的结果吗?我假设作者意味着值可能会在IO操作期间发生变化,例如putStr崩溃?
编辑开始:想想看,我想这个问题的答案有点明显......如果在取消装箱后任何时候价值发生变化都会有问题.
do
v <- mappedValue :: IO ByteString
putStr v
putStr v -- Expects the same value of v everywhere
Run Code Online (Sandbox Code Playgroud)
END-OF-EDIT
难道不可能在映射区域或文件上获得某种锁定吗?
或者,是否可以编写一个copy :: IO ByteString -> IO ByteString以安全的方式获取当前状态文件快照的函数?
我有一个应用程序,我需要大约 850 MB 的连续内存并以随机方式访问它。有人建议我分配一个 1 GB 的大页面,以便它始终在 TLB 中。我编写了一个带有顺序/随机访问的演示来测量小(在我的情况下为 4 KB)与大(1 GB)页面的性能:
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <time.h>
#include <unistd.h>
#define MAP_HUGE_2MB (21 << MAP_HUGE_SHIFT) // Aren't used in this example.
#define MAP_HUGE_1GB (30 << MAP_HUGE_SHIFT)
#define MESSINESS_LEVEL 512 // Poisons caches if LRU policy is used.
#define RUN_TESTS 25
void print_usage() {
printf("Usage: ./program small|huge1gb sequential|random\n");
}
int main(int argc, char *argv[]) {
if (argc != 3 && argc != 4) {
print_usage(); …Run Code Online (Sandbox Code Playgroud)