Bộ nhớ chính của máy tính là nơi chia sẻ của toàn bộ các tiến trình, dữ liệu và kết quả của chúng. Trong môi trường đa lập trình, truy cập bộ nhớ chính trở thành một thách thức mới khi một hay nhiều bộ xử lý và nhiều bộ xử lý ngoại vi đồng thời hoạt động và cố gắng truy cập vào bộ nhớ chính để đọc hoặc lưu trữ thông tin. Hai giải pháp cơ bản sau đây được dùng cho sự truy cập không xung đột vào bộ nhớ chính.
Phương pháp I/O được lập trình ( Programmed Input-Output – PIO). Phương pháp truy cập bộ nhớ trực tiếp (Direct Memory Access – DMA).
Trong phương pháp PIO, CPU là chủ nhân của bộ nhớ chính. Bất kỳ dữ liệu truyền giữa các thiết bị I/O và bộ nhớ chính phải đi qua CPU. Một ví dụ là khi một số thông tin được truyền từ bàn phím tới bộ nhớ chính. Bất cứ khi nào một phím được nhấn, ngắt được phát sinh và CPU thi hành trình xử lý ngắt tương ứng. Trình xử lý ngắt nhận được dữ liệu (phím được nhấn) và truyền nó tới CPU, từ đó dữ liệu đi vào bộ nhớ chính. Chế độ thao tác này chỉ được sử dụng cho các thiết bị chậm như chuột và bàn phím.
Trong phương pháp DMA, thông tin được truyền một cách trực tiếp từ thiết bị tới bộ nhớ chính và ngược lại mà không cần đến CPU. Để tạo điều kiện cho chế độ thao tác này, giải quyết quyền sở hữu bus được yêu cầu. Trong một cách tiếp cận, nó được giả định rằng CPU là chủ nhân của bus và các thiết bị nghèo túng phải lấy bớt các chu kỳ bus, một chu trình tại một thời điểm từ CPU. Thiết bị sở hữu bus sẽ sử dụng nó và bộ nhớ chính cho một chu trình, tức là, để truyền chỉ một từ dữ liệu đến/từ bộ nhớ chính. Chế độ thao tác này được gọi là lấy bớt chu trình.
Mọi thiết bị muốn dử dụng chu trình bus (và bộ nhớ chính) kế tiếp phải gửi yêu cầu tới bộ phân xử bus. Ở đây,chu trình bus được giả định là giống như chu trình bộ nhớ, cả về tuổi thọ và bắt đầu/kết thúc.
Bộ phân xử bus quyết định thiết bị nào sẽ sử dụng chu trình bus tiếp theo để truy cập bộ nhớ chính. Việc quyết định được dựa trên ưu tiên đã được gán cho các thiết bị được kết nối trực tiếp với bus. Bởi vì các thiết bị được giả định là lấy bớt các chu kỳ bus từ CPU, nó được giả định rằng CPU có ưu tiên cao nhất.
Thiết bị chiến thắng thì sau đó được thông báo sử dụng chu trình bus và bộ nhớ chính kế tiếp.
Bộ phân xử bus là bộ sư tập hệ mạch phần cứng chịu trách nhiệm cho việc lựa chọn thiết bị sẽ sử dụng chu kỳ bộ nhớ tiếp theo và, dĩ nhiên, bus để truyền một dữ kiện từ bộ nhớ chính đến một thiết bị khác hoặc ngược lại. Nó sử dụng cố định, luân phiên, hoặc ưu tiên ngẫu
nhiên hoàn toàn cho các thiết bị yêu cầu. Trong chế độ lấy bớt chu trình, CPU được miễn từ những ưu tiên này. CPU luôn luôn được nhận ưu tiên cao nhất trên mọi thiết bị.
Các thao tác liên quan đến lấy bớt chu trình đều được thực hiện bởi hệ mạch phần cứng, một lần cho mỗi chu kỳ bộ nhớ. Các thao tác này không làm gia tăng đáng kể thời gian chu trình bộ nhớ.
Chế độ lấy bớt chu trình không thích hợp cho các thiết bị nhanh như ổ cứng, ổ DVD, card đồ họa phân giải cao, Các thiết bị này có thể được nhận nhiều hơn một chu trình bộ nhớ chính mỗi một yêu cầu. Những giai đoạn này có thể dài chừng 32 chu trình bộ nhớ, hoặc thậm chí dài hơn, phụ thuộc vào nhu cầu của thiết bị và những hạn chế hệ thống. Khi một giai đoạn như vậy được cho, ban cho thiết bị có thể sử dụng bus và bộ nhớ chính liên tục trong suốt toàn bộ thời gian. Chế độ thao tác này được gọi là chế độ truyền từng đợt. Một tiến trình tương tự chế độ thao tác lấy bớt chu trình được theo sau để sở hữu bus và bộ nhớ chính. Một chế độ thao tác mới gọi là ultra DMA được phát minh gần đây. Với chế độ thao tác này, nhiều hơn một đơn vị dữ liệu có thể được truyền trong mỗi chu trình CLOCK.
3.7 ĐA NHIỆM
Khi làm việc với máy tính, người dùng thích có nhiều thao tác một cách đồng thời các chương trình ứng dụng. Điều này là cần thiết bởi vì một số chương trình ứng dụng yêu cầu thời gian xử lý dài trước khi kết quả mong muốn có thê được sản xuất. Đúng là có nhiều hơn một thao tác chương trình ứng dụng, thời gian dành cho mỗi tiến trình để hoàn tất tác vụ của nó gia tăng so với khi chương trình ứng dụng chạy một mình. Tuy nhiên, tổng thể năng suất hệ thống và, kết quả là tổng thể người dùng đạt được sẽ gia tăng. Những chương trình thi hành một cách đồng thời được gọi là các tác vụ. Vì vậy, hệ thống với khả năng đa nhiệm cho phép người dùng kích hoạt nhiều hơn một tác vụ, hoặc chương trình ứng dụng tại một thời điểm. Trình duyệt Wed tìm kiếm một số thông tin là ví dụ của một tác vụ. Phần mềm xử lý văn bản được kích hoạt để thực hiện tác vụ xử lý văn bản là một ứng dụng khác. Người dùng máy tính có thể chuyển đổi qua lại giữa các tác vụ đang hoạt động để xem kết quả, nhập một yêu cầu hay dữ liệu mới, . . . Hệ điều hành sẽ chuyển đổi giữa các tác dụ dựa trên trạng thái các tác vụ hiện tại và những yêu cầu của chúng.
Đa nhiệm chỉ có thể khi hệ điều hành hỗ trợ đa lập trình, tức là, khi đa lập trình là khả năng cơ bản của việc thi hành đồng thời các mẩu của phần mềm. Đa nhiệm và đa lập trình thỉnh thoảng được sử dụng thay thế cho nhau. Hầu hết các hệ điều hành hiện đại, như Unix, Windows, đều hỗ trợ đa nhiệm.
3.8 ĐA LUỒNG
Đến tận bây giờ, một tiến trình vẫn được xem là đối tượng chức năng có thể nhận biết nhỏ nhất nằm trong máy tính và được tạo ra để chạy một chương trình thực hiện nhiệm vụ nào đó. Điều gì sẽ xảy ra nếu chúng ta cần phải thực hiện hai nhiệm vụ tương tự? Một cách để chăm sóc tình trạng này là tạo ra hai tiến trình giống nhau hoàn toàn; mỗi tiến trình được giao cho xử lý một trong hai nhiệm vụ. Tương tự, đối với nhiều hơn hai nhiệm vụ tương tự, số lượng thích hợp của các tiến trình giống hệt nhau phải được sản xuất. Đây là một giải pháp đúng, nhưng nó gây ra hai vấn đề lớn:
Khi số lượng nhiệm vụ gia tăng, số lượng tiến trình cũng gia tăng, và rất nhanh, chúng ta sẽ hoặc chạy ra khỏi bộ nhớ chính hoặc trong trường hợp bộ nhớ ảo, chúng ta có thể vướng đến một trạng thái không hiệu quả của bộ nhớ chính hoặc với hiệu quả rất thấp.
Do gia tăng số lượng các tiến trình, số lượng các đối tượng cạnh tranh tài nguyên máy tính cũng gia tăng. Điều này có thể dẫn đến trạng thái không mong muốn của hệ thống trong đó có nhiều tiến trình không thể hoàn thành nhiệm vụ của chúng bởi vì chúng không có cơ hội sử dụng các tài nguyên cần thiết.
Một giải pháp tốt hơn được đề xuất là phương thức luồng. Luồng đề cập tới một đường dẫn thông qua các câu lệnh của chương trình trong thời gian thi hành của nó. Chúng ta biết rằng, các câu lệnh của chương trình không được thi hành theo thứ tự bề ngoài vật lý của chúng trong tiến trình. Tùy thuộc vào đầu vào và dữ liệu môi trường, một số câu lệnh có thể không bao giờ được thi hành và một số có thể được thi hành nhiều lần. Nếu không có phương thức đa luồng , chỉ có một luồng thi hành mỗi tiến trình. Vào bất kỳ thời điểm nào, mặt trước của luồng cho thấy trạng thái của tiến trình có liên quan dựa trên các nội dung hiện tại của các thanh ghi và các tín hiệu điều khiển.
Tương ứng với mọi tiến trình là một không gian địa chỉ. Không gian địa chỉ của một tiến trình là tập hợp tất cả vị trí bộ nhớ mà tiến trình được cho phép đọc/ghi. Điều này có thể cũng bao gồm nhiều thanh ghi CPU và các cờ mà tiến trình sử dụng trong khi chạy. Ngoài ra, các câu lệnh ngôn ngữ máy, dữ liệu, kết quả và các ngăn xếp là những phần của không gian địa chỉ này. Không gian địa chỉ vật lý của một tiến trình là tập hợp tất cả vị trí bộ nhớ chính bị chiếm bởi tiến trình ở bất kỳ thời điểm nào.
Phương thức đa luồng cho phép nhiều hơn một luồng thi hành cho mỗi tiến trình. Tất cả các luồng của một tiến trình duy nhất chia sẻ cùng một không gian địa chỉ. Chúng sử dụng cùng dữ liệu toàn cục, tức là toàn bộ dữ liệu mà nằm trong tiến trình nhưng không được xác định là luồng đặc biệt. Các luồng của cùng tiến trình sử dụng cùng các tập tin để lưu trữ và/hoặc
đọc thông tin. Chúng cũng sử dụng cùng tài nguyên mà được phân phát cho tiến trình tương ứng của của chúng. Ví dụ, nếu một ổ băng được giao cho một tiến trình tất cả các luồng của nó thì có thể sử dụng nó.
Hệ điều hành đa luồng có khả năng xử lý các tiến trình và các luồng tại cùng thời điểm và trong đó mọi tiến trình được cho phép tạo ra nhiều hơn một luồng. Trong một hệ điều hành như vậy, phải có các phương tiện cho việc tạo ra luồng, xóa, chuyển đổi,… Chẳng hạn một hệ điều hành cho phép người dùng tạo ra nhiều hơn một yêu cầu cho một tiến trình tại một thời điểm. Ví dụ, một trình duyệt có thể được tạo ra để tìm kiếm đồng thời nhiều hơn một chủ đề, mặc dù chỉ có một bản sao của “chương trình trình duyệt” trong bộ nhớ chính. Phương thức và kỹ thuật đa lập trình rất thiết yếu trong việc thực hiện đa luồng. Trong môi trường mới này, một luồng trở thành đối tượng chức năng nhỏ nhất trong CPU (hoặc PU). Để rõ hơn về phương thức, lợi ích, kỹ thuật thực hiện luồng, vui lòng tham khảo chương 5. 3.9 ĐA XỬ LÝ
Máy tính có thể có nhiều hơn một bộ xử lý. Mỗi bộ xử lý có thể độc lập lấy một tiến trình cho việc thi hành. Trình lập biểu tiến trình thường chịu trách nhiệm xác định những gì mà tiến trình được thi hành bởi một bộ xử lý nào đó. Bộ nhớ chính, trong các hệ thống như vậy, đều chung cho tất cả các bộ xử lý và tất cả các tiến trình (một phần) thường trú trong bộ nhớ chính. Mọi bộ xử lý có thể có bộ nhớ đệm của riêng mình để giữ một bản sao của một số phần của các tiến trình. Bởi vì kích thước bộ nhớ đệm thì nhỏ hơn nhiều so với kích thước của bộ nhớ chính, bộ nhớ đệm chỉ có thể lưu trữ một lượng dữ liệu và/hoặc mã một cách hạn chế. Đa xử lý và đa lập trình có thể tồn tại đồng thời trong một hệ thống. So với các hệ thống đa lập trình đơn xử lý, trong hệ thống đa lập trình đa xử lý có thể có nhiều hơn một tiến trình ở trạng thái chạy. Trong tình huống như vậy, mỗi tiến trình đang sử dụng một bộ xử lý khác để thi hành các câu lệnh của nó. Nếu có n bộ xử lý trong hệ thống, có thể có nhiều nhất n tiến trình chạy tại bất kỳ thời điểm nào.
3.10 TÓM TẮT
Mục tiêu cuối cùng trong thiết kế và thực hiện của một hệ điều hành là sản xuất chương trình phần mềm tiện dụng quản lý các tài nguyên máy tính theo một cách hiệu quả nhất để phục vụ cho người dùng máy tính một cách chính xác, đáng tin cậy và công bằng. Nó được công nhận rằng điều này không thể thực hiện được trong các môi trường đơn lập trình. Các hệ
cung cấp các khả năng yêu cầu nhiều phương pháp và kỹ thuật phần cứng lẫn phần mềm. Hiểu biết tốt về việc tạo ra tiến trình, vòng đời và sự kết thúc cùng với các điều kiện chuyển đổi trạng thái của nó là điều cần thiết nhất trong việc làm sáng tỏ nhu cầu của các cơ chế khác nhau nằm trong hệ điều hành. Một số cơ chế này, cụ thể là chuyển đổi tiến trình, hệ thống ngắt và xử lý, và truy cập bộ nhớ trực tiếp được giải thích ngắn gọn trong chương này. Đa luồng như là con đẻ của đa lập trình, đã trở thành một phần thiết yếu của tất cả các hệ điều hành hiện đại.
3.11 CÁC VẤN ĐỀ
Nếu tỉ số của thời gian nhàn rỗi CPU là w = 0.25. Tỉ số của thời gian nhàn rỗi CPU khi có bốn tiến trình trong hệ thống là bao nhiêu (sử dụng công thức gần đúng)? Điều gì xảy ra nếu chúng ta sử dụng công thức chính xác?
Trong một sơ đồ chuyển đổi trạng thái ba trạng thái, nếu trạng thái chờ/bị chặn bị chia thành hai trạng thái, tức là chờ và bị chặn, hãy phát truyển một sơ đồ chuyển đổi trạng thái bốn trạng thái.
Nếu một ngắt được phát sinh trong khi bộ xử lý đang thi hành (hoặc tìm nạp) một lệnh máy, ngắt sẽ không được xử lý trước khi câu lệnh được hoàn tất. Có bất kỳ ngoại lệ nào đối với quy tắc này cho bộ xử lý máy tính của bạn hay không? Nếu câu trả lời là có, và ngắt khiến chuyển đổi bộ xử lý, hệ thống lưu lại bộ đếm vị trí của tiến trình mà nó đã đượ chuyển đổi như thế nào?
Có những sự khác biệt nào giữa kỹ thuật đa lập trình và đa xử lý?
Thiết kế một hệ mạch cấp logic cho chuẩn đoán tràn, tràn dưới và chia cho không?
Tìm ra được bao nhiêu lớp ngắt cho bộ xử lý máy tính cá nhân của bạn?. Viết tên những lớp này theo thứ tự ưu tiên.
Chương 4 TIẾN TRÌNH
Bên trong một máy tính là một cộng đồng nhỏ của các tiến trình. Tiến trình được sinh ra, sống và chết. Ngay cả hệ điều hành, bản thân nó là một tập hợp các tiến trình. Khi chúng ta bật máy tính, chúng ta thực sự tạo ra các tiến trình khởi động. Nó khởi động tiến trình hệ điều hành và tiến trình khởi động mất dần đi. Người dùng máy tính, các chương trình ứng dụng, hay các tiến trình ứng dụng và hệ điều hành có thể tạo ra các tiến trình mới hoặc chúng có thể tiêu diệt những tiến trình hiện có. Cộng đồng các tiến trình này cần có một bộ phận chỉ huy là hệ điều hành. Bộ phận chỉ huy yêu cầu một tập hợp đầy đủ các thông tin cho mỗi tiến trình trong hệ thống, cốt để nhận dạng và quản lý tiến trình. Tập hợp các thông tin này nhìn chung được gọi là các thuộc tính tiến trình.
Có ba khái niệm mà qua đó nhân hệ điều hành được tổ chức: tiến trình, luồng, tác nhân. Theo đó, chúng ta có các hệ điều hành dựa trên tiến trình, dựa trên luồng và dựa trên tác nhân. Chúng ta sẽ nói về hệ điều hành dựa trên tiến trình trong chương này. Hệ điều hành dựa trên luồng được bao trùm trong chương 5.Thiết kế hệ điều hành dựa trên tác nhân thì rất mới và các khái niệm, các phương thức và kỹ thuật của nó vẫn đang được phát truyển. Trong hệ điều hành dựa trên tiến trình, khi chúng ta bắt đầu hệ thống (hoặc khởi động lại), nhiều tiến trình hệ điều hành được tạo ra để phục vụ các tiến trình ứng dụng. Vì vậy, hệ điều hành bao gồm không chỉ là một tiến trình mà là tập hợp của các tiến trình.
4.1 CÁC THUỘC TÍNH TIẾN TRÌNH
Cũng như cộng đồng loài người, khi tạo ra nó, một tiến trình phải được đăng ký. Việc đăng ký liên quan đến việc ghi lại toàn bộ thông tin cần thiết để nhận diện tiến trình và để phân