Tại sao các tiến trình con Unix lại thừa hưởng [hầu hết] các thuộc tính quy trình cha


1

Tìm hiểu về cách các quy trình Unix hoạt động và nhận thấy rằng quy trình con kế thừa hầu hết các thuộc tính (bao gồm mô tả tệp) từ quy trình cha. Tôi cũng vừa mới học về thực hiện và cách nó thay thế các thuộc tính tiến trình con bằng các thuộc tính hoàn toàn mới (không gian bộ nhớ mới, v.v.), nhưng vẫn giữ ID tiến trình ban đầu.

Sau đó tôi biết về môi trường hộp cát trong Node.js , trong đó nó cung cấp cho bạn một bảng cơ bản trống và bạn thêm các biến và "tính năng" vào bối cảnh của quy trình con.

Điều tôi băn khoăn là, các loại cấu hình khác nhau dành cho các thuộc tính mà tiến trình con nhận được là gì và tại sao tiến trình con trong Unix lại "mặc định" để kế thừa tất cả các thuộc tính cha. Tự hỏi tại sao nó sẽ không có không gian bộ nhớ riêng và không có gì.

Cũng tự hỏi nếu có "cấu hình thuộc tính quy trình con" thay thế cho 2 trường hợp này (kế thừa tất cả các thuộc tính cha hoặc không kế thừa). Có thể nó muốn thừa hưởng một nửa không gian địa chỉ cha hoặc sử dụng một số không gian địa chỉ từ quy trình anh chị em hoặc sử dụng một vài mô tả tệp từ cha mẹ cũng như một số riêng của nó, v.v. Có thể bạn nói rằng nó có thể truy cập một vài trình điều khiển thiết bị và những người khác không, vv

Sẽ rất thú vị nếu biết có cách nào để vượt qua các "tính năng cấu hình" như vậy khi tạo một tiến trình con, trên Unix hoặc trên bất kỳ hệ điều hành nào khác. Ví dụ: "tạo quy trình con, sử dụng một nửa không gian địa chỉ cha mẹ, 1/4 của không gian địa chỉ của anh chị em 2, 1/8 của không gian địa chỉ của anh chị em 1 và 8 còn lại sử dụng không gian địa chỉ địa phương của riêng tôi. đến trình điều khiển thiết bị a, b và c, và mặt khác cho phép không có quyền truy cập mạng. " Một cái gì đó tùy ý, về cơ bản nó đang cấu hình "bộ tính năng" của quy trình con thành một mức độ chi tiết tốt.

Tự hỏi nếu bất cứ điều gì như thế xảy ra trong Unix hoặc các hệ điều hành khác, và nếu không, tại sao không. Tôi không hiểu tại sao quyết định được đưa ra chỉ có 2 trường hợp quy trình cho phép / quy định này.

Có vẻ như điều này bằng cách nào đó trùng lặp với vòng bảo vệ khái niệm. Bạn ngăn các quy trình người dùng (quy trình con) truy cập vào một số tính năng nhất định. Tự hỏi tại sao nó không thể cấu hình nhiều hơn thế này, ở mức cao.


Các tiến trình con có được không gian bộ nhớ (COW) của riêng chúng và các luồng chia sẻ. "Bộ tính năng" của một đứa trẻ được cấu hình bởi quy trình cha sau fork() va trươc đây exec..().
dsstorefile1

1
Bạn đang hỏi về các quy trình Unix, về các quy trình Linux, về các quy trình FreeBSD ...? Có một khoảng cách lớn giữa fork / vfork Unix truyền thống và ví dụ: Linux clone / unshare hoặc FreeBSD rfork.
grawity

1
Vấn đề với câu hỏi này câu trả lời ở đây giải quyết Tuy nhiên, nó giả định rằng mẹ cha mẹ và con trẻ con chỉ là phổ biến trong một hệ thống và rằng quá trình con con Node.jsest tương tự như một quy trình con trẻ ở cấp độ OS. Nó không phải là. Node.js đơn giản là một ngôn ngữ lập trình tồn tại trên HĐH và hoạt động trong cấu trúc quy trình riêng của nó. Các mục hệ điều hành là một con thú hoàn toàn khác nhau. Ngoài ra, câu hỏi này phần nào đánh hơi được một chút Vấn đề XY Vì vậy tôi khuyến khích người đăng ban đầu làm rõ nếu cần vấn đề thực sự là gì.
JakeGould

Câu trả lời:


-1

Bạn đang trộn táo và cam và bưởi ở đây.

  • "node.js", chẳng hạn, là JavaScript ngôn ngữ cấp cao, không liên quan gì đến các quy trình của hệ điều hành. (Tất cả JavaScript chạy trong một quy trình hoặc luồng được cung cấp bởi máy chủ của nó.)

  • "Nhẫn" hay nói chung hơn là "cấp đặc quyền CPU" là tính năng vật lý của chip vi xử lý, được sử dụng để xác định hướng dẫn CPU nào mà chương trình được phép phát hành và tài nguyên nào nó có thể truy cập.

  • Unix / Linux phần mềm kiến trúc, khá đặc trưng cho các hệ điều hành này, gắn chặt với khái niệm "rèn" trông như thế này:

    if (pid = fork()) {
        ... you are the parent, and 'pid' is the child's process-id ...
    } else {
        ... 'pid' is zero, so you are the child ...
    }
    

Để ý tưởng gọn gàng này hoạt động, hầu hết bối cảnh của cha mẹ phải được sao chép cho trẻ.

Các exec() cuộc gọi hệ thống có thể được sử dụng (bởi một đứa trẻ) để thay thế toàn bộ bối cảnh của nó bằng một quá trình mới, khiến tất cả "quyền thừa kế" từ cha mẹ bị cắt đứt.


1
exec() không loại bỏ tất cả các thừa kế. Nó chủ yếu chỉ thay thế bộ nhớ quá trình, nhưng các tài nguyên khác được giữ lại. Ví dụ. bộ giải mã tập tin được bảo tồn trừ khi chúng có close-on-exec đặt cờ; điều này cho phép shell thực hiện chuyển hướng I / O trước khi thực hiện một chương trình bên ngoài.
Barmar
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.