B.5. Không gian người dùng
“Không gian người dùng“ đề cập đến môi trường thời gian chạy của các tiến trình bình thường (trái với hạt nhân). Điều này không có nghĩa là các tiến trình này thực sự bắt đầu bởi người dùng vì một hệ thống tiêu chuẩn thường có một số tiến trình “daemon“(hoặc nền) chạy trước khi người dùng mở một phiên làm việc. tiến trình daemon cũng được coi là tiến trình không gian người dùng.
Khi hạt nhân được vượt qua giai đoạn khởi tạo của nó, nó bắt đầu tiến trình đầu tiên,init
. tiến trình # 1 một mình rất hiếm khi hữu ích bởi chính nó, và các hệ thống giống Unix chạy với nhiều tiến trình bổ sung.
Trước tiên, một tiến trình có thể nhân bản chính nó (đây được gọi làfork). Hạt nhân phân bổ một không gian bộ nhớ tiến trình mới (nhưng giống hệt nhau), và một tiến trình khác để sử dụng nó. Vào thời điểm này, sự khác biệt duy nhất giữa hai tiến trình này làpid. tiến trình mới thường được gọi là tiến trình con, và tiến trình ban đầu màpidkhông thay đổi, được gọi là tiến trình cha.
Đôi khi, tiến trình con tiếp tục thực thi hoạt động riêng của nó độc lập với tiến trình cha , với dữ liệu của chính nó được sao chép từ tiến trình cha. Trong nhiều trường hợp, tuy nhiên, tiến trình con này thực thi một chương trình khác. Với một vài ngoại lệ, bộ nhớ của nó chỉ đơn giản là thay thế bằng chương trình mới, và bắt đầu thực hiện chương trình mới này. Đây là cơ chế được sử dụng bởi tiến trình init (với tiến trình số 1) để bắt đầu dịch vụ bổ sung và thực hiện toàn bộ trình tự khởi động. Tại một số điểm, một tiến trình giữa các con của
init
bắt đầu một giao diện đồ họa để người dùng đăng nhập vào (chuỗi các sự kiện thực tế được mô tả chi tiết trong
Phần 9.1, “System Boot”).
Khi tiến trình hoàn thành nhiệm vụ mà nó đã được bắt đầu, nó sẽ kết thúc. Hạt nhân sẽ phục hồi bộ nhớ được gán cho tiến trình này, và ngừng lát thời gian chạy của nó. tiến trình cha được thông báo về tiến trình con của nó đang bị chấm dứt, cho phép tiến trình chờ đợi cho việc hoàn thành nhiệm vụ mà nó được ủy thác cho tiến trình con. Hành vi này được hiển thị rõ ràng trong trình biên dịch dòng lệnh (được gọi là shells). Khi một lệnh được nhập vào một trình shell, dấu nhắc chỉ trở lại khi thực hiện lệnh đã kết thúc. Hầu hết các shell cho phép chạy lệnh dưới nền, đó là một vấn đề đơn giản để thêm một &
vào cuối lệnh. Dấu nhắc được hiển thị ngay lập tức, có thể dẫn đến các vấn đề nếu lệnh cần hiển thị dữ liệu của riêng nó.
B.5.2. Daemons tiến trình ẩn
Một daemon““là một tiến trình được bắt đầu tự động bởi trình tự khởi động. Nó tiếp tục chạy (trong nền) để thực hiện các nhiệm vụ bảo trì hoặc cung cấp các dịch vụ cho các tiến trình khác. “Nhiệm vụ nền“ này thực sự là tùy ý, và không phù hợp bất cứ điều gì đặc biệt từ quan điểm của hệ thống. Chúng chỉ đơn giản là các tiến trình , tương tự như các tiến trình khác, chúng sẽ chạy lần lượt khi thời gian của chúng đến. Sự phân biệt chỉ là vấn đề ngôn ngữ: một tiến trình chạy mà không có tương tác với người dùng (đặc biệt, không có giao diện đồ hoạ) được cho là đang chạy “ở chế độ nền“ hoặc “như daemon“.
B.5.3. Inter-Process Communications
Một tiến trình bị cô lập, dù là daemon hay một ứng dụng tương tác, hiếm khi hữu ích tự nó, đó là lý do tại sao có một số phương pháp cho phép các tiến trình riêng biệt giao tiếp với nhau, hoặc để trao đổi dữ liệu hoặc để kiểm soát lẫn nhau. Thuật ngữ chung đề cập đến vấn đề này làtruyền thông nội bộ tiến trình, hoặc gọi tắt là IPC.
Hệ thống IPC đơn giản nhất là sử dụng các tệp. tiến trình muốn gửi dữ liệu thì ghi nó vào một tệp (có tên được biết trước), trong khi người nhận chỉ cần mở tệp và đọc nội dung của nó.
Trong trường hợp bạn không muốn lưu trữ dữ liệu trên đĩa, bạn có thể sử dụng mộtpipe, mà chỉ đơn giản là một đối tượng với hai đầu; dữ liệu được viết bằng một đầu có thể đọc được ở đầu kia. Nếu điểm kết thúc được kiểm soát bởi các tiến trình riêng biệt, điều này dẫn đến một kênh truyền thông giữa các tiến trình đơn giản và thuận tiện. Ống có thể được phân thành hai loại: ống dẫn có tên, và ống nặc danh. Một đường ống có tên được đại diện bởi một mục nhập trên hệ thống tập tin (mặc dù dữ liệu truyền không được lưu trữ ở đó), vì vậy cả hai tiến trình có thể mở nó một cách độc lập nếu vị trí của ống tên là được biết đến trước. Trong trường hợp các tiến trình giao tiếp có liên quan (ví dụ như tiến trình cha và con), tiến trình cha cũng có thể tạo ra ống nặc danh trước khi gọi nó, và tiến trình con kế thừa nó. Cả hai tiến trình sau đó sẽ có thể trao đổi dữ liệu qua đường ống mà không cần hệ thống tập tin.
Mặc dù vậy, không phải tất cả các giao tiếp giữa các tiến trình được sử dụng để di chuyển dữ liệu xung quanh. Trong nhiều trường hợp, thông tin chỉ cần truyền là các thông báo điều khiển như“tạm dừng thực hiện“hoặc“tiếp tục thực hiện“. Unix (và Linux) cung cấp một cơ chế gọi làsignals, thông qua đó một tiến trình chỉ đơn giản có thể gửi một tín hiệu cụ thể (được chọn từ một danh sách các tín hiệu đã được xác định trước) sang một tiến trình khác. Yêu cầu duy nhất là phải biết mục tiêu củapid.
Đối với các giao tiếp phức tạp hơn, cũng có các cơ chế cho phép một tiến trình mở truy cập, hoặc chia sẻ, một phần của bộ nhớ được phân bổ của nó cho các tiến trình khác. Bộ nhớ hiện được chia sẻ giữa chúng có thể được sử dụng để di chuyển dữ liệu giữa các tiến trình .
Cuối cùng, kết nối mạng cũng có thể giúp các tiến trình giao tiếp; Các tiến trình này thậm chí có thể chạy trên các máy tính khác nhau, có thể cách nhau hàng ngàn cây số.
Tất cả được thiết kế theo chuẩn cho một hệ thống Unix điển hình sử dụng tất cả các cơ chế này theo các mức độ khác nhau.
Các thư viện chức năng đóng một vai trò quan trọng trong một hệ điều hành giống Unix. Chúng không phải là các chương trình thích hợp, vì chúng không thể thực thi được mà là các bộ sưu tập các đoạn mã có thể được sử dụng bởi các chương trình chuẩn. Trong số các thư viện phổ biến, bạn có thể tìm thấy:
Thư viện C tiêu chuẩn (glibc), chứa các chức năng cơ bản như mở tệp hoặc kết nối mạng, và một số khác hỗ trợ tương tác với hạt nhân;
Bộ công cụ đồ hoạ, như Gtk + và Qt, cho phép nhiều chương trình tái sử dụng các đối tượng đồ họa mà chúng cung cấp;
Thư việnlibpng, cho phép tải, giải thích và lưu hình ảnh ở định dạng PNG.
Nhờ những thư viện, các ứng dụng có thể tái sử dụng mã hiện có. Phát triển ứng dụng được đơn giản hóa vì nhiều ứng dụng có thể sử dụng lại cùng chức năng. Với các thư viện thường được phát triển bởi những người khác nhau, sự phát triển toàn cầu của hệ thống gần với triết lý lịch sử của Unix.
Hơn nữa, các thư viện này thường được gọi là“thư viện chia sẻ“, vì hạt nhân chỉ có thể nạp chúng vào bộ nhớ một lần, ngay cả khi một vài tiến trình sử dụng cùng một thư viện cùng một lúc. Điều này cho phép tiết kiệm bộ nhớ, khi so sánh với trường hợp ngược lại (giả thuyết) khi mà mã cho một thư viện sẽ được nạp nhiều lần như có tiến trình sử dụng nó.