Làm thế nào để ngã ba và thực hiện công việc?


17

Tôi không có nhiều kinh nghiệm, chỉ cố gắng tham gia vào các quy trình làm thế nào để họ diễn giải phần cứng từ cấp độ người dùng.

Vì vậy, khi một lệnh được bắn ra từ một shell, fork()kế thừa một tiến trình con của nó và exec()tải tiến trình con vào bộ nhớ và thực thi.

  1. Nếu quy trình con chứa tất cả các thuộc tính của quy trình cha (là quy trình ban đầu), thì nhu cầu của quy trình con này là gì? Quá trình ban đầu cũng có thể đã được tải vào bộ nhớ.
  2. Điều này forkexeckhái niệm có áp dụng cho tất cả các chương trình thực thi trong UNIX không? Giống như cho shell script cũng hay chỉ cho các lệnh? Nó cũng áp dụng cho các lệnh dựng sẵn shell?
  3. Khi nào bản sao trên khái niệm ghi được sử dụng nếu tôi thực thi lệnh / tập lệnh?

Xin lỗi vì đã hỏi nhiều câu hỏi cùng một lúc, nhưng tất cả những câu hỏi này xuất hiện trong đầu tôi khi tôi nghĩ về bất kỳ lệnh thực thi nào.


Tôi sẽ không nói đây là một bản sao, nhưng tôi nghĩ rằng một số câu hỏi của bạn đã được trả lời ở đây: unix.stackexchange.com/questions/136637/ và một câu trả lời khác được liên kết ở đầu câu hỏi đó.
goldilocks

Câu trả lời:


22

Vì vậy, khi một lệnh được bắn từ shell, fork () kế thừa một tiến trình con của nó và exec () tải tiến trình con vào bộ nhớ và thực thi.

Không hẳn. fork()nhân bản quá trình hiện tại, tạo ra một đứa trẻ giống hệt nhau. exec()tải một chương trình mới vào quy trình hiện tại, thay thế chương trình hiện có.

Qs của tôi là:

Nếu quy trình con chứa tất cả các thuộc tính của quy trình cha (là quy trình ban đầu), thì nhu cầu của quy trình con này là gì? Quá trình ban đầu cũng có thể đã được tải vào bộ nhớ.

Nhu cầu là vì quá trình cha mẹ chưa muốn chấm dứt; nó muốn một quy trình mới được thực hiện và làm một cái gì đó cùng lúc mà nó tiếp tục thực hiện.

Liệu khái niệm fork và exec này có áp dụng cho tất cả các chương trình thực thi trong UNIX không? Giống như cho kịch bản shell cũng hay chỉ cho các lệnh? Nó cũng áp dụng cho các lệnh dựng sẵn shell?

Đối với các lệnh bên ngoài, shell thực hiện fork()để lệnh chạy trong một tiến trình mới. Nội dung chỉ được chạy bằng vỏ trực tiếp. Một lệnh đáng chú ý khác là exec, nó báo shell cho exec()chương trình bên ngoài mà không cần fork()ing trước . Điều này có nghĩa là bản thân shell được thay thế bằng chương trình mới và do đó, chương trình đó không còn tồn tại khi nó thoát. Nếu bạn nói, exec truesau đó /bin/truesẽ thay thế vỏ của bạn, và thoát ngay lập tức, không để lại gì trong thiết bị đầu cuối của bạn nữa, vì vậy nó sẽ đóng lại.

khi sao chép vào khái niệm ghi được sử dụng nếu tôi thực thi lệnh / script?

Trở lại thời kỳ đồ đá, fork()thực sự phải sao chép tất cả bộ nhớ trong quy trình gọi sang quy trình mới. Copy on Write là một tối ưu hóa trong đó các bảng trang được thiết lập để hai quá trình bắt đầu chia sẻ tất cả cùng một bộ nhớ và chỉ các trang được ghi bởi một trong hai tiến trình được sao chép khi cần.


4
"Đối với hầu hết mọi lệnh, shell thực hiện một fork () để lệnh chạy trong một tiến trình mới. Nếu lệnh đó là một lệnh dựng sẵn, thì đứa trẻ không cần phải thực hiện () một chương trình riêng biệt." Câu trả lời tốt, nhưng phần này nên được chỉnh sửa. Vỏ không rẽ nhánh khi chạy nội dung. Nó chạy những người trực tiếp trong quá trình vỏ hoạt động. Đây là cách duy nhất các nội dung thích cdhoặc readcó thể hoạt động. Việc thiếu forking cũng làm cho các nội trang nhanh hơn nhiều so với các lệnh bên ngoài.
John Kugelman hỗ trợ Monica

