2015-09-08 13 views
7

Một người phỏng vấn chỉ hỏi tôi một câu hỏi đặc biệt mà tôi chưa từng nghĩ đến trước đây.Làm thế nào để lấp đầy bộ nhớ nhanh nhất có thể trong C#

"Làm thế nào bạn sẽ lấp đầy bộ nhớ của máy tính nhanh nhất có thể trong C#?"

Tôi trả lời rằng có lẽ tôi sẽ sử dụng một số chức năng đệ quy, tuy nhiên ông đã chỉ ra rằng tôi có thể bị tràn ngăn xếp trước khi lấp đầy bộ nhớ.

Câu hỏi của tôi đơn giản, làm cách nào để lấp đầy bộ nhớ của máy tính nhanh nhất có thể bằng C#?

+9

"thử truy cập cơ sở dữ liệu Oracle". –

+0

Có thể câu hỏi gợi ý cho các tài nguyên không được quản lý trên heap như hình ảnh hoặc đối tượng gdi. – Jens

+1

Tôi muốn đi với "Tôi sẽ không": D – Luaan

Trả lời

8

Tôi muốn đi với một ngã ba bom:

while (true) Process.Start(Assembly.GetExecutingAssembly().Location); 

Khái niệm này là quen thuộc, chương trình không ngừng bắt đầu trường hợp mới của chính nó.

+1

Nó sẽ không được nhanh hơn để chỉ phân bổ nhiều bộ đệm lớn? –

+2

@TheodorosChatzigiannakis Yeah, nhanh hơn nhiều. Tuy nhiên, các bộ đệm trống không nhất thiết được lấy từ RAM - có các trang bộ nhớ trước zero cho mục đích đó - chúng chỉ được cấp phát khi bạn thực sự viết một số dữ liệu. Và điều này được thực hiện ở cấp độ hệ điều hành, vì vậy rất khó để bỏ qua. Tạo bản sao của một số hình ảnh có lẽ sẽ là một lựa chọn tốt hơn. "Ưu điểm" chính của bom ngã ba không phải là sử dụng bộ nhớ, mặc dù - đó là cách nó có xu hướng tiêu diệt toàn bộ máy tính bằng cách làm ngập nó với công việc ưu tiên cao. – Luaan

+0

Làm thế nào về điền nhưng không gây ra lỗi trang và di chuyển các trang vào đĩa. –

1

Tôi đã không thử nó, nhưng tôi muốn đi với một cái gì đó như:

while(true) { Marshal.AllocHGlobal(1024); } 
+0

Điều này chắc chắn sẽ ném ngoại lệ Out of Memory. Cảm ơn câu trả lời của bạn Tôi nghĩ rằng đây là những gì tôi đang tìm kiếm, nên đã được rõ ràng hơn nhiều trong câu hỏi của tôi! – BigTallJosh

+0

Tôi không có ý đó là một cách tiêu cực đó là những gì tôi đang tìm kiếm! Điền vào bộ nhớ nhưng không làm hỏng hệ thống! – BigTallJosh

+0

Vâng, cho đến khi bạn chỉnh sửa nó đọc như thể nó là một điều xấu. Tôi đã xóa nhận xét của mình :-) – Jcl

2
  1. Fork-Bomb, điều này cuối cùng sẽ làm cho CPU rất bận rộn, nhưng không nhất thiết phải lấp đầy bộ nhớ. Nếu bạn có GB bộ nhớ và một chương trình nhỏ, Windows MMU cuối cùng có thể hoán đổi không được sử dụng (dĩa trước đó) vào đĩa và vẫn giữ bộ nhớ miễn phí cho chương trình khác. Vấn đề duy nhất là, điều này không điền vào bộ nhớ thay vì nó chỉ đơn giản là làm cho hệ thống không phản hồi.

  2. Bộ nhớ ảo, bằng cách phân bổ các đối tượng khổng lồ bằng chức năng Marshal.AllocHGlobal hoặc tương tự, bạn có thể nghĩ rằng bạn đang nạp bộ nhớ, nhưng một lần nữa, nhưng hệ điều hành thông minh hơn, nếu bạn chỉ cấp phát bộ nhớ và không sử dụng chúng để đọc lại , Hệ điều hành sẽ một lần nữa trang chúng trở lại đĩa, vẫn không chiếm tất cả bộ nhớ. Đây vẫn là bộ nhớ ảo và hệ điều hành sẽ cho phép bạn MAX bộ nhớ được đưa ra bởi .net hướng dẫn, sau đó nó sẽ bắt đầu ném không có bộ nhớ nhiều hơn mà không thực sự tiêu thụ tất cả bộ nhớ.

  3. Bộ nhớ vật lý, Bây giờ điều này là khó khăn, trước hết, bạn không thể truy cập bộ nhớ vật lý trong Windows trong các trường hợp bình thường trong bất kỳ ứng dụng nào. Nếu bạn thực sự muốn điền vào bộ nhớ (Physical memory) thì bạn phải viết một trình điều khiển chế độ hạt nhân để làm điều đó.

  4. AllocateUserPhysicalPages chức năng. Đây là Windows API duy nhất cho phép bạn phân bổ bộ nhớ vật lý, (mà theo cách điền vào bộ nhớ nhanh hơn) làm cho nó không có sẵn cho các quá trình khác. https://msdn.microsoft.com/en-us/library/aa366528(VS.85).aspx SQL Server sử dụng điều này và tôi tin rằng ngay cả các cơ sở dữ liệu khác sẽ sử dụng nó để phân bổ bộ nhớ vật lý, bộ nhớ này nhanh hơn và chủ yếu được sử dụng cho mục đích lưu trữ.

1

Tạo một nhóm đối tượng và tránh chúng bị thu gom rác.

gọi kill() và tận hưởng.

void kill() 
{ 
    while(true) 
     ThreadPool.QueueUserWorkItem(fill)); 
} 

void fill(Object o) 
{ 
    List<Object> list = new List<Object>(); 
    while(true) 
     list.Add(new Object()); 
} 
Các vấn đề liên quan