我正在尝试编写一个 mac os 程序来监视系统(类似于活动监视器)。我查看了 vm_stat 函数,当我运行它时,我得到了这个:
Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free: 438386.
Pages active: 236438.
Pages inactive: 113750.
Pages speculative: 34293.
Pages wired down: 225027.
"Translation faults": 11132566.
Pages copy-on-write: 319385.
Pages zero filled: 6618647.
Pages reactivated: 23071.
Pageins: 421804.
Pageouts: 153240.
Object cache: 14 hits of 24183 lookups (0% hit rate)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行活动监视器时,我得到了类似的信息:
Page Ins: 1.61gb (8.00kb/sec)
Page outs: 598.6 MB
Run Code Online (Sandbox Code Playgroud)
我有一个关于此的问题:为什么 vmstat 中的空闲页面如此之小(与活动监视器相比)
我知道这是一个常见的问题。我想知道从哪里开始。
在 windows server 2008 上运行 java,我们有 65GB 内存,它显示 25GB 空闲。(目前有几个人正在运行进程)。
systeminfo | grep -i memory
显示:
总物理内存:65, 536 MB 可用物理内存:26,512MB 虚拟内存:最大大小 69,630 MB 虚拟内存:可用 299 MB 虚拟内存:使用中:69、331 MB。
真的只是想知道我如何解决这个问题。
java -version
给我:
Error occured during initialization of VM
could not reserve enough space for object heap
更具体的问题:
java -version如果不指定 Xms 参数,java 命令(如)要使用多少内存?处理器使用 36 位物理地址和 32 位虚拟地址,页框大小为 4 KB。每个页表条目大小为 4 个字节。一个三级页表用于虚拟到物理地址的转换,其中虚拟地址的使用如下:
位 30 - 31 用于索引到第一级页表
位 21 - 29 用于索引到第二级页表
位 12 - 20 用于索引到第三级页表
位 0 - 11 用作偏移量页面内
寻址一级、二级和三级页表的页表项中的下一级页表(或页框)所需的位数分别为?
这是 GATE 2008 中提出的一个问题。
我的分析: 最大页框数 =(物理地址大小)/(页面大小)= 2^36 / 2^12 = 2^24。因此,24 位就足以索引第 3 级页表中的页码。现在我们必须找出第 3 级将有多少页表。它给出了 9 位用于索引到第 3 级页表的情况。所以第 3 级有 2^9 个页表。这意味着 2^32 个虚拟空间包含在 2^9 个页表中,因此每个页表的条目 = 2^32/2^9 = 2^23。因此,l2 页表条目中需要 23 位来索引第三级页表中特定页表的条目。从 L1 页表到 L2 中有 2^9 个页表,我们需要到达这些 2^9 个页表中的任何一个。所以在 L1 中需要 9 位。
这种分析不知何故似乎不正确。我很困惑。有人可以解释这些概念吗?
考虑以下代码片段
int i=10;
int main()
{
cout<<&i;
}
Run Code Online (Sandbox Code Playgroud)
一旦为程序生成了 exe,程序不同运行的输出是否相同?假设操作系统支持虚拟内存
编辑:问题特定于存储在数据段中的全局变量。由于这是第一个全局变量,地址应该相同还是不同?
我看到了这个问题—— “虚拟内存”和“交换空间”有什么区别?
这里提到虚拟内存 = RAM 空间 + 磁盘空间 - 进程可以使用。
那么虚拟内存的最大大小是多少?
Max(Virtual Memory) = 磁盘空间 + RAM 空间 - 操作系统空间(在 RAM 和磁盘上)?
我很困惑进程在使用虚拟内存时如何可能出现段错误。据我了解,“虚拟”内存允许进程访问所有可用内存,然后将其映射到“实际”硬件内存。通过这种转换,进程怎么可能尝试访问不允许访问的内存部分?
当条目从 TLB 中驱逐时,页表是否更新?如果是这样,为什么?页表中更新了哪些信息?我认为当被驱逐的页面干净时不需要更新页表。
类似地,在 TLB 中缓存(引入)页面时是否更新了页表?
operating-system cpu-architecture virtual-memory tlb page-tables
在我的应用程序中,我想为每个用户登录将用户设置保存在 plist 文件中,我编写了一个名为的类,该类CCUserSettings具有几乎相同的界面NSUserDefaults,它读取和写入与当前用户 ID 相关的 plist 文件。它有效,但性能不佳。每次用户来电[[CCUserSettings sharedUserSettings] synchronize],我写了NSMutableDictionary(这使用户设置)的plist文件,下面的代码显示synchronize中CCUserSettings忽略了一些琐碎的细节。
- (BOOL)synchronize {
BOOL r = [_settings writeToFile:_filePath atomically:YES];
return r;
}
Run Code Online (Sandbox Code Playgroud)
我想,NSUserDefaults当我们调用应该写入文件[[NSUserDefaults standardUserDefaults] synchronize],但它运行非常快,我写了一个演示测试,关键部分是下面,运行1000次[[NSUserDefaults standardUserDefaults] synchronize],并[[CCUserSettings sharedUserSettings] synchronize]在我的iPhone6,结果是0.45秒VS9.16秒。
NSDate *begin = [NSDate date];
for (NSInteger i = 0; i < 1000; ++i) {
[[NSUserDefaults standardUserDefaults] setBool:(i%2==1) forKey:@"key"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
NSDate *end = [NSDate date];
NSLog(@"synchronize …Run Code Online (Sandbox Code Playgroud) Windows 提供了 2 个不同的内存保护常量(例如VirtualProtect的第三个参数),它们的行为似乎相似:PAGE_EXECUTE和PAGE_EXECUTE_READ。
它似乎PAGE_EXECUTE应该是仅执行权限(没有读取)。但是,没有读取的执行权限没有多大意义,因为 CPU 需要先从内存中读取指令,然后才能解码和执行它们。此外,我在这里读到确实PAGE_EXECUTE内存也允许从中读取。
那么.. 为什么有两个不同的常量,它们之间有什么区别?为什么我应该更喜欢一个?
Kerasfit_generator非常慢。GPU 在训练中不会经常使用,有时它的使用率会下降到 0%。即使在 4 个工人和multiproceesing=True.
此外,脚本的进程请求过多的虚拟内存并且处于 D 状态,不间断睡眠(通常为 IO)。
我已经尝试了不同的组合,max_queue_size但没有奏效。
截图GPU 使用情况
进程虚拟内存和状态的屏幕截图
硬件信息 GPU = Titan XP 12Gb
数据生成器类代码
import numpy as np
import keras
import conf
class DataGenerator(keras.utils.Sequence):
'Generates data for Keras'
def __init__(self, list_IDs, labels, batch_size=32, dim=(conf.max_file, 128),
n_classes=10, shuffle=True):
'Initialization'
self.dim = dim
self.batch_size = batch_size
self.labels = labels
self.list_IDs = list_IDs
self.n_classes = n_classes
self.shuffle = shuffle
self.on_epoch_end()
def __len__(self):
'Denotes the number of batches …Run Code Online (Sandbox Code Playgroud)