6
  1. Đối với một số chương trình, tiến trình con thực hiện một việc (đọc từ cổng nối tiếp, ghi vào thiết bị đầu cuối) và quy trình cha tiếp tục làm việc khác (đọc từ thiết bị đầu cuối, ghi vào cổng nối tiếp). Một ví dụ kinh điển khác là quy trình con thực hiện một điểm kiểm tra cho bất kỳ phép tính chạy dài nào đang diễn ra. Hầu hết, tiến trình con thực hiện một số thiết lập, như thay đổi thư mục, đặt lại trình xử lý tín hiệu hoặc đặt lại bộ mô tả tệp, sau đó gọi execve()để tự phủ lớp với mã khác nhau.
  2. fork()exec()áp dụng cho tất cả các tệp thực thi - trên thực tế, cùng với argc và argv, và các đường ống, fork và exec là những gì phân biệt Unix với các hệ điều hành khác. Một vài chuyên ngành hoặc khái quát hóa fork()tồn tại, như BSD vfork(), Plan 9's rfork()và Linux ' clone(), nhưng hiệu trưởng vẫn như cũ.
  3. "Sao chép trên ghi" không thực sự hiển thị cho người dùng, đó là một kỹ thuật để tối ưu hóa việc tạo quy trình con và trong quá trình thực thi. Ngăn xếp cuộc gọi và heap (bộ nhớ được phân bổ malloc()hoặc thậm chí các biến phạm vi tĩnh hoặc toàn cầu) có thể là "sao chép trên ghi". Khi một tiến trình con được tạo với mộtfork()gọi, kernel sẽ thiết lập tiến trình con để có cùng các trang bộ nhớ chính là heap và stack như tiến trình cha. Nếu phần cứng (đơn vị quản lý bộ nhớ) phát hiện ghi của heap hoặc stack, kernel sẽ lấy một trang bộ nhớ vật lý mới, sao chép trang của cha mẹ vào trang mới và ánh xạ trang mới đó vào stack hoặc heap của tiến trình con. Điều này tạo thành một tối ưu hóa vì hạt nhân dành ít thời gian hơn để thiết lập ánh xạ trang hơn so với việc sao chép ngăn xếp và đống hoàn toàn cho quy trình con.

Cảm ơn Bruce cho câu trả lời của bạn. Nhưng rất nhiều điều bạn đã nói ở đây đang diễn ra trong đầu tôi. Tôi không có nhiều kiến ​​thức với những điều này..Tôi sẽ cố gắng để các chức năng này hoạt động như bạn đã đề cập. Cảm ơn bạn rất nhiều..!!
Giải thưởng

4
Nếu quy trình con chứa tất cả các thuộc tính của quy trình cha (là quy trình ban đầu), thì nhu cầu của quy trình con này là gì? Quá trình ban đầu cũng có thể đã được tải vào bộ nhớ.

Câu hỏi này được trả lời rất minh họa bằng cách xem xét các triển khai Unix sớm nhất phải làm việc dưới các ràng buộc bộ nhớ nghiêm trọng và chỉ có một quá trình thực thi trong không gian bộ nhớ / địa chỉ tại một thời điểm.

Đa nhiệm đã đạt được bằng cách hoán đổi một quy trình ra đĩa và hoán đổi một quy trình khác.

Bây giờ forkcuộc gọi hệ thống gần như giống nhau: nó đã hoán đổi một tiến trình ra đĩa, nhưng thay vì hoán đổi một tiến trình khác, nó đã sao chép trong bộ nhớ một id tiến trình khác và quay lại nó. Và đó là một thời điểm thích hợp để quá trình này quyết định chỉ là execmột thực thi khác.

fork+ execdo đó không thực sự phát sinh chi phí đáng chú ý khi sinh sản: dù sao bạn cũng phải trao đổi quy trình của mình sang đĩa và dù sao bạn cũng có hình ảnh quá trình cũ ở các vị trí bộ nhớ khả thi.

Với số lượng ngày càng tăng của các đơn vị quản lý bộ nhớ và bộ nhớ có sẵn và nhiều quá trình trong bộ nhớ, chi phí không đáng kể ban đầu của một ngã ba đã trở nên phiền toái hơn đối với một số kiến ​​trúc: do đó vforkđã ra đời.


2

Để làm cho điều này dễ hiểu nhất có thể, tôi sẽ sử dụng một phép loại suy. Hãy nướng một chiếc bánh!

Chúng tôi lấy cuốn sách công thức, và bắt đầu đọc và giải quyết trên một chiếc bánh đại hoàng dâu tây (yêu thích của tôi), với lớp vỏ làm bằng tay. Hầu như tất cả mọi thứ chúng ta cần là trong nhà bếp ngoại trừ trứng và trái cây, nhưng vì chúng ta sống trong một trang trại và trái cây đang vào mùa, nên đây không phải là vấn đề. vấn đề là lò bị hỏng và không có đủ thời gian để làm mọi thứ. Sẽ không tốt nếu có nhiều hơn một người trong tôi chứ?

ngã ba () để giải cứu. Bây giờ có hai tôi. và cả hai chúng tôi đi đến nhà bếp để bắt đầu làm vỏ bánh. Giáo sư. Vì vậy, chúng tôi nhìn vào sự trở lại từ ngã ba. Tôi nhận được một số lớn anh ta có số không, vì vậy tôi đi đến nhà bếp trong khi anh ta đi ra chuồng gà và vườn. Khi tôi đi qua lò nướng, tôi ngã ba lần nữa, nhìn vào giá trị trả về: bummer tôi nhận được số không. Anh ta tiếp tục với bột khi tôi nhìn chằm chằm vào cái lò bị hỏng. Tôi mở cửa, Không có ánh sáng, tôi đóng cửa. Có ai biết làm thế nào để sửa chữa một lò nướng?

exec () để giải cứu. Tôi với lấy vôn kế trên đai công cụ của mình, bóng đèn có thể được chẩn đoán, vì vậy tôi kiểm tra nguồn điện, Bộ ngắt thực sự bị vấp, sửa chữa dễ dàng. Khi tôi đi bộ đến bảng điều khiển, tôi thấy một người bạn đang hái đại hoàng. Kinh quá! Tôi thích bánh lụa sô cô la.

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.