首页 > 系统相关 >虚拟内存对 OI 的影响

虚拟内存对 OI 的影响

时间:2024-10-25 17:49:12浏览次数:1  
标签:std main OI int vec freopen sizetest 影响 虚拟内存

假想你写了这么四段代码:

#include <vector>
#include <bits/stdc++.h>
using namespace std;
std::vector<int> vec;
//int a[100000010];
int main() { freopen("a.out", "w", stdout), cout << 1 << endl;}//, vec.resize(1e8); }
#include <vector>
#include <bits/stdc++.h>
using namespace std;
std::vector<int> vec;
int a[100000010];
int main() { freopen("a.out", "w", stdout), cout << 1 << endl;}//, vec.resize(1e8); }
#include <vector>
#include <bits/stdc++.h>
using namespace std;
std::vector<int> vec;
//int a[100000010];
int main() { freopen("a.out", "w", stdout), vec.resize(1e8),cout << 1 << endl ; }
#include <vector>
#include <bits/stdc++.h>
using namespace std;
std::vector<int> vec;
int a[100000010];
int main() { freopen("a.out", "w", stdout), vec.resize(1e8), cout << 1 << endl; }

已知 \(10^8\) 个 int 需要占用内存 400M,那么就是说,在内存限制 600M 的情况下,前三个程序都能正确输出 1,第四个程序因为有 400M 的数组和 400M 的 vector 而因 MLE 致死。使用 NOI Linux 2.0 的 arbiter_local 进行测评,结果也确实如此。

但实际上在本地运行第四段程序的时候,无法发现使用内存超过 600M 的事实。一般有三种手段检查内存,第一种是用全局变量结尾和开头两个变量地址相减的办法测算空间(这样会测少(标准库自身会使用一部分静态空间),并且这种写法是 UB)。是第二种是使用 GNU size 测量静态空间,第三种是使用 GNU time 测量最大常驻内存大小。使用后两种方法,可以发现都不超过 400M:

