Lý do của sự không ưu tiên của các nhân Linux cũ là gì?


15

Tại sao các nhà phát triển Linux đầu tiên chọn triển khai hạt nhân không ưu tiên? Có phải để lưu đồng bộ hóa?

Theo tôi biết, Linux được phát triển vào đầu những năm 90, khi PC có một bộ xử lý. Hạt nhân không ưu tiên nào mang lại lợi ích cho các PC như vậy? Tuy nhiên, tại sao lợi thế bị giảm bởi bộ xử lý đa lõi?

Câu trả lời:


25

Trong ngữ cảnh của nhân Linux, khi mọi người nói về tiền chế định, họ thường đề cập đến khả năng tự ngắt của hạt nhân - về cơ bản, chuyển đổi các tác vụ trong khi chạy mã hạt nhân. Cho phép điều này xảy ra khá phức tạp, đó có lẽ là lý do chính khiến phải mất một thời gian dài để hạt nhân được tạo ra trước.

Lúc đầu, hầu hết các mã kernel không thể bị gián đoạn, vì nó được bảo vệ bởi khóa kernel lớn. Khóa đó đã dần dần bị loại bỏ khỏi mã hạt nhân ngày càng nhiều, cho phép song song nhiều cuộc gọi đến kernel (điều này trở nên quan trọng hơn khi các hệ thống SMP trở nên phổ biến hơn). Nhưng điều đó vẫn không làm cho hạt nhân tự phát hiện trước; mất càng phát triển vẫn còn, mà đỉnh cao là PREEMPT_RTbộ vá mà cuối cùng đã được sáp nhập trong hạt nhân đường chính (và có khả năng trước empting các BKL anyway). Ngày nay, hạt nhân có thể được cấu hình để ít nhiều có thể phát hiện trước, tùy thuộc vào đặc tính thông lượng và độ trễ mà bạn theo sau; xem cấu hình kernel liên quan để biết chi tiết.

Như bạn có thể thấy từ các giải thích trong cấu hình kernel, pre-emption ảnh hưởng đến thông lượng và độ trễ, chứ không phải đồng thời. Trên các hệ thống CPU đơn, tiền chế tạo vẫn hữu ích vì nó cho phép các sự kiện được xử lý với thời gian phản ứng ngắn hơn; tuy nhiên, nó cũng dẫn đến thông lượng thấp hơn (vì kernel dành thời gian chuyển đổi tác vụ). Pre-emption cho phép bất kỳ CPU cụ thể nào, trong một hoặc nhiều hệ thống CPU, chuyển sang một tác vụ khác nhanh hơn. Yếu tố giới hạn trên các hệ thống đa CPU không phải là tiền chế tạo, đó là khóa, lớn hay nói cách khác: bất kỳ mã thời gian nào cũng bị khóa, điều đó có nghĩa là một CPU khác không thể bắt đầu thực hiện hành động tương tự.


11

Hạt nhân ưu tiên chỉ có nghĩa là không có Khóa hạt nhân lớn .

Linux đã có nhiều tác vụ được ưu tiên (tức là mã người dùng có thể được ưu tiên) kể từ giây phút đầu tiên (theo tôi biết, Linux 0.0.1 đầu tiên được Linus tải lên máy chủ funp ftp đã được đa nhiệm ưu tiên). Nếu bạn đã thực thi, ví dụ, nhiều quá trình nén hoặc biên dịch, chúng được thực thi song song từ giây phút đầu tiên.

Trái ngược với - tại thời điểm đó - Win31 được sử dụng rộng rãi. Trên Win31, nếu một tác vụ lấy CPU từ "kernel", theo mặc định, trách nhiệm của nó là xác định khi nào sẽ trao lại quyền điều khiển cho HĐH (hoặc cho các tác vụ khác). Nếu một quy trình không có hỗ trợ đặc biệt cho tính năng này (yêu cầu công việc lập trình bổ sung), thì trong khi thực hiện nó, tất cả các tác vụ khác đều bị treo. Ngay cả hầu hết các ứng dụng cơ bản được tích hợp vào Win31 đều hoạt động như vậy.

Đa nhiệm ưu tiên có nghĩa là các tác vụ không có cách nào để phân bổ CPU theo ý muốn. Thay vào đó, nếu khe thời gian của họ hết hạn, kernel sẽ lấy CPU ra khỏi chúng. Do đó, trong các hệ điều hành được ưu tiên, một quy trình được viết kém hoặc hoạt động kém không thể đóng băng HĐH hoặc tránh các quá trình khác chạy. Linux luôn được ưu tiên cho các quy trình không gian của người dùng.

Khóa hạt nhân lớn có nghĩa là trong một số trường hợp, bên trong không gian hạt nhân , vẫn có thể có một số khóa, ngăn các quá trình khác chạy mã được bảo vệ. Ví dụ: bạn không thể gắn kết nhiều hệ thống tệp đồng thời - nếu bạn đưa ra nhiều lệnh gắn kết, chúng vẫn được thực thi liên tiếp, bởi vì việc gắn kết những thứ cần thiết để phân bổ Khóa hạt nhân lớn.

Làm cho sự ưu tiên của kernel đã được yêu cầu để loại bỏ khóa kernel lớn này, tức là tạo mount và bất kỳ tác vụ nào khác để có thể chạy đồng thời. Đó là một công việc lớn.

