Hãy nói nếu tôi gõ cd trong vỏ của tôi. Là cd được tải từ bộ nhớ tại thời điểm đó? Trực giác của tôi là các lệnh tích hợp này được tải sẵn vào bộ nhớ hệ thống sau khi kernel đã được tải, nhưng ai đó đã nhấn mạnh rằng chúng chỉ được tải khi tôi thực sự gọi lệnh ...
Theo nghĩa rộng, các câu trả lời khác là chính xác - các phần dựng sẵn được nạp bằng vỏ, các phần tử độc lập được tải khi được gọi. Tuy nhiên, một "con chồn" rất dính có thể khăng khăng rằng nó không đơn giản như vậy.
Cuộc thảo luận này phần nào về cách thức hoạt động của HĐH và các hệ điều hành khác nhau hoạt động theo những cách khác nhau, nhưng tôi nghĩ nói chung những điều sau đây có lẽ đúng với tất cả các * hiện đại.
Đầu tiên, "nạp vào bộ nhớ" là một cụm từ mơ hồ; thực sự những gì chúng ta đang đề cập là có không gian địa chỉ ảo được ánh xạ vào bộ nhớ . Điều này rất quan trọng vì "không gian địa chỉ ảo" đề cập đến những thứ có thể cần được đặt vào bộ nhớ, nhưng thực tế không phải ban đầu: chủ yếu những gì thực sự được nạp vào bộ nhớ là bản đồ - và bản đồ không phải là lãnh thổ. "Lãnh thổ" sẽ là tệp thực thi trên đĩa (hoặc trong bộ đệm của đĩa) và trên thực tế, hầu hết phần đó có thể không được tải vào bộ nhớ khi bạn gọi tệp thực thi.
Ngoài ra, phần lớn "lãnh thổ" là các tham chiếu đến các lãnh thổ khác (thư viện dùng chung) và một lần nữa, chỉ vì chúng được đề cập không có nghĩa là chúng thực sự được tải. Chúng không được tải cho đến khi chúng thực sự được sử dụng, và sau đó chỉ những phần của chúng thực sự cần được tải để cho bất kỳ "việc sử dụng" nào là thành công.
Ví dụ: đây là một đoạn top
đầu ra trên linux đề cập đến một bash
thể hiện:
VIRT RES SHR S %CPU %MEM TIME+ COMMAND
113m 3672 1796 S 0.0 0.1 0:00.07 bash
VIRT 113 MB là không gian địa chỉ ảo, được ánh xạ trong RAM. Nhưng RES là lượng RAM thực tế tiêu thụ trong quá trình - chỉ 3,7 kB. Và trong đó, một số là một phần của lãnh thổ được chia sẻ ở trên - 1,8 kB SHR. Nhưng /bin/bash
trên đĩa của tôi là 930 kB và libc cơ bản mà nó liên kết đến (một lib được chia sẻ) lớn gấp đôi một lần nữa.
Cái vỏ đó bây giờ không làm gì cả. Giả sử tôi gọi một lệnh tích hợp, mà chúng ta đã nói trước đó đã được "nạp vào bộ nhớ" cùng với phần còn lại của vỏ. Hạt nhân thực thi bất kỳ mã nào có liên quan bắt đầu từ một điểm trên bản đồ và khi nó đạt đến một tham chiếu đến mã chưa thực sự được tải, nó sẽ tải nó - từ một hình ảnh thực thi trên đĩa - mặc dù trong một tình huống ngẫu nhiên hơn nghĩa là, có thể thực thi được (có thể là shell, công cụ độc lập hoặc thư viện dùng chung) đã được "tải vào bộ nhớ".
Điều này được gọi là phân trang nhu cầu .