Khi nào các lệnh tích hợp được tải vào bộ nhớ


11

Hãy nói nếu tôi gõ vào cdvỏ của tôi. Được cdtả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 (nhấn enter trên shell). Bạn có thể vui lòng cho tôi biết nếu có một tài liệu tham khảo giải thích điều này?


1
Tôi nghĩ rằng câu trả lời này sẽ giúp bạn hiểu, mặc dù nó không hoàn toàn trùng lặp.
cjm

@cjm: Cảm ơn đó thực sự là một lời giải thích tốt để đọc.
Forethinker

Câu trả lời:


9

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 bashthể 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/bashtrê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 .


9

Trong khi chờ đợi một trong những đối thủ nặng ký đến và đưa ra một viễn cảnh lịch sử đầy đủ, tôi sẽ cho bạn hiểu biết hạn chế hơn.

Built-in lệnh như alias, cd, echovv là một phần của shell của bạn ( bash, zsh, kshhoặc bất cứ điều gì). Chúng được tải cùng lúc với shell và chỉ đơn giản là các chức năng bên trong của shell đó.


4

Tôi đã thực hiện thí nghiệm sau đây để chỉ ra rằng các lệnh dựng sẵn trên thực tế được tải như một phần của ngoại lệ bash. Do đó, tại sao chúng được gọi là nội dung, nhưng bản demo luôn là cách tốt nhất để chứng minh điều gì đó.

Thí dụ

  1. Khởi động một bashshell mới và lưu ý ID tiến trình của nó (PID):

    $ bash
    $ echo $$
    6402
    
  2. Trong một thiết bị đầu cuối thứ hai chạy pslệnh để chúng tôi có thể xem và xem nếu bashbắt đầu chiếm bất kỳ bộ nhớ bổ sung:

    $ watch "ps -Fp 6402"
    

    Đầu ra trông như thế này:

    Every 2.0s: ps -Fp 6402                        Sat Sep 14 14:40:49 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml      6402  6349  0 28747  6380   1 14:33 pts/38   00:00:00 bash
    

    LƯU Ý: Việc sử dụng bộ nhớ được hiển thị với các cột SZ & RSS tại đây.

  3. Bắt đầu chạy các lệnh trong trình bao (pid 6402):

    Khi bạn cdở xung quanh bạn sẽ nhận thấy bộ nhớ thực tế tăng lên, nhưng điều này không phải do tập tin thực thi cdđược tải vào bộ nhớ, thay vào đó là do cấu trúc thư mục trên đĩa đang được tải vào bộ nhớ. Nếu bạn tiếp tục cdvào các thư mục khác, bạn sẽ thấy nó tăng dần.

    Every 2.0s: ps -Fp 30208                        Sat Sep 14 15:11:22 2013
    
    UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
    saml     30208  6349  0 28780  6492   0 15:09 pts/38   00:00:00 bash
    

    Bạn có thể làm các bài kiểm tra phức tạp hơn như thế này:

    $ for i in `seq 1000`; do cd ..; cd 90609;done
    

    Lệnh này sẽ cd lên một cấp và sau đó quay trở lại vào thư mục 90609 1000 lần. Trong khi chạy này nếu bạn theo dõi việc sử dụng bộ nhớ trong pscửa sổ, bạn sẽ nhận thấy rằng nó không thay đổi. Trong khi chạy một cái gì đó như thế này, không nên sử dụng bộ nhớ bổ sung.

  4. bước đi

    Đây là một thông báo khác rằng chúng ta đang xử lý một hàm dựng sẵn bashchứ không phải là một tệp thực thi thực tế. Khi bạn thử và chạy, strace cd ..bạn sẽ nhận được thông báo sau:

    $ strace cd ..
    strace: cd: command not found
    

3

"Lệnh tích hợp" dùng để chỉ các lệnh được tích hợp trong trình bao, chứ không phải là các chương trình riêng biệt. ls, ví dụ, thực sự không phải là một lệnh tích hợp mà là một chương trình riêng biệt. Nó sẽ được tải vào RAM khi được gọi, trừ khi nó đã có trong bộ đệm đĩa.

Một ví dụ về lệnh tích hợp sẽ là printfhoặc cd. Đây là một phần của vỏ, và được tải cùng với phần còn lại của vỏ.

Không có lệnh nào được tải sẵn theo mặc định, mặc dù các hệ thống đã được tạo để làm điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.