2013-08-05 26 views
10

Phỏng vấn hỏi câu hỏi:Vòng lặp này sẽ chạy bao nhiêu lần?

while(1) 
{ 
void * a = malloc(1024*1024); 
} 

Đã bao nhiêu lần lặp này sẽ chạy trên một ram 2 gb8 gb ram?

Tôi đã nói vòng lặp vô hạn vì không có điều kiện kết thúc ngay cả khi bộ nhớ sẽ đầy. Anh ấy không đồng ý.Tôi không có bất kỳ ý tưởng nào ngay bây giờ.Vui lòng trợ giúp.

+6

@Nobilis Nếu bộ nhớ đầy, 'malloc()' trả về 'NULL'. –

+0

Và tại sao bỏ phiếu xuống ??? –

+0

@ H2CO3 Vâng tôi đã nghĩ về nó và thực sự không đảm bảo nó sẽ segfault như cuộc gọi malloc sẽ chỉ giữ trở về NULL, loại bỏ bình luận. – Nobilis

Trả lời

9

Nó sẽ chạy vô thời hạn. Trên hầu hết các nền tảng, khi không còn bộ nhớ, malloc() sẽ trả về 0, do đó vòng lặp sẽ tiếp tục chạy mà không thay đổi lượng bộ nhớ được cấp phát. Linux cho phép over-cam kết bộ nhớ để các cuộc gọi malloc() tiếp tục thêm vào bộ nhớ ảo. Quá trình này cuối cùng có thể bị giết bởi OOM Killer khi dữ liệu mà malloc() sử dụng để quản lý bộ nhớ bắt đầu gây ra vấn đề (không phải vì bạn cố gắng sử dụng bộ nhớ được cấp phát vì mã không sử dụng), nhưng Linux không được quy định là nền tảng trong câu hỏi.

+0

Kẻ giết người OOM sẽ chỉ hành động ngay khi bộ nhớ thực sự được sử dụng. Miễn là tôi giữ bộ nhớ mà tôi đã phân bổ không được phép, không có gì xảy ra. – glglgl

+0

Hm, tôi đã sai. Với kích thước 1 MiB malloc, dữ liệu quản trị trở nên quá lớn đến mức cuối cùng chúng sẽ lấp đầy bộ nhớ trên hệ thống 64 bit. Với 1 kích thước malloc GiB, kích thước bộ nhớ ảo được hút ở 107t (theo 'top') và chương trình chạy vô thời hạn. – glglgl

+0

@glglgl: vâng - nhưng bạn có thể đạt đến một điểm mà 'malloc()' phải ghi vào bộ nhớ để duy trì danh sách những gì nó đã phân bổ, và tại thời điểm đó kẻ giết người OOM có thể hành động. –