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

时间:2013-10-02 16:36:38

标签: c# .net

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

3 个答案:

答案 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%。

如果一个应用程序可以填满公羊,那将会很糟糕;)