Điều này bắt đầu một chút tắt chủ đề (và sau đó tôi sẽ tie nó vào câu hỏi của bạn), nhưng những gì đang xảy ra tương tự như những gì sẽ xảy ra khi bạn ngã ba một quá trình trong Linux. Khi forking có một cơ chế được gọi là copy on write, nó chỉ sao chép không gian bộ nhớ cho quá trình mới khi bộ nhớ được ghi. Bằng cách này, nếu quá trình chia rẽ thực thi một chương trình mới ngay lập tức thì bạn đã tiết kiệm được chi phí cho việc sao chép bộ nhớ chương trình gốc.
Quay lại câu hỏi của bạn, ý tưởng tương tự. Như những người khác đã chỉ ra, yêu cầu bộ nhớ đưa cho bạn không gian bộ nhớ ảo ngay lập tức, nhưng các trang thực tế chỉ được phân bổ khi viết cho chúng.
Mục đích của việc này là gì? Về cơ bản nó làm cho bộ nhớ mallocing hoạt động thời gian không đổi hoặc liên tục Big O (1) thay vì một hoạt động Big O (n) (tương tự như cách mà bộ lập lịch linux lan truyền nó thay vì làm nó trong một đoạn lớn).
Để chứng minh những gì tôi có nghĩa là tôi đã làm thí nghiệm sau:
[email protected]:~/test_code$ time ./bigmalloc
real 0m0.005s
user 0m0.000s
sys 0m0.004s
[email protected]:~/test_code$ time ./deadbeef
real 0m0.558s
user 0m0.000s
sys 0m0.492s
[email protected]:~/test_code$ time ./justwrites
real 0m0.006s
user 0m0.000s
sys 0m0.008s
Chương trình bigmalloc phân bổ 20 triệu ints, nhưng không làm bất cứ điều gì với họ. deadbeef viết một int cho mỗi trang kết quả trong 19531 viết và ghi đè phân bổ 19531 ints và số không chúng ra. Như bạn có thể thấy deadbeef mất khoảng 100 lần lâu hơn để thực hiện hơn bigmalloc và khoảng 50 lần dài hơn so với chữ viết tay.
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = malloc(sizeof(int)*20000000); // allocate 80 million bytes
return 0;
}
.
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = malloc(sizeof(int)*20000000); // allocate 80 million bytes
// immediately write to each page to simulate all at once allocation
// assuming 4k page size on 32bit machine
for (int* end = big + 20000000; big < end; big+=1024) *big = 0xDEADBEEF ;
return 0;
}
.
#include <stdlib.h>
int main(int argc, char **argv) {
int *big = calloc(sizeof(int),19531); // number of writes
return 0;
}
Nguồn
2009-05-14 18:46:38
có giống với cửa sổ không? – TStamper
Tôi không quen với những gì Windows làm, xin lỗi. – bdonlan
bdonlan: Đúng, nhưng anh ta nên chú ý đến hiệu ứng của ngã ba "* Đứa trẻ không thừa kế bộ nhớ của cha mẹ nó (mlock (2), mlockall (2)). " khi anh ấy nhìn vào đầu trang – RandomNickName42