我正在尝试编写一个只使用所有可用物理内存的程序(即任务管理器显示100%的RAM利用率)。我写了以下内容但是虽然它分配了大量的内存(我的系统大约58GB),所有这些似乎都转到了交换文件或其他东西,而任务管理器仍然报告了大量可用的物理内存。
class Program
{
static void Main(string[] args)
{
var memoryBlocks = new List<byte[]>();
var chunk = 10000000;
while (chunk > 100)
{
try
{
memoryBlocks.Add(new byte[chunk]);
Console.WriteLine("Using {0}MB", memoryBlocks.Sum(b => (float)b.Length) / 1000000);
}
catch (OutOfMemoryException)
{
chunk /= 10;
}
}
Console.ReadKey();
}
}
答案 0 :(得分:1)
如果你在64位系统上运行,你可以使用AllocateUserPhysicalPages
函数分配物理内存
来自文档:
AllocateUserPhysicalPages函数用于分配物理内存,以后可以在进程的虚拟地址空间内进行映射。必须在调用者的令牌中启用SeLockMemoryPrivilege特权,否则该函数将失败并显示ERROR_PRIVILEGE_NOT_HELD。有关更多信息,请参阅权限常量。 此功能分配的内存必须实际存在于系统中。分配内存后,它将被锁定,并且不可用于虚拟内存管理系统的其余部分。
有关更多信息,请参阅: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366528%28v=vs.85%29.aspx
答案 1 :(得分:0)
嗯......这是我为MD5暴力破解的脚本,强制在一小时左右的时间内最大化RAM ......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace csharp
{
class Program
{
public static string[] letters = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
static void Main(string[] args)
{
//string mg = MD5Hash("john");
bool inp = false;
string hash;
while (!inp) {
Console.WriteLine("Please input the hash you're trying to bruteforce...");
hash = Console.ReadLine();
if (hash.Length == 32) {
inp = true;
Console.WriteLine("Cracked! There you go: " + startProcess(hash));
Console.ReadLine();
}
}
}
public static string startProcess(string hsh) {
bool solved = false;
string track = letters[0];
string ltrack = letters[letters.Length - 1];
while (!solved) {
//Console.WriteLine(track); // remove this line for debug
track = setLCharPos(track, ltrack);
if (MD5Hash(track) == hsh) {
solved = true;
return track;
}
} return track;
}
public static string setLCharPos(string ttr, string ltr) {
if (ttr == "") return letters[0];
if (ttr[ttr.Length - 1].ToString() != ltr) {
return ttr.Substring(0, ttr.Length - 1) + letters[Array.IndexOf(letters, ttr[ttr.Length - 1].ToString()) + 1];
} else {
return setLCharPos(ttr.Substring(0, ttr.Length - 1), ltr) + letters[0];
}
}
public static string MD5Hash(string text)
{
MD5 md5 = new MD5CryptoServiceProvider();
//compute hash from the bytes of text
md5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(text));
//get hash result after compute it
byte[] result = md5.Hash;
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < result.Length; i++)
{
//change it into 2 hexadecimal digits
//for each byte
strBuilder.Append(result[i].ToString("x2"));
}
return strBuilder.ToString();
}
}
}
只需插入任何32个字符的字符串,它就会永远循环播放。除非你真的想要暴力,否则我对此不承担任何责任。
答案 2 :(得分:-1)
系统为您管理ram。这意味着,只要您的应用程序超出可用内存的边界,系统就会处理它。 (将其移至硬盘等处。)
因此你无法将公羊填满100%。
如果一个应用程序可以填满公羊,那将会很糟糕;)