2016-01-12 50 views
6

Tôi đang nghiên cứu hạt nhân Linux với Phát triển hạt nhân Linux của Robert Love.atomic_t trong Linux

Như bạn biết, cuốn sách này sử dụng phiên bản cũ của Linux. Đó là trong phiên bản 2.6

atomic_t có "bộ đếm int dễ bay hơi". Nhưng atomic_t của phiên bản Linux mới có "int counter" không dễ bay hơi. Tại sao điều này dễ bay hơi đã bị xóa?

+0

Có thể vì nó không đủ trong hệ thống đa CPU? Hoặc có thể vì API đã thay đổi? Nhận một nguồn cấp dữ liệu gần đây hơn, hạt nhân Linux không có API nội bộ cố định. – Olaf

+0

Ngoài ra, hãy xem [Tại sao cần thay đổi trong C?] (Https://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c) và liên quan. – edmz

Trả lời

5

Do biến dễ bay hơi không phải là biến nguyên tử. Điểm duy nhất trong việc sử dụng volatile là để ngăn chặn tối ưu hóa trình biên dịch có thể, không giống như việc ngăn chặn truy cập đồng thời không mong muốn.

Về vấn đề đó, việc sử dụng volatile gần như không bao giờ chính xác.

Bạn có thể đọc thêm về nó trong Semantics and Behavior of Atomic and Bitmask Operations.

Trích dẫn một phần nhỏ của nó:

* Chú ý: atomic_read() và atomic_set() không hàm ý RÀO CẢN! *

Một số kiến ​​trúc có thể chọn sử dụng từ khóa dễ bay hơi, rào cản hoặc nội tuyến để đảm bảo mức độ tức thời cho atomic_read() và atomic_set(). Điều này không được đảm bảo thống nhất, và có thể thay đổi trong tương lai, vì vậy tất cả người dùng atomic_t nên xử lý atomic_read() và atomic_set() như các câu lệnh đơn giản C có thể được sắp xếp lại hoặc tối ưu hóa hoàn toàn bởi trình biên dịch hoặc bộ xử lý. gọi trình biên dịch thích hợp và/hoặc bộ nhớ rào cản cho mỗi trường hợp sử dụng. Việc không làm như vậy sẽ dẫn đến mã có thể đột nhiên ngắt khi được sử dụng với các kiến ​​trúc khác nhau hoặc biên dịch tối ưu hóa, hoặc thậm chí thay đổi mã không liên quan thay đổi cách trình biên dịch tối ưu hóa phần truy cập biến atomic_t.

* BẠN ĐÃ ĐƯỢC CẢNH BÁO! *

+0

Cảm ơn bạn. Nhưng sau đó, tôi muốn biết tại sao kernel sử dụng struct cho biến int. Tôi có nghĩa là tại sao không chỉ sử dụng "atomic_t truy cập;" (nếu int là loại được định nghĩa là atomic_t) chứ không phải cấu trúc atomic_t mà chỉ có một varaible: "int counter"? –

+1

Theo tài liệu tôi đã chỉ ra, lý do chúng bao bọc biến trong một cấu trúc và định nghĩa nó như một kiểu là để ngăn chặn bất kỳ kiểu truyền nào vào một kiểu số nguyên C bình thường. – jweyrich