Đa lập trình là giải pháp cho hai tình huống không mong muốn sau đây :
Giả sử một chương trình đang chạy. Để tiếp tục, nó cần dữ kiện được nhập vào bởi người dùng máy tính. Ví dụ cho điều này có thể là một phần mềm kế toán cần một tổng số hóa đơn trong khi chạy. Nó sẽ hiện thị một thông báo yêu cầu người dùng nhập vào tổng số hóa đơn. Cho rằng người dùng mất 5 giây để đọc thông báo, phân tích nó, và nhập số. Trong thời gian 5 giây đó, trong môi trường đơn lập trình, CPU phải chờ và không được làm bất cứ điều gì hữu ích. Nó có thể được thi hành, nói, 5 tỉ câu lệnh nếu nó có thể chuyển thành tiến trình sẵ sàng để thực hiện và sau đó chuyển lại thành tiến trình đầu tiên một khi dữ kiện được nhập vào.
Trong một tình huống khác, giả sử bạn cần một số thông tin từ internet và đã đueâ ra một yêu cầu cho chương trình trình duyệt wed của bạn. Vì số lượng khổng lồ của xử lý liên quan và tốc độ kết nối
internet chậm của máy tính của bạn. Điều này đang mất nhiều thời gian. Bạn sẽ làm gì cho đến khi thông tin được hiện thị ? Một điều chúng ta thường làm trong các tình huống như thế là nhìn chằm chằm vào màn hình. Điều này chắc chắn không phải là một cách xây dựng để dành cho thời gian của chúng ta. Đa lập trình là một kỹ thuật cho phép nhiều hơn một chương trình sẵn sàng cho việc thực thi (tiến trình) và cung cấp khả năng chuyển đổi từ một tiến trình sang một tiến trình khác, thậm chí nếu trước đây còn chưa hoàn chỉnh. Dĩ nhiên, đôi khi trong tương lai chúng ta sẽ phải chuyển đổi trở lại tiến trình đầu tiên và tiếp tục lại (không khởi động lại) tính toán của nó. Kỹ thuật này làm việc với cả bộ xử lý đơn (giống như máy tính cá nhân của chúng ta) và bộ đa xử lý (chẳng hạn như máy tính lớn). Chúng ta biết rằng hệ điều hành thường tạo ra một tiến trình để chạy một chương trình. Tiến trình này vẫn còn dai dẳng cho đến khi hoặc việc thực thi chương trình được hoàn thành bình thường hoặc nó bị bỏ dở. Trong các tình huống hiếm hoi mà tiến trình được rút ra khỏi hệ thống trước khi được hoàn thành hoặc bị bỏ dở không quan tâm đến chúng ta. Vì thế chúng ta sẽ tôn trọng ý nghĩa này của chương trình và tiến trình từ giờ trở đi.
Nếu bạn suy nghĩ mạch lạc, bạn sẽ nhận ra rằng chúng ta nên sử dụng đa xử lý, thay vì đa lập trình trong chương này. Điều này là đúng. Thật không may, thuật ngữ "đa lập trình" được ghi nhận cho kỹ thuật này của hệ điều hành và chúng ta sẽ phải tuân thủ. Mặt khác, "đa xử lý" được dùng cho các hệ thống với nhiều hơn một bộ xử lý. Các bộ xử lý trong một hệ thống như vậy , nhìn chung có thể chạy nhiều tác vụ ùng một lúc.
Một máy tính với một CPU và một hay nhiều bộ xử lý I/O hoặc bộ đồng xử lý toán học không phải là một máy tính bộ đa xử lý. Một máy tính đa bộ xử lý phải có nhiều hơn một bộ xử lý tổng quát. Trong hệ thống một bộ xử lý, bộ xử lý tổng quát được gọi là CPU, nhưng trong hệ thống đa bộ xử lý, mỗi bộ xử lý tổng quát được gọi là một đơn vị xử lý( Processing Unit – PU).
Chức năng của đa lập trình chủ yếu được hoàn thành bởi hệ điều hành. Phần cứng cung cấp một số hệ mạch cụ thể có thể được sử dụng bởi hệ điều hành trong quá trình tạo điều kiện thuận lợi cho đa lập trình. Đa lập trình rất quan trọng vì nó có thể gia tăng việc sử dụng máy tính đến hàng trăm lần, tùy thuộc vào máy tính mà chúng ta đang sử dụng. Đối với một máy tính cá nhân, yếu tố này thấp hơn nhiều nhưng vẫn còn rất hấp dẫn. Trong kỷ nguyên sử dụng máy tính, mọi hệ điều hành đa dụng phải có 3 thuộc tính sau đây :
Phải cung cấp một môi trường để chạy các tiến trình theo phong cách đa lập trình.
Phải hoạt động một nhà cung cấp dịch vụ cho tất cả các dịch vụ phổ biến thường được yêu cầu bởi người dùng máy tính, như sao chép tập tin, tạo một thư mục mới, nén thông tin, gửi và nhận tin nhắn từ các máy tính khác trong mạng, …
Giao diện người dùng phải dễ sử dụng và dễ chịu để làm việc. Các hệ điều hành cũ hơn, như DOS, không có bất cứ thuộc tính nào nêu trên, nó không còn được sử dụng và đang được thay thế bằng các hệ điều hành hiện đại.
Để trả lời câu hỏi đã được đặt ra ở cuối phần trước, tức là, có bao nhiêu sử dụng bộ xử lý gia tăng với đa lập trình, chúng ta sẽ thực hiện trường hợp w = 0.9. Khi có 2 tiến trình trong hệ thống, thời gian chờ CPU xấp xỉ được tính như sau : w’ ≈ w2 = (0.9)2 = 0.81.
Đối với trường hợp này chúng ta sẽ nói rằng mức độ lập trình là 2. Sử dụng CPU gia tăng bởi 9%. Nghĩa là (0.9 – 0.81)*100 = 9%. Thời gian chờ CPU trở thành w ≈ w5 = (0.9)5 = 0.59, khi có 5 tiến trình trong hệ thống. Công thức xấp xỉ tổng quát là : w’ ≈ wn (3.2), với n là số tiến trình trong hệ thống.
Thời gian chờ CPU chính xác hơn khi có n tiến trình trong hệ thống được tính toán từ :
0 w ( ) 1 w w 1 w [ ( ) ! 1 w n n n i n i = − ≈ − ∑
Đối với một số n lớn hợp lý, công thức xấp xỉ cho kết quả mỹ mãn, làm cho công thức chính xác hơn để được sử dụng.
Mức độ đa lập trình được định nghĩa là số lượng có thể tối đa của các tiến trình đồng thời trong hệ thống. Đối với một hệ điều hành đa lập trình, giá trị này là đủ lớn để không phải lo lắng.
Đáng nói là, bằng cách chuyển đổi từ đơn lập trình sang đa lập trình, chúng ta hy vọng yếu tố chờ CPU chậm hơn so với những gì được cho bởi (3.2). Lấy một ví dụ đơn giản, trong đó w = 0.5 trong đơn lập trình. Chúng ta hy vọng w’ là 0 cho hai trường hợp của tiến trình. Điều
này thì không thể có vì có những tình huống khi cả các tiến trình đang làm thao tác I/O và CPU phải chờ và nhàn rỗi cho đến khi ít nhất một tiến trình hoàn thành I/O của nó. Yếu tố chờ CPU, từ công thức (3.2), sẽ là 0.25 thì tốt hơn nhiều so với 0.5. Giảm 50% trong yếu tố chờ CPU, hoặc tăng 25% trong việc sử dụng CPU.
Đa lập trình là vấn đề trọng tâm trong thiết kế bất kỳ hệ điều hành hiện đại nào. Tất cả các tài liệu kỹ thuật được cung cấp nhằm mục đích cung cấp một môi trường đa lập trình có hiệu quả, trơn tru, và các tiến trình đang chạy cùng một lúc không can thiệp vào lẫn nhau. Trong chương này, chúng ta sẽ thảo luận ngắn gọn về một số các chủ đề này. Sẽ có các chương dành riêng cho các lĩnh vực không được đề cập ở chương này.