Trong lịch sử, điều này thực sự cấp bách bởi sự hỗ trợ ngày càng tăng của SMP (hỗ trợ đa CPU). Trong lần đầu tiên, có các bo mạch chủ thực sự nhiều CPU. Sau đó, nhiều CPU ("lõi") đã được tích hợp vào một chip đơn, ngày nay, các bo mạch chính thực sự đa CPU đã rất hiếm (chúng thường có trong các hệ thống máy chủ tốn kém). Ngoài ra, các hệ thống đơn lõi thực sự (nơi chỉ có một cpu duy nhất, với một lõi đơn) là rất hiếm.

Do đó, câu trả lời cho câu hỏi của bạn không phải là "lý do không ưu tiên" là gì, bởi vì nó luôn luôn được ưu tiên. Câu hỏi thực sự là, điều gì đã khiến cho việc thực thi kernel được ưu tiên thực sự cần thiết . Câu trả lời là: tỷ lệ ngày càng tăng của các hệ thống nhiều CPU, nhiều lõi.


Tôi thực sự không hiểu :( Cho đến khi phiên bản kernel 2.4, chỉ có các quy trình người dùng là ưu tiên và kernel không phải là ưu tiên. Như tôi đã trả lời trước đó, tôi nghĩ rằng lý do là để lưu công việc trên các bế tắc đồng bộ hóa có thể xảy ra với sự ưu tiên triển khai trên quy trình đơn lõi. Bạn nghĩ gì?
Narden

@Narden Tôi không biết là bạn đã đọc nó. Khoảng 1.3 hoặc 2.0, chỉ một tiến trình duy nhất có thể ở trong không gian kernel, ngay cả khi nhiều tiến trình đang chạy. Giới hạn này đã được loại bỏ khoảng 2.0. Cho đến khoảng 2.4, đã có Khóa hạt nhân lớn (tức là gắn đồng thời nhiều hệ thống tập tin không hoạt động).
peterh - Phục hồi Monica

@Narden Nhưng nó không phải là đa nhiệm hợp tác, không cần quá trình nào để cố tình đưa CPU trở lại bộ lập lịch tác vụ. Có, lý do cho BKL có khả năng thực hiện việc này một cách chính xác là rất nhiều công việc: 1) khóa phải được chia 2) nên sử dụng cấu trúc dữ liệu không khóa vì có thể 3) khóa bị tách dẫn đến bế tắc / livelocks, đây thường là những lỗi đặc biệt bẩn, khó sửa, tất cả chúng đều được tìm thấy và sửa 4) tất cả các trình điều khiển nên được chuyển đến các thay đổi trong API lõi kernel.
peterh - Phục hồi Monica

Tôi đã đọc nó trong khi tôi đang tìm kiếm một câu trả lời, và nó cũng được cung cấp dưới dạng thông tin trong một khóa học mà tôi đang tham gia, được đặt tên là Hệ điều hành.
Narden

1
Khóa hạt nhân lớn đã ngăn các luồng khác xâm nhập vào kernel khi một luồng đang thực thi trong kernel. Chỉ có một luồng được cho phép, bởi vì kernel không được thiết kế ngay từ đầu với tính năng đa xử lý đối xứng. Tuy nhiên, một hạt nhân có nghĩa là một cái gì đó khác nhau. Theo truyền thống, bối cảnh thực hiện chỉ được thay đổi khi kernel trở lại không gian người dùng. Trong một kernel đã được pre-emptive, một thread có thể được pre-empted ở giữa mã kernel đang chạy.
Johan Myréen

3

Đây không phải là một câu trả lời kỹ thuật mà là một câu trả lời lịch sử cho câu hỏi cụ thể được đặt ra bởi OP: "Lý do của sự không ưu tiên của các nhân Linux cũ là gì?"

(Tôi giả sử, như được giải thích bởi @peterh trong câu trả lời và nhận xét của mình, rằng bằng cách "không phòng ngừa", OP đang đề cập đến một hoặc cả hai thực tế là chỉ có một quá trình người dùng có thể ở bên trong kernel (trong API) thời gian và / hoặc Khóa hạt nhân lớn.)

Linus Torvalds thích thú tìm hiểu cách các hệ điều hành hoạt động, và cách anh học là viết một cái. Mô hình và cơ sở và môi trường phát triển ban đầu của anh ấy là Minix, một hệ điều hành hiện có cho mục đích giáo dục (không phải là hệ điều hành sản xuất) không miễn phí (như trong nguồn mở, vào thời điểm đó - nó không miễn phí như trong bia, hoặc).

Vì vậy, anh ấy đã viết một kernel không có quyền ưu tiên (Khóa hạt nhân lớn được đề cập trong các câu trả lời khác) bởi vì đó là cách bạn làm nếu bạn muốn khởi động hệ điều hành mới của mình và chạy nhanh cho mục đích giáo dục: cách đó đơn giản hơn nhiều. Một hạt nhân để hỗ trợ đa chương trình đồng thời của các chương trình và thiết bị người dùng là đủ khó - cực kỳ khó để tạo ra hạt nhân đồng thời.

Nếu anh ta biết Linux sẽ trở nên phổ biến / hữu ích / quan trọng như thế nào ... thì có lẽ anh ta đã làm điều đó theo cách tương tự. (Chỉ IMO, tôi không biết anh ấy thực sự nghĩ gì.) Bởi vì bạn phải đi bộ trước khi bạn có thể chạy.

Và nó đã duy trì được như vậy trong một thời gian dài bởi vì a) có rất nhiều công việc khác phải làm để tạo ra Linux như ngày nay (hoặc thậm chí là ngày nay) và b) để thay đổi nó sẽ là một công việc khó khăn lớn (như đã giải thích trong các câu trả lời khác).

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.