2009-10-02 38 views
7

Xin cho biết sự khác biệt giữa một ID nhóm xử lý và một jobid. Là jobid một builtin của một chương trình shell hoặc là nó liên quan đến hạt nhân? Sử dụng của mỗi người trong số họ là gì? Khi một tiến trình được chạy ở chế độ nền, chỉ là bộ công việc hoặc là tập hợp pgid? Việc sử dụng hàm setpgid() là gì?Sự khác nhau giữa id nhóm quá trình và id việc trong UNIX

Khi một quá trình đang chạy ở chế độ nền, là hạt nhân cũng tham gia hoặc không vỏ chăm sóc trong số đó là nền hoặc foreground?

Trả lời

13

Câu hỏi hay. Id công việc chủ yếu chỉ là một cấu trúc vỏ. Có sự hỗ trợ trong hạt nhân dưới dạng các tín hiệu có liên quan đến kiểm soát công việc và cách thức mà hạt nhân biết chính xác quy trình nào gửi tín hiệu điều khiển công việc đến.

Nói đúng ra, câu trả lời cho câu hỏi đầu tiên của bạn là id việc hoàn toàn là một sự sáng tạo vỏ. Nó tồn tại vì một đường ống (hoặc, hiếm khi, một cấu trúc nhóm khác) có thể bao gồm nhiều quy trình cần được kiểm soát như một đơn vị.

Để trả lời câu hỏi cuối cùng của bạn, trình bao bắt đầu tất cả các quy trình trước tiên bằng cách thực hiện fork(2) và sau đó thực hiện execve(2). Sự khác biệt duy nhất với & là vỏ không làm wait(2) (hoặc biến thể liên quan) và do đó chương trình có thể tiếp tục "ở chế độ nền". Thực sự có rất ít sự khác biệt trong Unix giữa nền trước và nền.

Các nhóm trình là một hiệp hội xác định bởi vỏ để các hạt nhân biết về một "tiền cảnh" quá trình duy nhất để xử lý một tập hợp của nhiều "nền" quy trình. Điều này chủ yếu quan trọng để các quá trình nền sẽ tạo ra một tín hiệu nếu chúng quyết định đột nhiên đọc từ một thiết bị đầu cuối. (Thiết bị đầu cuối như vậy có thể được kết nối với đầu vào tiêu chuẩn.) Điều này sẽ gây ra "công việc" để tạo ra một tín hiệu và vỏ sẽ nhắc người dùng làm điều gì đó.

Hãy thử (sleep 5; read x)& và sau 6 giây gõ trả lại hàng hoặc một cái gì đó để vỏ tỉnh dậy. Đó là khi bạn nhìn thấy một cái gì đó giống như ...

[1] + Stopped (ngủ 5; đọc x)

... và sau đó bạn gõ fg để kéo nó vào trong foreground.

Ban đầu, Unix có đường ống và có &, nhưng không có cách nào để di chuyển lệnh hoặc đường dẫn giữa nền trước và nền và không có cách nào để giúp quá trình nền đột nhiên quyết định đọc đầu vào tiêu chuẩn.

kiểm soát công việc và hỗ trợ hạt nhân cho nó được bổ sung bởi Bill Joy và những người khác trong các phiên bản đầu tiên của BSD và csh (1). Chúng được chọn theo dòng bởi Unix thương mại và được nhân bản cho nhân Linux giống nhau.


Về các câu hỏi về các nhóm quy trình và ps(1) ... Để hỗ trợ điều khiển công việc trong vỏ, trạng thái quá trình hạt nhân bao gồm một ID nhóm xử lý và một session ID. Một nhóm quá trình và một công việc là giống nhau, nhưng một số công việc chỉ là một xử lý vỏ tạo nên. Một quá trình là một nhà lãnh đạo phiên nếu ID phiên là giống như pid, và một quá trình là một nhà lãnh đạo nhóm quá trình nếu pgid là giống như pid.Tôi tin rằng điều gì đó tinh vi hơn một chút đang xảy ra với + rằng các bản in ps(1). Mỗi thiết bị đầu cuối đều biết nhóm xử lý tiền cảnh của nó là gì, vì vậy tôi tin rằng một quá trình sẽ nhận được + nếu pid == pgid & & (pgid là pg tiền cảnh cho thiết bị đầu cuối điều khiển của nó).

Tóm lại, hạt nhân giữ một số mục trạng thái: pid, pgid, sid, và một quá trình có thể có một thiết bị đầu cuối điều khiển và một thiết bị đầu cuối có thể có một pgid tiền cảnh. Các thông tin đăng nhập này chủ yếu nhằm hỗ trợ kiểm soát công việc nhưng cũng được sử dụng để thu hồi quyền truy cập vào thiết bị đầu cuối khi người dùng đăng xuất.

+0

Trong ví dụ ur về nhóm quy trình, việc sử dụng nhóm quy trình là gì. Xin vui lòng giải thích chi tiết về cách nhóm tiến trình tham gia. – avd

+0

Một điều nữa, bạn đã viết rằng quá trình nền trước kiểm soát các tiến trình nền, bạn có thể cho tôi ví dụ về điều này không? – avd

+0

Xin lỗi thêm một chút nữa, bạn đã viết rằng id công việc được tạo sẵn trong shell, vì vậy nền trước/nền là hiểu biết về shell nhưng khi chúng ta làm "ps" thì nó hiển thị trong các số liệu thống kê là "R" hoặc "R +". nhưng ps được thực thi bởi hạt nhân sao cho kernel biết công việc đó là back/foreground. – avd

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