Deferred memory allocation

Cùng Nhau Học Linux Kernel
Cùng Nhau Học Linux Kernel
24 bài viết — 36 Người theo dõi |
1
1
Trong bài viết này mình xin được chia sẻ nhưng gì mình biết về một chủ đề khá hay của Linux kernel. Đó là "Deferred memory allocation" nó là gì, nó có ảnh hưởng đến chúng ta như thế nào.
- Deferred memory allocation là gì? Đây là một tính năng của Linux kernel giúp tăng hiệu quả sử dụng bộ nhớ. Mỗi khi chúng ta malloc memory thì kernel chưa cấp phát luôn một vùng nhớ vật lý cho chúng ta. Thay vào đó, nó cấp phát một địa chỉ gọi là virtual address và add địa chỉ đó vào bảng virtual memory address của process đó. Chỉ khi process truy cập vào địa chỉ đó - ví dụ như đọc/ghi, lúc đó kernel sẽ sleep process và tiến hành tìm kiếm 1 vùng nhớ vật lý để cấp phát. Sau khi tìm thấy, nó sẽ đính kèm địa chỉ vật lý của vùng nhớ đó vào địa chỉ virtual lúc trước. Sau đó kernel sẽ wakeup process lên, lúc này process có thể đọc ghi dữ liệu vào vùng nhớ đó bình thường. 
+ Tai sao kernel lại phải delay việc cấp phát physical memory như vậy. Nguyên nhân là do việc delay cấp phát physical mem sẽ tăng khả năng đáp ứng memory của OS lên. Ví dụ hệ thống của mình đang có 10 byte free memory và có 4 process p1, p2, p3, p4 đang chạy. Cả 4 process đều xin cấp phát 10 bytes nhưng thời điểm sử dụng khác nhau - t1, t2, t3, t4. Sau khi sử dụng cả 4 process đều free memory ngay lập tức. Nếu kernel không sử dụng defferred memory thì chỉ p1 xin cấp phát trước là có memory, p2, p3, p4 không cấp phát được. Mặc dù p1 xin cấp phát trước nhưng có thể nó cũng chưa dùng ngay, 1 lúc sau nó mới dùng. Việc này gây lãng phí bộ nhớ, p1 có thì không dùng luôn, p2, p3, cần thì lại không có. Với defferred allocation thì cả 4 thằng đều được cấp phát virtual address ở hàm malloc. Và do việc dùng physical memory tại các thời điểm khác nhau nên cuối cùng kernel đáp ứng được cho cả 4 process.
- Deferred memory allocation ảnh hưởng đến chúng ta như thế nào? Mỗi khi chúng ta cấp phát bộ nhớ với hàm malloc, sau khi nó return success chỉ có nghĩa là chúng ta đã có 1 địa chỉ virtual address để truy cập vào vùng nhớ đó mà thôi, chưa có physical memory nào ở đây cả. Sau đó, process đầu tiên truy cập vào địa chỉ đó sẽ bị sleep, từ lần thứ 2 trở đi thì không bị nữa.
+ Mình đã từng gặp khá nhiều lỗi liên quan đến deffered memory, ví dụ như sau:
1. Hệ thống của mình bị out of memory, mỗi lần chết ở 1 process khác nhau. Mặc dù ở tất cả các process, mình đều cấp phát bộ nhớ kiểu như này:
char *a = malloc(100);
if(NULL == a)
printf("out of mem");
Nguyên nhân là do ở process gây memory leak, tại thời điểm hệ thống out of mem nó vẫn by pass được hàm malloc, sau đó ở 1 process khác khi truy cập vào buffer mà nó cấp phát, lúc đó hệ thống tiền hành cấp phát physical mem thì lại không có, dẫn đến chết ở 1 process khác.
=> Cách xử lý: Mình dự trữ 10 Mb cho hệ thống, ngay khi hệ thống chỉ còn 10Mb đó thì nó sẽ tiến thành báo cáo việc sử dụng memory của tất cả các process, từ đó mình tìm được thằng nào gây leak memory.
2. Trên user-mode mình muốn đọc data dưới hardware, nên mình code như sau:
char ptr = malloc(100);
read(fd, ptr, 100);
Dưới kernel mode mình ghi dữ liệu vào buffer như sau:
spin_lock(key);
copy_to_user(ptr);
spin_unlock(key);
Hệ thống thỉnh thoảng bị crash, mà không thể reproduce được, xác xuất bị crash rất nhỏ và bị một cách ngẫu nhiên. Nguyên nhân là do ở dưới driver trước khi mình truy cập vào ptr mình đã lock key, sau đó mình truy cập vào ptr, nhưng lúc này kernel sleep mất driver của mình để tiến hành cấp phát physical memory. Lúc này key vẫn đang bị driver của mình giữ, đúng thời điểm đó có request đọc khác từ user-mode truyền xuống, driver lại chiếm cpu và cố gắng lock key với hàm spin_lock(key); Nhưng lúc này key đã bị lock, do đó nó chiếm cpu mãi mãi dẫn đến crash hệ thống.
=> Bài học rút ra: Nên dùng calloc để cấp phát memory cho các buffer mà sau đó có thể được dùng dưới kernel. Dưới kernel nên hạn chế dùng spin_lock.
Link thảo luận ở group facebook: link thao luan
Link tham khảo: http://aionica.computerlink.ro/…/04/linux-memory-management/
https://stackoverflow.com/…/does-malloc-lazily-create-the-b…
http://aionica.computerlink.ro/…/04/linux-memory-management/

** Nếu bạn muốn viết các nội dung đặt biệt thì hãy làm theo hướng dẫn sau

Xem thêm 10 bình luận
Viết blog mới của bạn
Báo lỗi trang
Đang tải