2012-04-02 27 views
21

Ai đó có thể giải thích tại sao ashmem được tạo ra?ashmem có quyền hạn đặc biệt nào?

Tôi đang duyệt qua mm/ashmem.c ngay bây giờ. Gần như tôi có thể nói, hạt nhân đang nghĩ về ashmem như bộ nhớ hỗ trợ tập tin có thể là mmap'd. Nhưng sau đó, tại sao lại gặp rắc rối khi triển khai ashmem? Nó có vẻ giống như các chức năng tương tự có thể đạt được bằng cách gắn một fs RAM và sau đó sử dụng sơ đồ/mmap để chia sẻ bộ nhớ.

Tôi chắc chắn rằng ashmem có thể làm nhiều thứ lạ mắt hơn - từ việc xem mã, có vẻ như có liên quan đến việc ghim/bỏ ghim trang?

Trả lời

19

Ashmem cho phép các quy trình không liên quan đến tổ tiên để chia sẻ bản đồ bộ nhớ theo tên, được làm sạch tự động.

mmaps ẩn danh cũ đồng bộ và bộ nhớ chia sẻ hệ thống V thiếu một số yêu cầu này.

Phân đoạn bộ nhớ dùng chung V được lưu trữ xung quanh khi không còn được tham chiếu bằng cách chạy chương trình (đôi khi là tính năng, đôi khi gây phiền toái).

Dấu mmaps chia sẻ ẩn danh có thể được truyền từ quy trình cha mẹ sang con, không linh hoạt vì đôi khi bạn muốn các quy trình không liên quan theo cách đó để chia sẻ bộ nhớ.

+3

Nhưng ashmem yêu cầu chia sẻ thông qua bộ mô tả tệp. Tạo một tập tin sao lưu và cho phép mỗi quá trình để mmap nó chia sẻ sẽ thực hiện cùng một mục tiêu, không? Tôi thấy cách này tốt hơn so với shmem nhưng làm thế nào là nó tốt hơn so với việc có một tập tin sao lưu? –

+1

Nó tốt hơn bởi vì, tốt, tạo ra một tập tin khi những gì bạn thực sự muốn là một phần chia sẻ của bộ nhớ là loại một mạch, hacky tuyến đường. (Có phải sử dụng một bộ mô tả tập tin vẫn còn hacky, nhưng ít hacky hơn là có một tập tin ở đó, quá. Mô tả tập tin đã tổng quát hóa các loại tài nguyên khác nhau, ví dụ như ổ cắm và các thiết bị.) – Kaz

+0

Việc ghim và bỏ ghim đó dường như cho phép bạn triển khai bộ nhớ đệm bộ nhớ trong ứng dụng của bạn sẽ biến mất khi bộ nhớ là cần thiết, tương tự như bộ đệm hạt nhân. API cho bạn biết nếu bộ nhớ đã bị xóa (bạn vẫn có bộ nhớ cache của mình hay chưa). – Kaz

5

Ai đó có thể giải thích lý do tại sao ashmem được tạo?

David Turner (thường xuyên trên Android NDK) trả lời này trong Why was bionic/libc/include/sys/shm.h removed?:

... System V TVV đã bị xóa do cupcake. Xem bionic/libc/docs/SYSV-IPC.TXT để biết chi tiết.

Tóm lại, IPC hệ thống V bị rò rỉ theo thiết kế và không chơi tốt trong môi trường thời gian chạy của trong đó giết các quy trình để nhường chỗ cho những cái khác chỉ là bình thường và rất phổ biến. Kết quả cuối cùng là bất kỳ mã nào dựa trên các IPC này đều có thể làm đầy bảng nội bộ của các khóa SysV IPC của hạt nhân, một thứ chỉ có thể an toàn là được giải quyết bằng cách khởi động lại.

Chúng tôi muốn cung cấp cơ chế thay thế trong tương lai không có các vấn đề tương tự. Một điều chúng tôi cung cấp tại thời điểm này là ashmem, trong đó được thiết kế riêng cho Android để tránh loại sự cố đó (mặc dù nó không được ghi chép đầy đủ như nó cần). Chúng ta có thể cần một cái gì đó tương tự cho semaphores và/hoặc hàng đợi tin nhắn.

Các vấn đề liên quan