minni@LAPTOP-VTBPQCQP:~/test$ make sizetest
g++ sizetest.cpp -o sizetest -O2 -g -DNF -DLOCAL -fsanitize=undefined,address -Wall -std=c++14
sizetest.cpp: In function ‘int main()’:
sizetest.cpp:6:21: warning: ignoring return value of ‘FILE* freopen(const char*, const char*, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
    6 | int main() { freopen("a.out", "w", stdout), vec.resize(1e8), cout << 1 << endl; }
      |              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
minni@LAPTOP-VTBPQCQP:~/test$ cat sizetest.cpp
#include <vector>
#include <bits/stdc++.h>
using namespace std;
std::vector<int> vec;
int a[100000010];
int main() { freopen("a.out", "w", stdout), vec.resize(1e8), cout << 1 << endl; }
minni@LAPTOP-VTBPQCQP:~/test$ size sizetest
   text    data     bss     dec     hex filename
  51392   29880 400001544       400082816       17d8c780        sizetest
minni@LAPTOP-VTBPQCQP:~/test$ \time ./sizetest
0.12user 0.09system 0:00.22elapsed 98%CPU (0avgtext+0avgdata 402636maxresident)k
0inputs+8outputs (0major+15370minor)pagefaults 0swaps

而事实上他会使用到 800M,我们需要引入虚拟内存的概念:https://www.pengrl.com/p/21292/。测量虚拟内存峰值使用 system("grep VmPeak /proc/$PPID/status")(程序末尾),这是 Arbiter 所测量的空间大小。

为了能在本地发现此问题,可以使用 ulimit -v 限制虚拟内存大小,如这里限制为 600M 就写

ulimit -v 600000

注意单位是 KB,这样程序就能正常报错了:

minni@LAPTOP-VTBPQCQP:~/test$ g++ sizetest.cpp -o sizetest -O2 -g -DNF -DLOCAL -Wall -std=c++14 && ./sizetest
sizetest.cpp: In function ‘int main()’:
sizetest.cpp:6:21: warning: ignoring return value of ‘FILE* freopen(const char*, const char*, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
    6 | int main() { freopen("a.out", "w", stdout), vec.resize(1e8), cout << 1 << endl; }
      |              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
已中止 (核心已转储)

对照实验:删去 vectorint[100000010] 的其中一个,程序都不会报错,具体的测试可以自己做。

以上,警醒我们限制虚拟内存以防止最终评测的 MLE。可使用 ulimit -v <实际空间限制> 解决该问题。

ref:https://www.luogu.com/article/epn32t2i

标签:std,main,OI,int,vec,freopen,sizetest,影响,虚拟内存
From: https://www.cnblogs.com/caijianhong/p/18502933

相关文章

  • 指南:NOI Linux 2.0 的使用
    0前言本文主要说明NOILinux2.0的基础使用方法,主要测试代码在较为严格的编译环境下能否通过,避免编译错误,适用于主要以Windows为操作系统,辅以NOILinux2.0虚拟机的设备。以NOILinux2.0为操作系统的设备操作相对复杂,且SN现在也没有该种设备,因此只对NOILinux2.0......
  • FunAudioLLM/SenseVoice
    Skiptocontent NavigationMenu Product Solutions Resources OpenSource Enterprise Pricing  SigninSignup  FunAudioLLM/SenseVoicePublicNotificationsFork 292 Star 3.2k CodeIssues64Pullr......
  • mysql之 关联表(left join | right join | inner join | union)
    一.首先给出两张表user表:用户基本信息表score表:分数表(学生在哪一天,哪一科目,所考分数)二.分别解释leftjoin,rightjoin,innerjoin,union1.leftjoin 原理userleftjoinscore=以user表为准,去查询所有user表成员的分数select*fromuserleftjoinscoreonuser.......
  • 其实在构建神经网络或训练神经网络的时候,还有另一个隐藏的前提假设,那就是当你选择sigm
    最大熵原理确实与选择激活函数(如sigmoid或softmax)有关。以下是一些相关的要点:最大熵原理:最大熵原理是一种统计推断的方法,旨在在已知信息的情况下,选择最不偏见的概率分布。换句话说,当我们对某个系统的知识有限时,选择熵最大的分布可以避免引入不必要的假设。激活函数与概率分......
  • 大批卖家将受影响!DHL宣布上调4.9%运费
    近日,全球快递业巨头DHL发布通知,自2025年1月1日起,DHL在新西兰、孟加拉国、斯里兰卡、文莱的运费将有较大幅度上涨,平均增长4.9%,泰国运费也将上调但未知具体涨幅。此前,DHL宣布日本地区的运费也将会在同一时间上涨,涨幅高达6.9%。亚洲地区一直是涨幅较高的地区。DHL于今年9月15......
  • FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
    ijkplayer是一款由B站研发的移动端国产播放器,它基于FFmpeg3.4版本,同时兼容Android和iOS两大移动操作系统。ijkplayer的源码托管地址为https://github.com/bilibili/ijkplayer,截止2024年9月15日,ijkplayer获得3.24万星标数,以及0.81万个分支数,而这还是ijkplayer停止更新6年之后的数据,......
  • Android 的 ART 有何作用
    摘要:安卓运行时环境(ART)主要负责1、应用程序的编译和执行、2、系统性能优化、3、应用兼容性和向后兼容的维护。作为应用程序的执行基地,它通过预编译增强了应用程序的效率,同时还负责内存管理、垃圾回收等关键系统功能,确保了用户享受流畅稳定的使用体验。其中,系统性能优化是ART的显著......
  • Android操作系统包含哪些
    Android操作系统主要包括五大组成部分:1、Linux内核;2、原生库与Android运行时,包括用于数据存储、图形渲染和硬件访问的各种库;3、应用框架,提供应用开发的API和服务;4、系统应用,如电话、短信和浏览器等;5、用户界面,包括安卓的图形用户界面元素。在Linux内核中,尤其需要注意的是它提供了......
  • Android 9.0 修改WLAN热点名称为MAC地址后四位
    这个需求主要是读取mac地址,mac地址一般是用写号工具写入到NVRAM,所以需要从NVRAM读取准确的地址。导入nvram操作用到的库:frameworks/opt/net/wifi/service/Android.mkLOCAL_STATIC_JAVA_LIBRARIES:=\vendor.mediatek.hardware.nvram-V1.0-java读取wifimac地址......
  • 【Git】TortoiseGit(小乌龟)配置SSH和使用
    Gitee提供了基于SSH协议的Git服务,在使用SSH协议访问仓库之前,需要先配置好账户/仓库的SSH公钥。(有HTTPS协议和SSH协议SSH协议好像更安全)预装软件git(Windows版)和TortoiseGit(小乌龟)TortoiseGit安装地址:Download–TortoiseGit–WindowsShellInterfacetoGit安装中文......