Tổng quan Việc kiểm soát các thiết bị kết nối với máy tính là mối quan tâm chính của các nhà thiết kế hệ điều hành, các thiết bị IO rất khác nhau về chức năng và tốc độ, nên cần có nhiều phương thức khác nhau để điều khiển. Các phương thức này tạo thành hệ thống con IO của nhân. Công nghệ IO thể hiện hai xu hướng trái ngược nhau. Một mặt, chúng ta thấy tiêu chuẩn hóa ngày càng tăng của giao diện phần mềm và phần cứng. Xu hướng này giúp chúng ta kết hợp các thế hệ thiết bị cải tiến vào các máy tính và hệ điều hành hiện có. Mặt khác, chúng ta thấy ngày càng có nhiều loại thiết bị IO. Một số thiết bị mới không giống các thiết bị trước đây đến mức khó kết hợp chúng vào máy tính và hệ điều hành. Thách thức này được giải quyết bằng sự kết hợp giữa kỹ thuật phần cứng và phần mềm. Các phần tử phần cứng IO cơ bản , chẳng hạn như cổng, bus và bộ điều khiển thiết bị, phù hợp với nhiều loại thiết bị IO . Để đóng gói các chi tiết và điểm kỳ lạ của các thiết bị khác nhau, nhân của một hệ điều hành được cấu trúc để sử dụng các môđun trình điều khiển thiết bị. Trình điều khiển thiết bị trình bày một giao diện truy cập thiết bị thống nhất cho hệ thống phụ IO, giống như các lời gọi hệ thống cung cấp một giao diện tiêu chuẩn giữa ứng dụng và hệ điều hành. Phần cứng IO Máy tính vận hành rất nhiều loại thiết bị. Hầu hết phù hợp với các loại thiết bị lưu trữ chung (đĩa, băng), thiết bị truyền dẫn (kết nối mạng, Bluetooth) và thiết bị giao diện người dùng (màn hình, bàn phím, chuột, đầu vào và đầu ra). Tuy nhiên, chúng ta chỉ cần một vài khái niệm để hiểu cách các thiết bị được gắn vào và cách phần mềm có thể điều khiển phần cứng. Một thiết bị giao tiếp với hệ thống máy tính bằng cách gửi tín hiệu qua cáp hoặc thậm chí qua không khí. Thiết bị giao tiếp với máy thông qua điểm kết nối hoặc cổng. Nếu các thiết bị chia sẻ một bộ dây chung, kết nối được gọi là Bus. Về mặt điện tử, các thông điệp được truyền tải bằng các mẫu điện áp đặt vào dây dẫn với thời gian xác định. Hình 1: Cấu trúc bus PC điển hình. Bus được sử dụng rộng rãi trong kiến trúc máy tính và khác nhau về phương thức báo hiệu, tốc độ, thông lượng và phương thức kết nối. Trong hình, một bus PCI (bus hệ thống PC phổ biến) kết nối hệ thống con bộ xử lýbộ nhớ với các thiết bị nhanh và một bus mở rộng kết nối các thiết bị tương đối chậm, chẳng hạn như bàn phím, cổng nối tiếp và cổng USB. Ở phần phía trên bên phải của hình, bốn đĩa được kết nối với nhau trên một bus Giao diện Hệ thống Máy tính Nhỏ (SCSI) được cắm vào bộ điều khiển SCSI . Các bus phổ biến khác được sử dụng để kết nối các bộ phận chính của máy tính với nhau bao gồm PCI Express (PCIe), với thông lượng lên tới 16 GB mỗi giây và HyperTransport, với thông lượng lên tới 25GB mỗi giây. Một cổng IO thường bao gồm bốn thanh ghi, được gọi là các thanh ghi trạng thái, điều khiển, dữ liệu vào và dữ liệu ra. Thanh ghi dữ liệu vào được máy chủ đọc để nhận đầu vào. Thanh ghi dữ liệu ra được ghi bởi máy chủ để gửi đầu ra. Thanh ghi trạng thái chứa các bit mà máy chủ có thể đọc được. Thanh ghi điều khiển có thể được ghi bởi máy chủ để bắt đầu một lệnh hoặc để thay đổi chế độ của thiết bị. 2.1. Bỏ phiếu Giao thức hoàn chỉnh cho sự tương tác giữa máy chủ và bộ điều khiển có thể phức tạp, nhưng khái niệm bắt tay cơ bản thì đơn giản. Trong nhiều kiến trúc máy tính, ba chu kỳ hướng dẫn CPU là đủ để thăm dò một thiết bị: đọc thanh ghi thiết bị, logic và để trích xuất một bit trạng thái và phân nhánh nếu không phải là 0. Rõ ràng, hoạt động bỏ phiếu cơ bản là hiệu quả. Tuy nhiên, việc bỏ phiếu trở nên không hiệu quả khi nó được thử lặp đi lặp lại nhưng hiếm khi tìm thấy một thiết bị sẵn sàng hoạt động, trong khi quá trình xử lý CPU hữu ích khác vẫn chưa hoàn thành. Trong những trường hợp như vậy, có thể hiệu quả hơn nếu sắp xếp để bộ điều khiển phần cứng thông báo cho CPU khi thiết bị sẵn sàng hoạt động, thay vì yêu cầu CPU thăm dò liên tục để hoàn thành IO. Cơ chế phần cứng cho phép thiết bị thông báo cho CPU được gọi là ngắt. 2.2. Cơ chế ngắt Ngắt cơ bản hoạt động như sau: 1. Phần cứng CPU có một dây được gọi là dây yêu cầu ngắt mà CPU cảm nhận được sau khi thực hiện mọi lệnh. 2. Khi CPU phát hiện ra rằng bộ điều khiển đã xác nhận tín hiệu trên dòng yêu cầu ngắt, CPU sẽ thực hiện lưu trạng thái và chuyển sang quy trình xử lý ngắt tại một địa chỉ cố định trong bộ nhớ. 3. Trình xử lý ngắt xác định nguyên nhân gây ra ngắt, thực hiện xử lý cần thiết, thực hiện khôi phục trạng thái và thực hiện quay lại lệnh ngắt để đưa CPU về trạng thái thực thi trước khi ngắt. Hình 2: Chu trình IO điều khiển ngắt. Bộ điều khiển thiết bị tạo ra một ngắt bằng cách xác nhận tín hiệu trên dòng yêu cầu ngắt, CPU bắt ngắt và gửi nó đến bộ xử lý ngắt, và bộ xử lý sẽ xóa ngắt bằng cách bảo dưỡng thiết bị. Cơ chế ngắt cơ bản vừa được mô tả cho phép CPU phản hồi sự kiện không đồng bộ, chẳng hạn như khi bộ điều khiển thiết bị sẵn sàng hoạt động. Tuy nhiên, trong một hệ điều hành hiện đại, chúng ta cần các tính năng xử lý ngắt phức tạp hơn: 1. Cần khả năng trì hoãn xử lý ngắt trong quá trình xử lý quan trọng. 2. Cần một cách hiệu quả để gửi đến trình xử lý ngắt phù hợp cho một thiết bị mà không cần bỏ phiếu trước cho tất cả các thiết bị để xem thiết bị nào gây ra ngắt. 3. Cần các ngắt đa cấp để hệ điều hành có thể phân biệt giữa các ngắt có mức độ ưu tiên cao và thấp và có thể phản hồi với mức độ khẩn cấp phù hợp. Trong phần cứng, ba tính năng này được cung cấp bởi CPU và phần cứng của bộ điều khiển ngắt. Hầu hết các CPU đều có hai dòng yêu cầu ngắt: Một là ngắt không che được, được dành riêng cho các sự kiện như lỗi bộ nhớ không thể phục hồi; Hai là có thể che được: CPU có thể tắt nó trước khi thực hiện các chuỗi lệnh quan trọng không được ngắt. Ngắt có thể che dấu được bộ điều khiển thiết bị sử dụng để yêu cầu dịch vụ. Một hệ điều hành hiện đại tương tác với cơ chế ngắt theo nhiều cách. Tại thời điểm khởi động, hệ điều hành thăm dò các bus phần cứng để xác định thiết bị nào có mặt và cài đặt các trình xử lý ngắt tương ứng vào vectơ ngắt. Trong quá trình IO, các bộ điều khiển thiết bị khác nhau sẽ tăng các ngắt khi chúng sẵn sàng hoạt động. Các ngắt này biểu thị rằng đầu ra đã hoàn thành hoặc dữ liệu đầu vào có sẵn hoặc một lỗi đã được phát hiện. Cơ chế ngắt cũng được sử dụng để xử lý nhiều loại ngoại lệ. Một hệ điều hành có những cách sử dụng tốt khác cho cơ chế phần cứng và phần mềm hiệu quả giúp tiết kiệm một lượng nhỏ trạng thái bộ xử lý và sau đó gọi một thường trình đặc quyền trong nhân. Ví dụ, nhiều hệ điều hành sử dụng cơ chế ngắt để phân trang bộ nhớ ảo. Lỗi trang là một ngoại lệ làm tăng ngắt. Ngắt tạm dừng tiến trình hiện tại và chuyển đến trình xử lý lỗi trang trong kernel. Trình xử lý này lưu trạng thái của quy trình, di chuyển quy trình vào hàng đợi, thực hiện quản lý bộ đệm trang, lên lịch cho thao tác IO để tìm nạp trang, lên lịch cho một quy trình khác để tiếp tục thực thi và sau đó quay lại từ ngắt. Các ngắt cũng có thể được sử dụng để quản lý luồng điều khiển trong nhân. Kiến trúc nhân luồng rất phù hợp để thực hiện nhiều ưu tiên ngắt và để thực thi quyền ưu tiên xử lý ngắt so với xử lý nền trong các chương trình ứng dụng và nhân. Tóm lại, các ngắt được sử dụng trên khắp các hệ điều hành hiện đại để xử lý các sự kiện không đồng bộ và bẫy các thói quen chế độ giám sát trong nhân. Để cho phép thực hiện công việc khẩn cấp nhất trước tiên, các máy tính hiện đại sử dụng một hệ thống ưu tiên ngắt. Bộ điều khiển thiết bị, lỗi phần cứng và lệnh gọi hệ thống đều gây ra các ngắt để kích hoạt các quy trình nhân. Bởi vì các ngắt được sử dụng rất nhiều cho quá trình xử lý nhạy cảm với thời gian, nên việc xử lý ngắt hiệu quả là cần thiết để có hiệu suất hệ thống tốt. 2.3. Truy cập bộ nhớ trực tiếp Đối với một thiết bị thực hiện chuyển giao lớn, chẳng hạn như ổ đĩa, có vẻ lãng phí khi sử dụng bộ xử lý đa năng đắt tiền để xem các bit trạng thái và nạp dữ liệu vào thanh ghi bộ điều khiển mỗi lần một byte một quá trình được gọi là IO được lập trình (PIO). Nhiều máy tính tránh tạo gánh nặng cho CPU chính với PIO bằng cách giảm tải một số công việc này cho bộ xử lý có mục đích đặc biệt được gọi là bộ điều khiển truy cập bộ nhớ trực tiếp (DMA). Để bắt đầu truyền DMA, máy chủ ghi khối lệnh DMA vào bộ nhớ. Khối này chứa một con trỏ tới nguồn truyền, một con trỏ tới đích truyền và đếm số byte sẽ được truyền. CPU ghi địa chỉ của khối lệnh này vào bộ điều khiển DMA, sau đó tiếp tục với công việc khác. Bộ điều khiển DMA tiến hành vận hành bus bộ nhớ trực tiếp, đặt các địa chỉ trên bus để thực hiện chuyển giao mà không cần sự trợ giúp của CPU chính. Bộ điều khiển DMA đơn giản là một thành phần tiêu chuẩn trong tất cả các máy tính hiện đại, từ điện thoại thông minh đến máy tính lớn. Quá trình bắt tay giữa bộ điều khiển DMA và bộ điều khiển thiết bị được thực hiện thông qua một cặp dây gọi là yêu cầu DMA và xác nhận DMA. Bộ điều khiển thiết bị đặt một tín hiệu trên dây yêu cầu DMA khi có sẵn một từ dữ liệu để truyền. Tín hiệu này làm cho bộ điều khiển DMA nắm bắt bus bộ nhớ, đặt địa chỉ mong muốn trên dây địa chỉ bộ nhớ và đặt tín hiệu trên dây xác nhận DMA. Khi bộ điều khiển thiết bị nhận được tín hiệu xác nhận DMA, nó sẽ chuyển từ dữ liệu sang bộ nhớ và xóa tín hiệu yêu cầu DMA.Khi toàn bộ quá trình truyền hoàn tất, bộ điều khiển DMA sẽ ngắt CPU. Quá trình này được mô tả trong Hình 3. Khi bộ điều khiển DMA chiếm bus bộ nhớ, CPU tạm thời bị ngăn không cho truy cập bộ nhớ chính, mặc dù CPU vẫn có thể truy cập các mục dữ liệu trong bộ nhớ đệm chính và phụ của nó. Mặc dù việc đánh cắp chu kỳ này có thể làm chậm quá trình tính toán của CPU, nhưng việc giảm tải công việc truyền dữ liệu sang bộ điều khiển DMA nhìn chung sẽ cải thiện hiệu năng tổng thể của hệ thống. Một số kiến trúc máy tính sử dụng địa chỉ bộ nhớ vật lý cho DMA, nhưng một số khác thực hiện truy cập bộ nhớ ảo trực tiếp (DVMA), sử dụng địa chỉ ảo trải qua quá trình dịch sang địa chỉ vật lý. DVMA có thể thực hiện truyền giữa hai thiết bị được ánh xạ bộ nhớ mà không cần sự can thiệp của CPU hoặc sử dụng bộ nhớ chính. Hình 3: Các bước trong chuyển giao DMA. 2.4. Tóm tắt phần cứng IO IO gồm: Bus. Bộ điều khiển. Một cổng IO và các thanh ghi của nó. Mối quan hệ bắt tay giữa máy chủ và bộ điều khiển thiết bị. Việc thực hiện quá trình bắt tay này trong vòng bỏ phiếu hoặc thông qua các ngắt. Giảm tải công việc này cho bộ điều khiển DMA đối với các lần truyền lớn.
Trang 1ở đây chúng tôi tập hợp các phần lại với nhau để vẽ nên một bức tranh hoàn chỉnh về I/
O Đầu tiên, chúng tôi mô tả những điều cơ bản về phần cứng I/O , bởi vì bản chất của giao diện phần cứng đặt ra những hạn chế đối với các cơ sở bên trong của hệ điều hành Tiếp theo, chúng ta thảo luận về các dịch vụ I/O được cung cấp bởi hệ điều hành và hiện thân của các dịch vụ này trong giao diện I/O của ứng dụng Sau đó, chúng tôi giải thích cách hệ điều hành thu hẹp khoảng cách giữa giao diện phần cứng và giao diện ứng dụng Chúng tôi cũng thảo luận về cơ chế UNIX System V STREAM , cho phép một ứng dụng lắp ráp các đường dẫn mã trình điều khiển một cách linh hoạt Cuối cùng, chúng ta thảo luận về các khía cạnh hiệu suất của I/O và các nguyên tắc thiết kế hệ điều hành giúp cải thiện hiệu suất I/O
Việc kiểm soát các thiết bị kết nối với máy tính là mối quan tâm chính của các nhà thiết kế hệ điều hành Bởi vì các thiết bị I/O rất khác nhau về chức năng và tốc độ của chúng (hãy xem xét chuột, đĩa cứng và rô-bốt băng), nên cần có nhiều phương pháp khác nhau để điều khiển chúng Các phương thức này tạo thành hệ thống con I/O của nhân, phân tách phần còn lại của nhân khỏi sự phức tạp của việc quản lý các thiết bị I/O
Hai công việc chính của máy tính là I/O và xử lý Trong nhiều trường hợp, công việc chính là I/O và quá trình xử lý chỉ là ngẫu nhiên Chẳng hạn, khi chúng ta duyệt một trang web hoặc chỉnh sửa một tệp, mối quan tâm ngay lập tức của chúng ta là đọc hoặc nhập một số thông tin, chứ không phải tính toán câu trả lời
• Để khám phá cấu trúc của hệ thống con I/O của một hệ điều hành •
Để thảo luận về các nguyên tắc và sự phức tạp của phần cứng I/O •
Để giải thích các khía cạnh hiệu suất của phần cứng và phần mềm I/O
Hệ thống vào/ra
587
Trang 213.2 Phần cứng I/O
Công nghệ thiết bị I/O thể hiện hai xu hướng trái ngược nhau Một mặt, chúng ta thấy tiêu chuẩn hóa ngày càng tăng của giao diện phần mềm và phần cứng Xu hướng này giúp chúng tôi kết hợp các thế hệ thiết bị cải tiến vào các máy tính và hệ điều hành hiện có Mặt khác, chúng ta thấy ngày càng có nhiều loại thiết bị I/O Một số thiết bị mới không giống các thiết bị trước đây đến mức khó kết hợp chúng vào máy tính và hệ điều hành của chúng ta Thách thức này được giải quyết bằng sự kết hợp giữa kỹ thuật phần cứng và phần mềm Các phần tử phần cứng I/O cơ bản , chẳng hạn như cổng, bus và bộ điều khiển thiết
bị, phù hợp với nhiều loại thiết bị I/O Để đóng gói các chi tiết và điểm kỳ lạ của các thiết bị khác nhau, nhân của một hệ điều hành được cấu trúc để sử dụng các mô-đun trình điều khiển thiết bị Trình điều khiển thiết bị trình bày một giao diện truy cập thiết bị thống nhất cho hệ thống phụ I/O , giống như các lời gọi hệ thống cung cấp một giao diện tiêu chuẩn giữa ứng dụng và hệ điều hành
Máy tính vận hành rất nhiều loại thiết bị Hầu hết phù hợp với các loại thiết bị lưu trữ chung (đĩa, băng), thiết bị truyền dẫn (kết nối mạng, Bluetooth) và thiết bị giao diện người dùng (màn hình, bàn phím, chuột, đầu vào và đầu ra âm thanh) Các thiết bị khác chuyên dụng hơn, chẳng hạn như những thiết bị liên quan đến việc điều khiển máy bay phản lực Trong những chiếc máy bay này, con người đưa đầu vào cho máy tính bay thông qua cần điều khiển và bàn đạp chân, đồng thời máy tính gửi các lệnh đầu ra khiến động cơ di chuyển bánh lái và cánh tà cũng như nạp nhiên liệu cho động cơ Tuy nhiên , bất chấp sự
đa dạng đáng kinh ngạc của các thiết bị I/O , chúng ta chỉ cần một vài khái niệm để hiểu cách các thiết bị được gắn vào và cách phần mềm có thể điều khiển phần cứng
Một thiết bị giao tiếp với hệ thống máy tính bằng cách gửi tín hiệu qua cáp hoặc thậm chí qua không khí Thiết bị giao tiếp với máy thông qua điểm kết nối hoặc cổng—ví dụ: cổng nối tiếp Nếu các thiết bị chia sẻ một bộ dây chung, kết nối được gọi là xe buýt Bus là một tập hợp các dây dẫn và một giao thức được xác định rõ ràng để chỉ định
một tập hợp các thông báo có thể được gửi trên các dây dẫn Về mặt điện tử, các thông điệp được truyền tải bằng các mẫu điện áp đặt vào dây dẫn với thời gian xác định Khi thiết bị A có cáp cắm vào thiết bị B và thiết bị B có cáp cắm vào thiết bị C và thiết bị
C cắm vào một cổng trên máy tính, sự sắp xếp này được gọi là chuỗi xích Một chuỗi daisy thường hoạt động như một chiếc xe buýt
Bus được sử dụng rộng rãi trong kiến trúc máy tính và khác nhau về phương thức báo hiệu, tốc độ, thông lượng và phương thức kết nối Một cấu trúc bus PC điển hình xuất hiện trong Hình 13.1 Trong hình, một bus PCI ( bus hệ thống PC phổ biến ) kết nối hệ thống con bộ xử lý-bộ nhớ với các thiết bị nhanh và một bus mở rộng kết nối các thiết bị tương đối chậm, chẳng hạn như bàn phím, cổng nối tiếp và cổng USB Ở phần phía trên bên phải của hình, bốn đĩa được kết nối với nhau trên một bus Giao diện Hệ thống Máy tính Nhỏ (SCSI) được cắm vào bộ điều khiển SCSI Các bus phổ biến khác được sử dụng để kết nối các bộ phận chính của máy tính với nhau bao gồm PCI Express (PCIe), với thông lượng lên tới 16 GB mỗi giây và HyperTransport, với thông lượng lên tới 25 GB mỗi giây
Bộ điều khiển là một tập hợp các thiết bị điện tử có thể vận hành một cổng, một xe buýt hoặc một thiết bị Bộ điều khiển cổng nối tiếp là bộ điều khiển thiết bị đơn giản
Đó là một con chip (hoặc một phần của con chip) trong máy tính điều khiển các tín hiệu trên
Trang 3xe buýt SCSI
Bộ điều khiển đĩa IDE
đĩa màn hình
kỉ niệm
cổng nối tiếp
xe buýt PCI
đĩa đĩa
cầu/bộ điều khiển
bộ nhớ
đĩa
đĩa
cổng song song
13.2 Phần cứng I/O
dây của một cổng nối tiếp Ngược lại, bộ điều khiển bus SCSI không đơn giản Do giao thức SCSI phức tạp nên bộ điều khiển bus SCSI thường được triển khai dưới dạng bảng mạch riêng (hoặc bộ điều hợp máy chủ) cắm vào máy tính Nó thường chứa một bộ xử lý,
vi mã và một số bộ nhớ riêng để cho phép nó xử lý các thông báo giao thức SCSI Một
số thiết bị có bộ điều khiển tích hợp riêng Nếu bạn nhìn vào ổ đĩa, bạn sẽ thấy một bảng mạch được gắn ở một bên Bảng này là bộ điều khiển đĩa Ví dụ, nó triển khai phía đĩa của giao thức cho một số loại kết nối—SCSI hoặc Phần đính kèm Công nghệ Nâng cao Nối tiếp (SATA) Nó có vi mã và bộ xử lý để thực hiện nhiều tác vụ, chẳng hạn như lập bản đồ khu vực xấu, tìm nạp trước, tạo bộ đệm và lưu vào bộ nhớ đệm
Làm cách nào bộ xử lý có thể đưa ra các lệnh và dữ liệu cho bộ điều khiển để thực hiện chuyển giao I/O ? Câu trả lời ngắn gọn là bộ điều khiển có một hoặc nhiều thanh ghi dữ liệu và tín hiệu điều khiển Bộ xử lý giao tiếp với bộ điều khiển bằng cách đọc và ghi các mẫu bit trong các thanh ghi này Một cách mà giao tiếp này có thể xảy
ra là thông qua việc sử dụng các lệnh I/O đặc biệt chỉ định việc truyền một byte hoặc
từ tới một địa chỉ cổng I/O Lệnh I/O kích hoạt các đường bus để chọn thiết bị thích hợp và di chuyển các bit vào hoặc ra khỏi thanh ghi thiết bị Ngoài ra, bộ điều khiển thiết bị có thể hỗ trợ I/O ánh xạ bộ nhớ Trong trường hợp này, các thanh ghi điều khiển thiết bị được ánh xạ vào không gian địa chỉ của bộ xử lý CPU thực hiện các yêu cầu I/O bằng cách sử dụng các lệnh truyền dữ liệu tiêu chuẩn để đọc và ghi các thanh ghi điều khiển thiết bị tại các vị trí được ánh xạ của chúng trong bộ nhớ vật lý Một số hệ thống sử dụng cả hai kỹ thuật Chẳng hạn, PC sử dụng các lệnh I/O để điều khiển một số thiết bị và I/O được ánh xạ bộ nhớ để điều khiển các thiết bị khác Hình 13.2 cho thấy các địa chỉ cổng I/O thông thường dành cho PC Bộ điều khiển đồ họa có các cổng I/O cho các hoạt động điều khiển cơ bản, nhưng bộ điều khiển có bộ nhớ lớn-
Trang 4• Thanh ghi điều khiển có thể được ghi bởi máy chủ để bắt đầu một lệnh hoặc để thay đổi chế độ của thiết bị Chẳng hạn, một bit nhất định trong thanh ghi điều khiển của cổng nối tiếp chọn giữa giao tiếp song công hoàn toàn và bán song công, bit khác cho phép kiểm tra chẵn lẻ, bit thứ ba đặt độ dài từ thành 7 hoặc 8 bit và các bit khác chọn một trong các tốc độ được hỗ trợ bởi cổng nối tiếp.
vùng được ánh xạ để giữ nội dung màn hình Quá trình gửi đầu ra tới màn hình bằng cách ghi dữ liệu vào vùng ánh xạ bộ nhớ Bộ điều khiển tạo ra hình ảnh màn hình dựa trên nội dung của bộ nhớ này Kỹ thuật này là đơn giản để sử dụng Hơn nữa, việc ghi hàng triệu byte vào bộ nhớ đồ họa nhanh hơn việc đưa ra hàng triệu lệnh I/O Nhưng việc dễ dàng ghi vào bộ điều khiển I/O được ánh xạ bộ nhớ bị bù đắp bởi một nhược điểm Bởi vì một loại lỗi phần mềm phổ biến là ghi thông qua một con trỏ không chính xác đến một vùng bộ nhớ ngoài ý muốn, một thanh ghi thiết bị được ánh xạ bộ nhớ dễ bị sửa đổi do vô tình Tất nhiên, bộ nhớ được bảo vệ giúp giảm nguy cơ này
• Thanh ghi dữ liệu vào được máy chủ đọc để nhận đầu vào • Thanh ghi dữ liệu ra được ghi bởi máy chủ để gửi đầu ra • Thanh ghi trạng thái chứa các bit mà máy chủ có thể đọc được Các bit này cho biết các trạng thái, chẳng hạn như liệu lệnh hiện tại đã hoàn thành hay chưa, liệu một byte có sẵn
để đọc từ thanh ghi dữ liệu vào hay không và liệu có xảy ra lỗi thiết bị hay không
Các thanh ghi dữ liệu thường có kích thước từ 1 đến 4 byte Một số bộ điều khiển có chip FIFO có thể chứa vài byte dữ liệu đầu vào hoặc đầu ra để mở rộng dung lượng của bộ điều khiển ngoài kích thước của thanh ghi dữ liệu Chip FIFO có thể chứa một loạt dữ liệu nhỏ cho đến khi thiết bị hoặc máy chủ có thể nhận những dữ liệu đó
Một cổng I/O thường bao gồm bốn thanh ghi, được gọi là các thanh ghi trạng thái, điều khiển, dữ liệu vào và dữ liệu ra
Hình 13.2 Vị trí cổng I/O của thiết bị trên PC (một phần)
3F8–3FF
320–32F
người điều khiển trò chơi
bộ điều khiển đồ họa 378–37F
cổng nối tiếp (phụ)
Trang 5Đối với ví dụ này, máy chủ ghi đầu ra thông qua một cổng, phối hợp với bộ điều khiển bằng cách bắt tay như sau.
3 Máy chủ đặt bit sẵn sàng cho lệnh
Vòng lặp này được lặp lại cho mỗi byte
Giao thức hoàn chỉnh cho sự tương tác giữa máy chủ và bộ điều khiển có thể phức tạp, nhưng khái niệm bắt tay cơ bản thì đơn giản Chúng tôi giải thích bắt tay với một ví
dụ Giả sử rằng 2 bit được sử dụng để điều phối mối quan hệ người sản xuất-người tiêu dùng giữa bộ điều khiển và máy chủ Bộ điều khiển cho biết trạng thái của nó thông qua bit bận trong thanh ghi trạng thái (Nhớ lại rằng để thiết lập một bit có nghĩa là ghi 1 vào bit và xóa một bit có nghĩa là ghi 0 vào nó.) Bộ điều khiển thiết lập bit bận khi nó đang bận làm việc và xóa bit bận khi nó sẵn sàng hoạt động chấp nhận lệnh tiếp theo Máy chủ báo hiệu mong muốn của nó thông qua bit sẵn sàng cho lệnh trong thanh ghi lệnh Máy chủ đặt bit sẵn sàng cho lệnh khi có lệnh để bộ điều khiển thực thi
2 Máy chủ đặt bit ghi trong thanh ghi lệnh và ghi một byte vào thanh ghi dữ liệu
ra
6 Bộ điều khiển xóa bit sẵn sàng cho lệnh , xóa bit lỗi trong thanh ghi trạng thái
để cho biết rằng I/O của thiết bị đã thành công và xóa bit bận để cho biết rằng
nó đã kết thúc
Nó đọc thanh ghi xuất dữ liệu để lấy byte và thực hiện I/O cho thiết bị
Trong nhiều kiến trúc máy tính, ba chu kỳ hướng dẫn CPU là đủ để thăm dò một thiết bị: đọc thanh ghi thiết bị, logic và để trích xuất một bit trạng thái và phân nhánh nếu không phải là 0 Rõ ràng, hoạt động bỏ phiếu cơ bản là hiệu quả Tuy nhiên, việc
bỏ phiếu trở nên không hiệu quả khi nó được thử lặp đi lặp lại nhưng hiếm khi tìm thấy một thiết bị sẵn sàng hoạt động, trong khi quá trình xử lý CPU hữu ích khác vẫn chưa hoàn thành Trong những trường hợp như vậy, có thể hiệu quả hơn nếu sắp xếp để bộ điều khiển phần cứng thông báo cho CPU khi thiết bị sẵn sàng hoạt động, thay vì yêu cầu CPU thăm dò liên tục để hoàn thành I/O Cơ chế phần cứng cho phép thiết bị thông báo cho CPU được gọi là ngắt
1 Máy chủ liên tục đọc bit bận cho đến khi bit đó trở nên rõ ràng
hơi bận
5 Bộ điều khiển đọc thanh ghi lệnh và xem lệnh ghi
Ở bước 1, máy chủ đang bận chờ đợi hoặc bỏ phiếu: nó ở trong một vòng lặp, đọc đi đọc lại thanh ghi trạng thái cho đến khi bit bận trở nên rõ ràng Nếu bộ điều khiển
và thiết bị nhanh, phương pháp này là một phương pháp hợp lý Nhưng nếu thời gian chờ đợi có thể lâu, chủ nhà có lẽ nên chuyển sang nhiệm vụ khác Sau đó, làm thế nào để máy chủ biết khi nào bộ điều khiển không hoạt động? Đối với một số thiết bị, máy chủ phải nhanh chóng phục vụ thiết bị, nếu không dữ liệu sẽ bị mất Chẳng hạn, khi dữ liệu đang truyền vào cổng nối tiếp hoặc từ bàn phím, bộ đệm nhỏ trên bộ điều khiển sẽ bị tràn và dữ liệu sẽ bị mất nếu máy chủ đợi quá lâu trước khi quay lại đọc byte
4 Khi bộ điều khiển thông báo rằng bit sẵn sàng cho lệnh được đặt, nó sẽ đặt
13.2 Phần cứng I/O
13.2.1 Bỏ phiếu
591
Trang 6Hình 13.3 Chu trình I/O điều khiển ngắt.
Cơ chế ngắt cơ bản vừa được mô tả cho phép CPU phản hồi sự kiện không đồng bộ, chẳng hạn như khi bộ điều khiển thiết bị sẵn sàng hoạt động Tuy nhiên, trong một hệ điều hành hiện đại, chúng ta cần các tính năng xử lý ngắt phức tạp hơn.
13.2.2 Ngắt Cơ chế
hiện ra rằng bộ điều khiển đã xác nhận tín hiệu trên dòng yêu cầu ngắt,
một địa chỉ cố định trong bộ nhớ Trình xử lý ngắt xác định nguyên nhân gây ra ngắt, thực hiện xử lý cần thiết, thực hiện khôi phục trạng thái và thực hiện quay lại lệnh ngắt để đưa CPU về trạng thái thực thi trước khi ngắt Chúng tôi nói rằng bộ điều khiển thiết bị tạo ra một ngắt bằng cách xác nhận tín hiệu trên dòng yêu cầu ngắt, CPU bắt ngắt và gửi nó đến bộ
13.3 tóm tắt chu trình I/O điều khiển ngắt Chúng tôi nhấn mạnh đến việc quản lý ngắt trong chương này bởi vì ngay cả các hệ thống hiện đại chỉ có một người dùng cũng quản lý hàng trăm lần ngắt mỗi giây và các máy chủ quản lý hàng trăm nghìn lần mỗi giây.
CPU nhận ngắt, chuyển quyền điều khiển cho
bộ xử lý ngắt
2
trình xử lý ngắt
xử lý dữ liệu, trả về từ ngắt
khởi tạo I/O
Trang 73 Chúng ta cần các ngắt đa cấp để hệ điều hành có thể phân biệt giữa các ngắt có mức độ ưu tiên cao và thấp và có thể phản hồi với mức độ khẩn cấp phù hợp.
Dòng ngắt thứ hai có thể che được: CPU có thể tắt nó trước khi thực hiện các chuỗi lệnh quan trọng không được ngắt
Một hệ điều hành hiện đại tương tác với cơ chế ngắt theo nhiều cách Tại thời điểm khởi động, hệ điều hành thăm dò các bus phần cứng để xác định thiết bị nào có mặt và cài đặt các trình xử lý ngắt tương ứng vào vectơ ngắt Trong quá trình I/O, các bộ điều khiển thiết bị khác nhau sẽ tăng các ngắt khi chúng sẵn sàng hoạt động Các ngắt này biểu thị rằng đầu ra đã hoàn thành hoặc dữ liệu đầu vào có sẵn hoặc một lỗi đã được phát hiện Cơ chế ngắt cũng được sử dụng để xử lý nhiều loại ngoại lệ, chẳng hạn như chia cho 0, truy cập địa chỉ bộ nhớ được bảo vệ hoặc không tồn tại hoặc cố gắng thực hiện lệnh đặc quyền từ chế độ người dùng Các sự kiện kích hoạt các ngắt có một thuộc tính chung: chúng là các sự kiện xảy ra khiến hệ điều hành thực thi một thói quen độc lập, khẩn cấp
2 Chúng ta cần một cách hiệu quả để gửi đến trình xử lý ngắt phù hợp cho một thiết bị mà không cần bỏ phiếu trước cho tất cả các thiết bị để xem thiết bị nào gây ra ngắt
Hầu hết các CPU đều có hai dòng yêu cầu ngắt Một là ngắt không che được, được dành riêng cho các sự kiện như lỗi bộ nhớ không thể phục hồi
Cơ chế ngắt cũng thực hiện một hệ thống các mức ưu tiên ngắt Các mức này cho phép CPU trì hoãn việc xử lý các ngắt có mức ưu tiên thấp mà không che dấu tất cả các ngắt và giúp ngắt có mức ưu tiên cao có thể chiếm trước việc thực hiện ngắt có mức ưu tiên thấp
Hình 13.4 minh họa thiết kế vector ngắt cho bộ xử lý Intel Pentium Các sự kiện
từ 0 đến 31, không thể che giấu được, được sử dụng để báo hiệu các tình trạng lỗi khác nhau Các sự kiện từ 32 đến 255, có thể che được, được sử dụng cho các mục đích như ngắt do thiết bị tạo
1 Chúng tôi cần khả năng trì hoãn xử lý ngắt trong quá trình xử lý quan trọng
Trong phần cứng máy tính hiện đại, ba tính năng này được cung cấp bởi CPU và phần cứng của bộ điều khiển ngắt
Cơ chế ngắt chấp nhận một địa chỉ—một số chọn một thói quen xử lý ngắt cụ thể
từ một tập hợp nhỏ Trong hầu hết các kiến trúc, địa chỉ này là một phần bù trong bảng được gọi là vectơ ngắt Vectơ này chứa các địa chỉ bộ nhớ của các trình xử lý ngắt chuyên biệt Mục đích của cơ chế ngắt theo vectơ là giảm nhu cầu về một trình
xử lý ngắt duy nhất để tìm kiếm tất cả các nguồn ngắt có thể có để xác định cái nào cần dịch vụ Tuy nhiên, trong thực tế, máy tính có nhiều thiết bị hơn (và do đó, các trình xử lý ngắt) hơn là chúng có các thành phần địa chỉ trong vectơ ngắt
Một cách phổ biến để giải quyết vấn đề này là sử dụng chuỗi ngắt, trong đó mỗi phần
tử trong vectơ ngắt trỏ đến phần đầu của danh sách các trình xử lý ngắt Khi một ngắt được đưa ra, các trình xử lý trong danh sách tương ứng được gọi từng cái một, cho đến khi tìm thấy một trình xử lý có thể phục vụ yêu cầu Cấu trúc này là sự thỏa hiệp giữa chi phí hoạt động của một bảng ngắt khổng lồ và sự kém hiệu quả của việc gửi tới một trình xử lý ngắt duy nhất
Ngắt có thể che dấu được bộ điều khiển thiết bị sử dụng để yêu cầu dịch vụ
Trang 8Ví dụ: hãy xem xét một ví dụ về quá trình xử lý cần thiết để hoàn thành
Một hệ điều hành có những cách sử dụng tốt khác cho cơ chế phần cứng và phần mềm hiệu quả giúp tiết kiệm một lượng nhỏ trạng thái bộ xử lý và sau đó gọi một thường trình đặc quyền trong nhân Ví dụ, nhiều hệ điều hành sử dụng
cơ chế ngắt để phân trang bộ nhớ ảo Lỗi trang là một ngoại lệ làm tăng ngắt Ngắt tạm dừng tiến trình hiện tại và chuyển đến trình xử lý lỗi trang trong kernel Trình xử lý này lưu trạng thái của quy trình, di chuyển quy trình vào hàng đợi, thực hiện quản lý bộ đệm trang, lên lịch cho thao tác I/O để tìm nạp trang, lên lịch cho một quy trình khác để tiếp tục thực thi và sau đó quay lại từ ngắt
Các ngắt cũng có thể được sử dụng để quản lý luồng điều khiển trong nhân
Một ví dụ khác được tìm thấy trong việc thực hiện các cuộc gọi hệ thống Thông thường, một chương trình sử dụng lời gọi thư viện để thực hiện lời gọi
hệ thống Các thủ tục thư viện kiểm tra các đối số do ứng dụng đưa ra, xây dựng cấu trúc dữ liệu để truyền các đối số tới nhân, sau đó thực hiện một lệnh đặc biệt gọi là ngắt phần mềm hoặc bẫy Hướng dẫn này có một toán hạng xác định dịch vụ hạt nhân mong muốn Khi một quy trình thực thi lệnh bẫy, phần cứng ngắt sẽ lưu trạng thái của mã người dùng, chuyển sang chế độ kernel và gửi đến thủ tục kernel thực hiện dịch vụ được yêu cầu Cái bẫy được cấp mức
ưu tiên ngắt tương đối thấp so với mức ưu tiên được gán cho các ngắt của thiết bị—việc thực hiện lệnh gọi hệ thống thay mặt cho một ứng dụng ít khẩn cấp hơn
so với việc bảo dưỡng bộ điều khiển thiết bị trước khi hàng đợi FIFO của nó
bị tràn và mất dữ liệu
Hình 13.4 Bảng vectơ sự kiện bộ xử lý Intel Pentium
phân đoạn bộ đồng xử lý tràn (dành riêng) phân đoạn trạng thái tác vụ không hợp lệ phân đoạn không xuất hiện lỗi ngăn xếp
0
18 16
lỗi nặng 9
lỗi trang bảo vệ chung
7 5
14
gỡ lỗi ngoại lệ null ngắt điểm dừng
Trang 9Tóm lại, các ngắt được sử dụng trên khắp các hệ điều hành hiện đại để xử lý các sự kiện không đồng bộ và bẫy các thói quen chế độ giám sát trong nhân Để cho phép thực hiện công việc khẩn cấp nhất trước tiên, các máy tính hiện đại sử dụng một hệ thống ưu tiên ngắt Bộ điều khiển thiết bị, lỗi phần cứng và lệnh gọi hệ thống đều gây ra các ngắt để kích hoạt các quy trình nhân Bởi vì các ngắt được sử dụng rất nhiều cho quá trình xử lý nhạy cảm với thời gian, nên việc xử lý ngắt hiệu quả là cần thiết để có hiệu suất hệ thống tốt.
một đĩa đọc Một bước là sao chép dữ liệu từ không gian nhân vào bộ đệm người dùng
Do đó, một cặp trình xử lý ngắt thực hiện mã hạt nhân để hoàn thành việc đọc đĩa Trình xử lý ưu tiên cao ghi lại trạng thái I/O , xóa ngắt thiết bị, bắt đầu I/O đang chờ xử lý tiếp theo và tăng ngắt ưu tiên thấp để hoàn thành công việc Sau
đó, khi CPU không bận rộn với công việc có mức ưu tiên cao, ngắt có mức ưu tiên thấp sẽ được gửi đi Trình xử lý tương ứng hoàn thành I/O cấp người dùng bằng cách sao chép dữ liệu từ bộ đệm nhân vào không gian ứng dụng, sau đó gọi bộ lập lịch để đặt ứng dụng vào hàng đợi sẵn sàng
Những ưu tiên này cung cấp cho trình xử lý ngắt ưu tiên hơn mã ứng dụng và quản lý hạt nhân và thực hiện các mối quan hệ ưu tiên giữa các trình xử lý ngắt Các ưu tiên khiến bộ lập lịch luồng Solaris ưu tiên các trình xử lý ngắt có mức độ ưu tiên thấp để ưu tiên các trình xử lý ngắt có mức độ ưu tiên cao hơn và việc triển khai theo luồng cho phép phần cứng đa bộ xử lý chạy đồng thời một số trình xử lý ngắt Chúng tôi mô tả kiến trúc ngắt của Windows XP và UNIX trong Chương 19 và Phụ lục A, tương ứng
Đối với một thiết bị thực hiện chuyển giao lớn, chẳng hạn như ổ đĩa, có vẻ lãng phí khi sử dụng bộ xử lý đa năng đắt tiền để xem các bit trạng thái và nạp dữ liệu vào thanh ghi bộ điều khiển mỗi lần một byte—một quá trình được gọi là I/O được lập trình (PIO) Nhiều máy tính tránh tạo gánh nặng cho CPU chính với PIO bằng cách giảm tải một số công việc này cho bộ xử lý có mục đích đặc biệt được gọi là
bộ điều khiển truy cập bộ nhớ trực tiếp (DMA) Để bắt đầu truyền DMA , máy chủ ghi khối lệnh DMA vào bộ nhớ Khối này chứa một con trỏ tới nguồn truyền, một con trỏ tới đích truyền và đếm số byte sẽ được truyền CPU ghi địa chỉ của khối lệnh này vào bộ điều khiển DMA , sau đó tiếp tục với công việc khác Bộ điều khiển DMA tiến hành vận hành bus bộ nhớ trực tiếp, đặt các địa chỉ trên bus để thực hiện chuyển giao mà không cần sự trợ giúp của CPU chính Bộ điều khiển DMA đơn giản là một thành phần tiêu chuẩn trong tất cả các máy tính hiện đại, từ điện thoại thông minh đến máy tính lớn
Việc sao chép này tốn thời gian nhưng không khẩn cấp—nó không nên chặn việc xử lý ngắt có mức độ ưu tiên cao khác Một bước khác là bắt đầu I/O đang chờ xử lý tiếp theo cho ổ đĩa đó Bước này có mức độ ưu tiên cao hơn Nếu các đĩa được sử dụng hiệu quả, chúng ta cần bắt đầu I/O tiếp theo ngay sau khi hoàn thành I/O trước đó
Kiến trúc nhân luồng rất phù hợp để thực hiện nhiều ưu tiên ngắt và để thực thi quyền ưu tiên xử lý ngắt so với xử lý nền trong các thường trình ứng dụng và nhân Chúng tôi minh họa điểm này với nhân Solaris Trong Solaris, các trình xử lý ngắt được thực thi dưới dạng các luồng nhân Một loạt các ưu tiên cao được dành riêng cho các chủ đề này
13.2 Phần cứng I/O
13.2.3 Truy cập bộ nhớ trực tiếp
595
Trang 105 Bộ điều khiển DMA
xx
đĩa
6 khi C 0, DMA ngắt CPU để báo hiệu hoàn thành truyền
đĩa
bộ đệm
4 bộ điều khiển đĩa gửi từng byte đến bộ điều khiển DMA
DMA/bus/bộ điều khiển ngắt
đĩa
xe buýt PCI
2 trình điều khiển thiết
bị yêu cầu bộ điều khiển đĩa chuyển các byte C từ đĩa sang bộ đệm tại địa chỉ X
3 bộ điều khiển đĩa bắt đầu truyền DMA
chuyển byte vào
bộ đệm X, tăng địa chỉ bộ nhớ và giảm
C cho đến khi C 0
Bộ điều khiển đĩa IDE
1 trình điều khiển thiết bị được yêu cầu chuyển dữ liệu đĩa sang bộ đệm tại địa chỉ X
Bộ nhớ bus bộ nhớ CPU
đĩa
CPU
đệm
Khi toàn bộ quá trình truyền hoàn tất, bộ điều khiển DMA sẽ ngắt CPU
Hình 13.5 Các bước trong chuyển giao DMA
Trên các nhân chế độ được bảo vệ, hệ điều hành thường ngăn các tiến trình trực tiếp đưa ra các lệnh của thiết bị Kỷ luật này bảo vệ dữ liệu khỏi các vi phạm kiểm soát truy cập và cũng bảo vệ hệ thống khỏi việc sử dụng sai bộ điều khiển thiết bị có thể gây ra sự cố hệ thống Thay vào đó, hệ điều hành xuất các chức năng mà một quy trình đủ đặc quyền có thể sử dụng để truy cập các hoạt động cấp thấp trên phần cứng bên dưới Trên các nhân không có bảo vệ bộ nhớ, các tiến trình có thể truy cập trực tiếp vào bộ điều khiển thiết bị Truy cập trực tiếp này có thể được sử dụng để đạt được hiệu suất cao, vì nó có thể tránh giao tiếp nhân, chuyển ngữ cảnh và các lớp của phần mềm nhân Không may,
Quá trình bắt tay giữa bộ điều khiển DMA và bộ điều khiển thiết bị được thực hiện thông qua một cặp dây gọi là yêu cầu DMA và xác nhận DMA
nhưng việc giảm tải công việc truyền dữ liệu sang bộ điều khiển DMA nhìn chung
sẽ cải thiện hiệu năng tổng thể của hệ thống Một số kiến trúc máy tính sử dụng địa chỉ bộ nhớ vật lý cho DMA, nhưng một số khác thực hiện truy cập bộ nhớ ảo trực tiếp (DVMA), sử dụng địa chỉ ảo trải qua quá trình dịch sang địa chỉ vật
lý DVMA có thể thực hiện truyền giữa hai thiết bị được ánh xạ bộ nhớ mà không cần sự can thiệp của CPU hoặc sử dụng bộ nhớ chính
Bộ điều khiển thiết bị đặt một tín hiệu trên dây yêu cầu DMA khi có sẵn một từ
dữ liệu để truyền Tín hiệu này làm cho bộ điều khiển DMA nắm bắt bus bộ nhớ, đặt địa chỉ mong muốn trên dây địa chỉ bộ nhớ và đặt tín hiệu trên dây xác nhận DMA Khi bộ điều khiển thiết bị nhận được tín hiệu xác nhận DMA, nó sẽ chuyển từ
dữ liệu sang bộ nhớ và xóa tín hiệu yêu cầu DMA
Quá trình này được mô tả trong Hình 13.5 Khi bộ điều khiển DMA chiếm bus bộ nhớ, CPU tạm thời bị ngăn không cho truy cập bộ nhớ chính, mặc dù CPU vẫn có thể truy cập các mục dữ liệu trong bộ nhớ đệm chính và phụ của nó
Trang 11• Một cổng I/O và các thanh ghi của nó • Mối quan hệ bắt tay giữa máy chủ và bộ điều khiển thiết bị • Việc thực hiện quá trình bắt tay này trong vòng bỏ phiếu hoặc thông qua các ngắt • Giảm tải công việc này cho bộ điều khiển DMA đối với các lần truyền lớn
Giống như các vấn đề công nghệ phần mềm phức tạp khác, cách tiếp cận ở đây liên quan đến trừu tượng hóa, đóng gói và phân lớp phần mềm Cụ thể, chúng ta có thể trừu tượng hóa những khác biệt chi tiết trong các thiết bị I/O bằng cách xác định một số loại chung Mỗi loại chung được truy cập thông qua một bộ chức năng được tiêu chuẩn hóa—một giao diện Sự khác biệt được gói gọn trong các mô-đun hạt nhân được gọi là trình điều khiển thiết bị bên trong được tùy chỉnh phù hợp với các thiết bị cụ thể nhưng xuất một trong các giao diện tiêu chuẩn Hình 13.6 minh họa cách các phần liên quan đến I/O của nhân được cấu trúc trong các lớp phần mềm
Trong phần này, chúng tôi thảo luận về các kỹ thuật cấu trúc và giao diện cho hệ điều hành cho phép các thiết bị I/O được xử lý theo cách tiêu chuẩn, thống nhất
Ví dụ, chúng tôi giải thích cách ứng dụng có thể mở tệp trên đĩa mà không cần biết loại đĩa đó là gì và cách có thể thêm đĩa mới cũng như các thiết bị khác vào máy tính mà không làm gián đoạn hệ điều hành
• Bộ điều khiển
• Xe buýt
13.2.4 Tóm tắt phần cứng I/O Mặc dù các khía cạnh phần cứng của I/O rất phức tạp khi được xem xét ở mức độ chi tiết của thiết kế phần cứng điện tử, các khái niệm mà chúng tôi vừa mô tả cũng đủ để giúp chúng tôi hiểu được nhiều tính năng của I/O của các hệ điều hành Hãy xem lại các khái niệm chính:
Chúng tôi đã đưa ra một ví dụ cơ bản về quá trình bắt tay diễn ra giữa bộ điều khiển thiết bị và máy chủ trước đó trong phần này Trên thực tế, sự đa dạng của các thiết bị có sẵn đặt ra một vấn đề cho những người triển khai hệ điều hành Mỗi loại thiết bị có bộ khả năng, định nghĩa bit điều khiển và giao thức riêng để tương tác với máy chủ—và tất cả chúng đều khác nhau Làm thế nào hệ điều hành có thể được thiết kế để chúng ta có thể gắn các thiết bị mới vào máy tính mà không cần viết lại hệ điều hành? Và khi các thiết bị khác nhau rất nhiều, làm thế nào hệ điều hành có thể cung cấp giao diện I/O thống nhất, thuận tiện cho các ứng dụng? Chúng tôi giải quyết những câu hỏi tiếp theo
nó can thiệp vào an ninh hệ thống và sự ổn định Xu hướng trong các hệ điều hành
có mục đích chung là bảo vệ bộ nhớ và thiết bị để hệ thống có thể cố gắng bảo vệ chống lại các ứng dụng có lỗi hoặc độc hại
Mục đích của lớp trình điều khiển thiết bị là che giấu sự khác biệt giữa các
bộ điều khiển thiết bị khỏi hệ thống con I/O của nhân, giống như các lệnh gọi hệ thống I/O gói gọn hành vi của các thiết bị trong một vài lớp chung che giấu sự khác biệt về phần cứng khỏi các ứng dụng Tạo hệ thống con I/O
13.3 Giao diện I/O của ứng dụng
Trang 12phần mềm
phần cứng
Hình 13.6 Một cấu trúc I/O hạt nhân
bộ điều khiển thiết bị chuột
trình điều khiển thiết
bị bàn phím
bộ điều khiển thiết bị mềm
xe buýt PCI
trình điều khiển thiết
bị chuột
Bộ điều khiển thiết bị ATAPI
• • •
Trình điều khiển thiết
bị ATAPI
thiết
bị SCSI
Trình điều khiển thiết bị SCSI
Bộ điều khiển thiết bị bus PCI
bàn phìm chuột
Thiết
bị ATAPI (đĩa, băng, ổ đĩa)
nhân
Trình điều khiển thiết
bị bus PCI
hệ thống con I/O hạt nhân
trình điều khiển thiết bị mềm
Bộ điều khiển thiết bị SCSI
• • •
ổ đĩa mềm
bộ điều khiển thiết bị bàn phím
• • •
độc lập với phần cứng giúp đơn giản hóa công việc của nhà phát triển hệ điều hành Nó cũng mang lại lợi ích cho các nhà sản xuất phần cứng Họ thiết kế các thiết bị mới để tương thích với giao diện bộ điều khiển máy chủ hiện có (chẳng hạn như SATA) hoặc họ viết trình điều khiển thiết bị để giao tiếp phần cứng mới với các hệ điều hành phổ biến Do đó, chúng ta có thể gắn các thiết bị ngoại vi mới vào máy tính mà không cần đợi nhà cung cấp hệ điều hành phát triển mã hỗ trợ
• Đồng bộ hoặc không đồng bộ Một thiết bị đồng bộ thực hiện truyền dữ liệu với thời gian phản hồi có thể dự đoán được, phối hợp với các khía cạnh khác của hệ thống Một thiết bị không đồng bộ thể hiện thời gian phản hồi bất thường hoặc không thể đoán trước không được phối hợp với các sự kiện máy tính khác • Có thể chia sẻ hoặc dành riêng Một thiết bị có thể chia sẻ có thể được sử dụng đồng thời bởi một
số quy trình hoặc luồng; một thiết bị chuyên dụng không thể
Thật không may cho các nhà sản xuất phần cứng-thiết bị, mỗi loại hệ điều hành có các tiêu chuẩn riêng cho giao diện trình điều khiển thiết bị Một thiết bị nhất định
có thể đi kèm với nhiều trình điều khiển thiết bị—ví dụ: trình điều khiển cho Windows, Linux, AIX và Mac OS X Các thiết bị khác nhau ở nhiều kích thước, như được minh họa trong Hình 13.7
• Truy cập tuần tự hoặc ngẫu nhiên Thiết bị tuần tự truyền dữ liệu theo thứ tự cố định do thiết bị xác định, trong khi người dùng thiết bị truy cập ngẫu nhiên có thể hướng dẫn thiết bị tìm kiếm bất kỳ vị trí lưu trữ dữ liệu có sẵn nào
• Dòng ký tự hoặc khối Thiết bị dòng ký tự truyền từng byte một, trong khi thiết bị khối truyền một khối byte dưới dạng đơn vị
Trang 13Hình 13.7 Đặc điểm của thiết bị I/O.
599
modem tuần tự
ngẫu nhiên phương pháp truy cập
đồng bộ không đồng bộ lịch trình chuyển nhượng
diện mạo
bàn phím băng
hướng vào/ra
khối ký tự chế độ truyền dữ liệu
độ trễ tìm kiếm thời gian độ trễ tốc độ truyền giữa các hoạt động
biến thể
Ổ ĐĨA CD
chỉ đọc ghi chỉ đọc-ghi
thí dụ
bàn phím băng chuyên dụng
có thể chia sẻ chia sẻ
Đĩa điều khiển đồ họa CD-ROM
đĩa đầu cuối
tốc độ thiết bị
13.3 Giao diện I/O của ứng dụng
vài gigabyte mỗi giây
• Tốc độ hoạt động Tốc độ thiết bị nằm trong khoảng từ vài byte trên giây đến
Một số hệ điều hành cung cấp một tập hợp các cuộc gọi hệ thống cho các thiết bị hiển thị đồ họa, video và âm thanh
• Đọc–ghi, chỉ đọc hoặc chỉ viết Một số thiết bị thực hiện cả đầu vào và đầu ra, nhưng những thiết bị khác chỉ hỗ trợ một hướng truyền dữ liệu
Hầu hết các hệ điều hành cũng có một lối thoát (hoặc cửa sau) chuyển các lệnh tùy
ý từ ứng dụng sang trình điều khiển thiết bị một cách rõ ràng Trong UNIX, lệnh gọi
hệ thống này là ioctl() (đối với “ điều khiển I/O”) Lệnh gọi hệ thống ioctl() cho phép một ứng dụng truy cập vào bất kỳ chức năng nào có thể được thực hiện bởi bất kỳ trình điều khiển thiết bị nào mà không cần phải phát minh ra một lệnh gọi hệ thống mới Cuộc gọi hệ thống ioctl() có ba đối số Đầu tiên là một bộ mô tả tệp kết nối ứng dụng với trình điều khiển bằng cách tham chiếu đến một thiết bị phần cứng được quản
lý bởi trình điều khiển đó Thứ hai là một số nguyên chọn một trong các lệnh được triển khai trong trình điều khiển Thứ ba là một con trỏ tới cấu trúc dữ liệu tùy ý trong bộ nhớ cho phép ứng dụng và trình điều khiển giao tiếp bất kỳ thông tin hoặc dữ liệu điều khiển cần thiết nào
Với mục đích truy cập ứng dụng, nhiều sự khác biệt trong số này bị ẩn bởi hệ điều hành và các thiết bị được nhóm thành một số loại thông thường Các kiểu truy cập thiết
bị kết quả đã được tìm thấy là hữu ích và có thể áp dụng rộng rãi Mặc dù các cuộc gọi
hệ thống chính xác có thể khác nhau giữa các hệ điều hành, nhưng các danh mục thiết
bị khá chuẩn Các quy ước truy cập chính bao gồm I/O khối, I/O dòng ký tự , truy cập tệp ánh xạ bộ nhớ và ổ cắm mạng Các hệ điều hành cũng cung cấp các lệnh gọi hệ thống đặc biệt để truy cập một vài thiết bị bổ sung, chẳng hạn như đồng hồ thời gian trong ngày và bộ đếm thời gian
Trang 14Bản thân hệ điều hành, cũng như các ứng dụng đặc biệt như hệ thống quản lý cơ sở dữ liệu, có thể thích truy cập thiết bị khối dưới dạng một mảng khối tuyến tính đơn giản Chế độ truy cập này đôi khi được gọi là I/O thô Nếu ứng dụng thực hiện bộ đệm của riêng nó, thì việc sử dụng hệ thống tệp sẽ gây ra bộ đệm bổ sung, không cần thiết Tương tự như vậy, nếu một ứng dụng cung cấp khóa riêng cho các khối tệp hoặc vùng, thì bất kỳ dịch vụ khóa nào của hệ điều hành ít nhất cũng
sẽ dư thừa và tệ nhất là mâu thuẫn Để tránh những xung đột này, quyền truy cập thiết bị thô sẽ chuyển quyền kiểm soát thiết bị trực tiếp đến ứng dụng, cho phép hệ điều hành tránh xa Thật không may, không có dịch vụ hệ điều hành nào được thực hiện trên thiết bị này Một thỏa hiệp đang trở nên phổ biến là hệ điều hành cho phép một chế độ hoạt động trên một tệp vô hiệu hóa bộ đệm và khóa Trong thế giới UNIX , điều này được gọi là I/O trực tiếp
Quyền truy cập tệp được ánh xạ bộ nhớ có thể được xếp lớp trên trình điều khiển thiết bị khối
Bởi vì các đặc điểm về hiệu suất và địa chỉ của I/O mạng khác biệt đáng kể so với các đặc điểm của I/O đĩa, hầu hết các hệ điều hành đều cung cấp một mạng
Thay vì cung cấp các thao tác đọc và ghi, giao diện ánh xạ bộ nhớ cung cấp quyền truy cập vào bộ lưu trữ đĩa thông qua một mảng byte trong bộ nhớ chính Cuộc gọi hệ thống ánh xạ tệp vào bộ nhớ trả về địa chỉ bộ nhớ ảo chứa bản sao của tệp Việc truyền dữ liệu thực tế chỉ được thực hiện khi cần thiết để đáp ứng quyền truy cập vào hình ảnh bộ nhớ Bởi vì quá trình truyền được xử lý theo
cơ chế giống như cơ chế được sử dụng để truy cập bộ nhớ ảo theo phân trang theo yêu cầu, I/O được ánh xạ bộ nhớ hiệu quả Ánh xạ bộ nhớ cũng thuận tiện cho người lập trình—việc truy cập tệp ánh xạ
bộ nhớ cũng đơn giản như đọc và ghi vào bộ nhớ Các hệ điều hành cung cấp bộ nhớ ảo thường sử dụng giao diện ánh xạ cho các dịch vụ nhân Chẳng hạn, để thực thi một chương trình, hệ điều hành ánh
xạ tệp thực thi vào bộ nhớ và sau đó chuyển điều khiển đến địa chỉ mục nhập của tệp thực thi Giao diện ánh xạ cũng thường được sử dụng để truy cập kernel vào không gian hoán đổi trên đĩa
Giao diện thiết bị khối nắm bắt tất cả các khía cạnh cần thiết để truy cập ổ đĩa và các thiết bị định hướng khối khác Thiết bị phải hiểu các lệnh như đọc() và viết() Nếu nó là một thiết bị truy cập ngẫu nhiên, nó cũng sẽ có lệnh seek() để chỉ định khối nào sẽ được chuyển tiếp theo Các ứng dụng thường truy cập một thiết bị như vậy thông qua giao diện hệ thống tệp Chúng ta có thể thấy rằng read(), write() và seek() nắm bắt các hành vi thiết yếu của các thiết bị lưu trữ khối, để các ứng dụng được cách ly khỏi sự khác biệt ở mức độ thấp giữa các thiết bị đó
Bàn phím là một ví dụ về thiết bị được truy cập thông qua giao diện luồng ký tự Các cuộc gọi hệ thống cơ bản trong giao diện này cho phép một ứng dụng get () hoặc put() một ký tự Ngoài giao diện này, các thư viện có thể được xây dựng để cung cấp khả năng truy cập theo từng dòng, với các dịch vụ đệm và chỉnh sửa (ví dụ: khi người dùng nhập một khoảng lùi, ký tự trước đó sẽ bị xóa khỏi luồng đầu vào) Kiểu truy cập này thuận tiện cho các thiết bị đầu vào như bàn phím, chuột và modem tạo ra dữ liệu cho đầu vào “một cách tự phát” —tức là vào những thời điểm mà ứng dụng không nhất thiết phải dự đoán Kiểu truy cập này cũng tốt cho các thiết bị đầu ra như máy in và bảng âm thanh, phù hợp với khái niệm về luồng byte tuyến tính một cách tự nhiên
13.3.1 Thiết bị khối và ký tự
13.3.2 Thiết Bị Mạng
Trang 15Hầu hết các máy tính đều có đồng hồ phần cứng và bộ hẹn giờ cung cấp ba chức năng cơ bản:
Hãy nghĩ về ổ cắm điện trên tường: bất kỳ thiết bị điện nào cũng có thể được cắm vào Tương tự, hệ thống gọi giao diện ổ cắm cho phép ứng dụng tạo ổ cắm, kết nối ổ cắm cục bộ với địa chỉ từ xa (cắm ứng dụng này vào socket được tạo bởi một ứng dụng khác),
để lắng nghe bất kỳ ứng dụng từ xa nào cắm vào ổ cắm cục bộ và để gửi và nhận các gói qua kết nối Để hỗ trợ việc triển khai các máy chủ, giao diện ổ cắm cũng cung cấp một chức năng gọi là select() để quản lý một tập hợp các ổ cắm Một cuộc gọi đến select() trả về thông tin về ổ cắm nào có gói đang chờ nhận và ổ cắm nào có chỗ để chấp nhận gói được gửi Việc sử dụng select() loại bỏ bỏ phiếu và chờ đợi bận rộn mà nếu không
sẽ cần thiết cho I/O mạng Các chức năng này đóng gói các hành vi thiết yếu của mạng,
hỗ trợ rất nhiều cho việc tạo các ứng dụng phân tán có thể sử dụng bất kỳ ngăn xếp giao thức và phần cứng mạng cơ bản nào
Hệ thống con I/O của đĩa sử dụng nó để gọi việc xóa định kỳ các bộ đệm đệm bẩn vào đĩa
và hệ thống con mạng sử dụng nó để hủy các hoạt động đang diễn ra quá chậm do tắc nghẽn hoặc lỗi mạng Hệ điều hành cũng có thể cung cấp giao diện cho các quy trình người dùng để sử dụng bộ hẹn giờ Hệ điều hành có thể hỗ trợ nhiều yêu cầu hẹn giờ hơn
số kênh phần cứng hẹn giờ bằng cách mô phỏng đồng hồ ảo Để làm như vậy, hạt nhân (hoặc trình điều khiển thiết bị hẹn giờ) duy trì một danh sách các ngắt mong muốn theo quy trình riêng của nó và theo yêu cầu của người dùng, được sắp xếp theo thứ tự thời gian sớm nhất Nó thiết lập bộ đếm thời gian cho
Giao diện I/O khác với giao diện read()–write()–seek() được sử dụng cho đĩa Một giao diện có sẵn trong nhiều hệ điều hành, bao gồm cả UNIX và Windows, là giao diện ổ cắm
mạng
Phần cứng để đo thời gian đã trôi qua và kích hoạt các hoạt động được gọi là bộ định thời khoảng thời gian có thể lập trình Nó có thể được thiết lập để đợi một khoảng thời gian nhất định rồi tạo ngắt và nó có thể được đặt để thực hiện việc này một lần hoặc lặp lại quy trình để tạo ngắt định kỳ Bộ lập lịch sử dụng cơ chế này để tạo ra một ngắt sẽ chặn trước một quá trình ở cuối lát cắt thời gian của nó
• Đưa ra thời gian đã trôi qua • Đặt hẹn giờ để kích hoạt thao tác X tại thời điểm T
Mục A.9
Các chức năng này được sử dụng nhiều bởi hệ điều hành, cũng như các ứng dụng nhạy cảm với thời gian Thật không may, các cuộc gọi hệ thống thực hiện các chức năng này không được tiêu chuẩn hóa trên các hệ điều hành
• Đưa ra thời gian hiện tại
Nhiều cách tiếp cận khác để giao tiếp giữa các quá trình và giao tiếp mạng đã được thực hiện Chẳng hạn, Windows cung cấp một giao diện cho thẻ giao diện mạng và giao diện thứ hai cho các giao thức mạng Trong UNIX, vốn có lịch sử lâu đời như là nền tảng chứng minh cho công nghệ mạng, chúng ta tìm thấy các đường ống bán song công, FIFO song công hoàn toàn , STREAMS song công hoàn toàn , hàng đợi thông báo và ổ cắm Thông tin về mạng UNIX được đưa ra trong
13.3 Giao diện I/O của ứng dụng
13.3.3 Đồng hồ và Bộ hẹn giờ
601
Trang 16Trên nhiều máy tính, tốc độ ngắt do đồng hồ phần cứng tạo ra là từ 18 đến 60 tick mỗi giây
Độ phân giải này là thô, vì một máy tính hiện đại có thể thực hiện hàng trăm triệu lệnh mỗi giây
Độ chính xác của trình kích hoạt bị giới hạn bởi độ phân giải thô của bộ hẹn giờ, cùng với chi phí duy trì đồng hồ ảo Ngoài ra, nếu các dấu tích của bộ đếm thời gian được sử dụng để duy trì đồng hồ thời gian trong ngày của hệ thống, thì đồng hồ hệ thống có thể trôi Trong hầu hết các máy tính, đồng hồ phần cứng được xây dựng từ bộ đếm tần số cao Trong một số máy tính, giá trị của bộ đếm này có thể được đọc từ thanh ghi thiết bị, trong trường hợp đó, bộ đếm có thể được coi là đồng hồ có độ phân giải cao Mặc dù đồng hồ này không tạo ra các khoảng thời gian gián đoạn, nhưng nó đưa ra các phép đo chính xác về các khoảng thời gian
Một số quy trình cấp người dùng cần I/O không chặn Một ví dụ là giao diện người dùng nhận
dữ liệu đầu vào từ bàn phím và chuột trong khi xử lý và hiển thị dữ liệu trên màn hình Một ví
dụ khác là một ứng dụng video đọc các khung hình từ một tệp trên đĩa đồng thời giải nén và hiển thị đầu ra trên màn hình
Một giải pháp thay thế cho lệnh gọi hệ thống không chặn là lệnh gọi hệ thống không đồng bộ Một cuộc gọi không đồng bộ trả về ngay lập tức mà không cần đợi I/O hoàn tất Ứng dụng tiếp tục thực thi mã của nó Việc hoàn thành I/O tại một thời điểm nào đó trong tương lai được thông báo tới ứng dụng, thông qua cài đặt của một số biến trong không gian địa chỉ của ứng dụng hoặc thông qua việc kích hoạt tín hiệu hoặc ngắt phần mềm hoặc quy trình gọi lại được thực thi bên ngoài luồng điều khiển tuyến tính của ứng dụng Sự khác biệt giữa các cuộc gọi hệ thống không chặn và không đồng bộ là một read() không chặn trả về ngay lập tức với bất kỳ dữ liệu nào có sẵn—đầy đủ
số byte được yêu cầu, ít hơn hoặc không có gì cả Một cuộc gọi read() không đồng bộ yêu cầu chuyển sẽ được thực hiện toàn bộ nhưng sẽ hoàn thành vào một thời điểm nào đó trong tương lai Hai phương thức I/O này được thể hiện trong Hình 13.8
thời gian sớm nhất Khi bộ đếm thời gian bị gián đoạn, hạt nhân báo hiệu cho người yêu cầu và tải lại bộ đếm thời gian với thời gian sớm nhất tiếp theo
Một khía cạnh khác của giao diện lời gọi hệ thống liên quan đến sự lựa chọn giữa chặn I/O và không chặn I/O Khi một ứng dụng thực hiện cuộc gọi hệ thống chặn , việc thực thi ứng dụng sẽ bị đình chỉ Ứng dụng được chuyển từ hàng đợi chạy của hệ điều hành sang hàng đợi Sau khi cuộc gọi
hệ thống hoàn tất, ứng dụng được chuyển trở lại hàng đợi chạy, nơi nó đủ điều kiện để tiếp tục thực thi Khi nó tiếp tục thực thi, nó sẽ nhận các giá trị được trả về bởi lệnh gọi hệ thống Các hành động vật lý được thực hiện bởi các thiết bị I/O nói chung là không đồng bộ—chúng mất một lượng thời gian khác nhau hoặc không thể đoán trước Tuy nhiên, hầu hết các hệ điều hành sử dụng lệnh gọi hệ thống chặn cho giao diện ứng dụng, bởi vì mã ứng dụng chặn dễ hiểu hơn mã ứng dụng không chặn
Một cách mà người viết ứng dụng có thể thực thi chồng chéo với I/O là viết một ứng dụng đa luồng Một số luồng có thể thực hiện chặn cuộc gọi hệ thống, trong khi những luồng khác tiếp tục thực hiện Một số hệ điều hành cung cấp các cuộc gọi hệ thống I/O không chặn Một cuộc gọi không chặn không dừng việc thực thi ứng dụng trong một thời gian dài Thay vào đó, nó trả về nhanh chóng, với giá trị trả về cho biết có bao nhiêu byte đã được truyền
13.3.4 I/O không chặn và không đồng bộ
Trang 17Nó chỉ định các lần đọc mong muốn cho một số thiết bị trong một cuộc gọi hệ thống và trả về ngay khi bất kỳ một trong số chúng hoàn thành.
Thông thường, chúng không tiếp xúc với người dùng hoặc ứng dụng mà được chứa trong hoạt động của hệ điều hành Đĩa và mạng I/O là những ví dụ hữu ích Theo mặc định, khi một ứng dụng đưa
ra yêu cầu gửi mạng hoặc yêu cầu ghi đĩa, hệ điều hành sẽ ghi nhận yêu cầu đó, đệm I /O và quay lại ứng dụng Khi có thể, để tối ưu hóa hiệu suất tổng thể của hệ thống, hệ điều hành sẽ hoàn thành yêu cầu Nếu xảy ra lỗi hệ thống trong thời gian tạm thời, ứng dụng sẽ mất mọi yêu cầu “đang chạy”
Do đó, các hệ điều hành thường đặt giới hạn về thời gian chúng sẽ đệm một yêu cầu Ví dụ , một
số phiên bản của UNIX xóa bộ đệm đĩa của chúng sau mỗi 30 giây hoặc mỗi yêu cầu được xóa trong vòng 30 giây kể từ khi nó xuất hiện Tính nhất quán của dữ liệu trong các ứng dụng được duy trì bởi hạt nhân, đọc dữ liệu từ bộ đệm của nó trước khi đưa ra yêu cầu I/O cho thiết bị, đảm bảo rằng dữ liệu chưa được ghi vẫn được trả lại cho trình đọc yêu cầu Lưu ý rằng nhiều luồng thực hiện I/O cho cùng một tệp có thể không nhận được dữ liệu nhất quán, tùy thuộc vào cách nhân thực hiện I/O của nó Trong trường hợp này, chủ đề có thể cần phải sử dụng giao thức khóa Một số yêu cầu I/O cần được thực hiện ngay lập tức, do đó, các lệnh gọi hệ thống I/O thường có một cách để chỉ ra rằng một yêu cầu nhất định hoặc I/O tới một thiết bị cụ thể phải được thực hiện đồng bộ
Một biến thể của cách tiếp cận này, được tìm thấy trong Mach, là lệnh gọi nhiều lượt đọc chặn
Một số hệ điều hành cung cấp một biến thể chính khác của I/O thông qua các giao diện ứng dụng của chúng vectored I/O cho phép một lệnh gọi hệ thống thực hiện nhiều thao tác I/O liên quan đến nhiều vị trí Ví dụ, UNIXreadv
Các hoạt động không đồng bộ xảy ra trên khắp các hệ điều hành hiện đại
Một ví dụ điển hình về hành vi không chặn là lệnh gọi hệ thống select() cho ổ cắm mạng Cuộc gọi hệ thống này nhận một đối số chỉ định thời gian chờ tối đa Bằng cách đặt nó thành 0, một ứng dụng có thể thăm dò hoạt động mạng mà không bị chặn Nhưng việc sử dụng select() sẽ giới thiệu thêm chi phí hoạt động, bởi vì lệnh gọi select() chỉ kiểm tra xem I/O có khả thi hay không Để truyền dữ liệu, select() phải được theo sau bởi một số loại lệnh read() hoặc write()
người dùng hạt nhân
truyền dữ liệu phần cứng
13.3.5 I/O vectơ
13.3 Giao diện I/O của ứng dụng
Trang 1813.4 Hệ thống con I/O hạt nhân
Nhiều bộ đệm riêng biệt có thể truyền nội dung của chúng thông qua một cuộc gọi
hệ thống, tránh chuyển đổi ngữ cảnh và chi phí cuộc gọi hệ thống Nếu không có I/O theo vectơ , trước tiên, dữ liệu có thể cần được chuyển sang bộ đệm lớn hơn theo đúng thứ tự rồi mới được truyền đi, điều này không hiệu quả Ngoài ra, một số phiên bản của phân tán–thu thập cung cấp tính nguyên tử, đảm bảo rằng tất cả I/O được thực hiện mà không bị gián đoạn (và tránh làm hỏng dữ liệu nếu các luồng khác cũng đang thực hiện I/O liên quan đến các bộ đệm đó) Khi có thể, các lập trình viên tận dụng các tính năng I/O thu thập phân tán để tăng thông lượng và giảm chi phí hoạt động của hệ thống
Các nhà phát triển hệ điều hành thực hiện lập lịch bằng cách duy trì hàng đợi các yêu cầu cho từng thiết bị Khi một ứng dụng đưa ra lệnh gọi hệ thống I/O chặn , yêu cầu sẽ được đặt trên hàng đợi cho thiết bị đó I /Oscheduler sắp xếp lại thứ tự của hàng đợi để cải thiện hiệu suất tổng thể của hệ thống và thời gian phản hồi trung bình của các ứng dụng Hệ điều hành cũng có thể cố gắng công bằng để không một ứng dụng nào nhận được dịch vụ đặc biệt kém hoặc nó có thể cung cấp dịch vụ ưu tiên cho các yêu cầu nhạy cảm với độ trễ Chẳng hạn, các yêu cầu từ hệ thống con bộ nhớ ảo có thể được ưu tiên hơn các yêu cầu ứng dụng Một số thuật toán lập lịch trình cho I/O đĩa được trình bày chi tiết trong Phần 10.4
cuộc gọi hệ thống chấp nhận một vectơ gồm nhiều bộ đệm và đọc từ nguồn đến vectơ đó hoặc ghi từ vectơ đó đến đích Việc chuyển giao tương tự có thể được gây ra bởi một
số lệnh gọi hệ thống riêng lẻ, nhưng phương pháp thu thập phân tán này hữu ích vì nhiều lý do
Hạt nhân cung cấp nhiều dịch vụ liên quan đến I/O Một số dịch vụ—lập lịch, tạo bộ đệm, lưu vào bộ nhớ đệm, lưu đệm, đặt trước thiết bị và xử lý lỗi—được cung cấp bởi
hệ thống con I/O của nhân và được xây dựng trên cơ sở hạ tầng trình điều khiển thiết bị và phần cứng Hệ thống con I/O cũng chịu trách nhiệm bảo vệ chính nó khỏi các quy trình sai lầm và người dùng độc hại
Để lên lịch một tập hợp các yêu cầu I/O có nghĩa là xác định một thứ tự tốt để thực hiện chúng Thứ tự các ứng dụng thực hiện cuộc gọi hệ thống hiếm khi là lựa chọn tốt nhất Lập lịch có thể cải thiện hiệu suất tổng thể của hệ thống, có thể chia sẻ quyền truy cập thiết bị một cách công bằng giữa các quy trình và có thể giảm thời gian chờ trung bình để I/O hoàn tất Đây là một ví dụ đơn giản để minh họa Giả sử rằng một nhánh đĩa ở gần phần đầu của đĩa và ba ứng dụng đó đưa ra lệnh chặn các cuộc gọi đọc tới đĩa đó Ứng dụng 1 yêu cầu một khối gần cuối đĩa, ứng dụng 2 yêu cầu một khối gần đầu và ứng dụng 3 yêu cầu một khối ở giữa đĩa Hệ điều hành có thể giảm khoảng cách mà tay đĩa di chuyển bằng cách phục vụ các ứng dụng theo thứ tự 2,
3, 1 Sắp xếp lại thứ tự dịch vụ theo cách này là bản chất của lập lịch I/O
Khi một nhân hỗ trợ I/O không đồng bộ, nó phải có khả năng theo dõi nhiều yêu cầu I/O cùng một lúc Với mục đích này, hệ điều hành có thể đính kèm hàng đợi vào bảng trạng thái thiết bị Hạt nhân quản lý bảng này, bảng chứa mục nhập cho mỗi thiết bị I/O , như trong Hình 13.9
13.4.1 Lập lịch I/O