如何编写一个最大化物理 RAM 使用的程序

本文关键字:RAM 程序 最大化 何编写 一个 | 更新日期: 2023-09-27 18:33:41

我正在尝试编写一个仅使用所有可用物理内存的程序(即任务管理器显示 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();
        }
    }

如何编写一个最大化物理 RAM 使用的程序

如果你在64位系统上运行,你可以使用AllocateUserPhysicalPages函数来分配物理内存

从文档中:

分配用户物理页面函数用于分配物理内存,这些内存以后可以在进程的虚拟地址空间中映射。必须在调用方的令牌中启用 SeLockMemoryPrivilege 特权,否则函数将失败并ERROR_PRIVILEGE_NOT_HELD。有关详细信息,请参阅特权常量。 此函数分配的内存必须实际存在于系统中。分配内存后,它将被锁定,并且对虚拟内存管理系统的其余部分不可用。

有关详细信息,请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366528%28v=vs.85%29.aspx

嗯...这是我为 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 个字符的字符串,它将永远循环。除非你真的想蛮力,否则我对此不承担任何责任。

系统为您管理内存。这意味着,只要您的应用程序超出可用 ram 的边界,系统就会处理它。(将其移动到硬盘等。

因此,您不能将内存填满到 100%。

如果一个应用程序可以填满内存,那就太糟糕了;)