Giáo trình Hệ điều hành - Chương 2: Tiến trình
Trước đây tuỳ từng thời điểm, máy tính được xác định một nhiệm vụ chính; tất cả các chương trình được bó lại thành gói (paket) và được gởi đi liên tục. Điều đó được gọi là xử lý đóng gói (pile processing) hay quản lý lô (batch manager). Ngày nay, không chỉ có một chương trình chạy trên máy tính, mà nhiều chương trình cùng thực hiện (multi-tasking). Cũng như thế, không chỉ có một người sử dụng làm việc, mà nhiều người sử dụng cùng làm việc (multi- user). Để hạn chế sự tranh chấp giữa chúng ở việc dùng máy tính, do đó sự phân bổ các phương tiện điều hành phải được điều chỉnh trên chương trình.
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Hệ điều hành - Chương 2: Tiến trình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- giao_trinh_he_dieu_hanh_chuong_2_tien_trinh.doc
Nội dung text: Giáo trình Hệ điều hành - Chương 2: Tiến trình
- + Tất cả các phương tiện điều hành phải được đánh số và chỉ cho phép một tiến trình chiếm dụng một phương tiện điều hành có số hiệu cao hơn cả. Nhờ đó, khi có một tiến trình nào đó chờ đợi một phương tiện điều hành có số hiệu nhỏ hơn, mà phương tiện điều hành này đã bị một tiến trình khác chiếm được sớm hơn: một cách nguyên tắc, điều đó không thể xảy ra. Bằng sự chấp nhận này, bây giờ chúng ta khảo sát một vòng chờ đợi luẩn quẩn. Nếu như trong sơ đồ các phương tiện điều hành, chúng ta mô tả mỗi số hiệu ứng với một ô chữ nhật biểu thị một phương tiện điều hành, chúng ta mô tả mỗi số hiệu ứng với một ô chữ nhật biểu thị một phương tiện điều hành, mà nó diễn biến trong vòng chờ. Ở giới hạn trên thì nó không thể đạt được từ một phương tiện điều hành được giữ chặt này tới một phương tiện được yêu cầu khác, nó chỉ đạt được khi có số hiệu cao. Bất kỳ khi nào, vòng chờ này cũng được khoá lại và sau đó, những ký hiệu số hiệu nhỏ nhất được tiếp diễn như là một yêu cầu tới ký hiệu số hiệu lớn hơn. Nhưng điều đó thì không phù hợp với giả thiết ban đầu. Nhờ vậy, không thể có một vòng chờ luẩn quẩn nào được tạo thành. Yếu điểm của phương pháp tuyến tính hoá này là ở chỗ: Không có một bậc nào được tìm thấy một cách dễ dàng cho các ứng dụng. Nếu một dãy tuần tự các yêu cầu mong muốn được xác định, thì không thể có một tiến trình phải yêu cầu các nguồn tài nguyên một lần nữa, điều đó cho thấy khả năng chịu tải của tài nguyên đã bị suy giảm. + Một khả năng tiếp theo để đem lại một sự phân bổ các phương tiện điều hành, mà với sự phân bổ này, các phương tiện điều hành được sắp xếp theo cấu trúc bậc và bị một trong các tiến trình chiếm dụng. Các tiến trình này thoả mãn các yêu cầu của người sử dụng và lưu ý tới sự tự do của các khoá tử tại những chỗ mà nhiệm vụ của người sử dụng được giới hạn theo thời gian. Tổng các phương tiện điều hành (thí dụ như tất cả các Files) có thể được phân phối và có thể được chuyển giao việc quản lý chúng cho các tiến trình con. Vì điều đó cũng có giá trị đối với các tiến trình con, do đó xuất hiện một cấu trúc bậc hình cây để biểu diễn sự che phủ. Thí dụ về quản lý files: Hình 2.30 Trên hình 2.30, mỗi record được sở hữu bởi một tiến trình riêng lẻ. Các nhiẹm vụ (như viết- đọc) được dẫn rộng ra từ rễ cây tới các tiến trình con. Cấu trúc cây đảm bảo rằng, dãy tuần tự để gia tăng các nhiệm vụ con thì bằng nhau khắp mọi nơi. Nhờ thế, các trạng thái của các record tồn tại một cách bền vững. 2.4. Trao đổi thông tin giữa tiến trình (process- communication) Một phương tiện quan trọng để kết hợp các hoạt động của nhiều tiến trình trong một hệ điều hành và để đạt được một mục đích của công việc chung, đó là
- Sự tiêu phí cho việc tạo lập và cho việc giữ gìn một sự kết nối (canal) thì thực ra rất lớn. Từ lý do này, một loại trao đổi thông tin khác hiện đại hơn: trao đổi thông tin không có kết nối. Trong sự khác biệt với việc tạo lập kết nối đồng bộ, ở đây, người gởi và người nhận phải biểu lộ sự sẵn sàng của họ đối với sự kết nối, do đó, thông tin được gởi đi một cách không đồng bộ: send (Adresse, Message) / receive (Adresse, Message) Vì thế, bấy giờ nó thì không còn dám chắc rằng, thông tin có thật đã tới chưa (vì sự truyền đạt và sự tiếp nhận bị quấy nhiễu), do đó, mỗi thông tin phải được xác nhận một cách rõ ràng. Nếu trong một khoảng thời gian nào đó không có thông tin truyền tới xuất hiện, thì do đó, người gởi phải gởi phục hồi ngay thông tin của anh ta, cho tới khi anh ta nhận được biên lai đã nhận được. Sau đó, anh ta tiếp tục gởi thông tin khác. Nếu thông tin biên nhận bị đánh mất, thì do đó, người nhận sẽ nhận được bản sao của thông tin tương tự. Để có thể phân biệt thông tin mới với thông tin cũ, trong trường hợp này, các thông tin được thực hiện bởi các số hiệu liên tục. Một thông tin có thể được thiết lập từ cấu trúc cơ bản sau đây: TYPE tMessage = RECORD ReceiveAdresse: STRING; SendAdresse: STRING; Information Typ: tMsgTyp; SequentialNummer: INTEGER; Length: CARDINAL; Data : POINTER TO tBlock; END; Điều đó được người ta biểu thị là gói thông tin (message header) và nó phù hợp với việc chuyển tải, giống như việc chuyển một bức thư. Ở đây, một số lượng tối thiểu các thông tin chuyển tới chỉ cho ta thấy: thực ra, các thông tin thực giữa các tiến trình được phóng đi rất nhiều lần. Bởi vậy, cần phải có sự đồng bộ giữa người gởi và người nhận, cũng giống như việc thông dịch các trường thông tin. Đồng thời người ta cũng lưu ý tới các vấn đề quan trọng khác: kiểu dữ liệu (thí dụ kiểu tMsgTyp), dãy tuần tự của các trường thông tin và sự thông dịch các số liệu (nó thường dẫn tới kiểu INTEGER với đầu tiên là nhưng Byte có giá trị cao nhất hay những Byte có giá trị thấp nhất). Với lý do này, việc trao đổi thông tin giữa các máy tính (khác kiểu nhau), thì đầu tiên mô tả dữ liệu và sau đó là các dữ liệu được gởi đi. Việc quản lý bên ngoài các thông tin có chiều dài khác nhau thì không đơn giản. Các gói thông tin luôn luôn có chiều dài giống nhau, nhưng chiều dài của các dữ liệu khi truyền đạt trong trường Data thì cho phép không cần cố định. Tại bên người nhận, đầu tiên gói thông tin được đọc và tiếp đến phải cấp phát không gian lưu trữ cho các khối dữ liệu vừa được trao đổi. Việc gởi đi cũng như việc tiếp nhận được thực hiện bằng phương pháp khác nhau. Về phía gởi đi, thì hoặc là, người gởi bị làm trì hoãn thật lâu, cho đến khi một thông báo trả lời được xảy ra (gọi là gởi đồng bộ hay gởi có kìm hãm), hoặc
- Một kiểu định vị đặc biệt khác nữa, đó là việc định vị nhờ địa chỉ tên gọi. Ở đây, người ta dẫn ra một kiểu tên gọi logic, mà nó phụ thuộc vào những điều kiện logic, thí dụ, nó phụ thuộc vào kiểu máy tính hay kiểu CPU, vào bộ nhớ RAM, vào các thiết bị ngoại vi Người nhận sẽ định vị việc chọn đọc theo giao thức IF, nếu kết quả là WAHR, do đó, anh ta cảm nhận một cách nhạy bén, nếu kết quả là FALL, thì anh ta (người nhận) không có câu hỏi nào và khi đó thông tin bị thất lạc. Điều đó có thể làm tốt hơn, đó là phải phân bổ công việc năng động và phải sử dụng thiết bị ngoại vi còn nhàn rỗi. Các hộp thoại (mailboxs): Ở việc trao đổi thông tin không đồng bộ, thông tin được nạp trung gian nhờ một bộ đệm (buffer), vì người nhận chưa đọc ngay những thông tin này. Những bộ đệm thông tin này có thể bị nhầm lẫn tên, do đó, người ta sử dụng một tiến trình chưa được biết tới để chuyển các thông tin cho nó. Ngay cả việc quản lý hệ thống cũng bị thay đổi, đáng lẽ phải thực hiện việc sắp xếp tên logic các tiến trình tới các tiến trình vật lý, thì lại thực hiện việc sắp xếp tên logic các bộ đệm tới địa chỉ vật lý các bộ đệm. Kiểu một bộ đệm thông tin như vậy có thể được cấu tạo như là một hàng đợi, mà ở đó, các thông tin được treo vào và được người nhận đọc. Nếu chúng ta thấy trước một hàng đợi tiếp theo đối với các tiến trình nhận của một nhóm tiến trình, thì chúng ta xem xét: trường hợp không có thông tin được sử dụng, ví như một hàng đợi đối với các tiến trình gởi; trường hợp dòng thông tin đã đầy, do đó, chúng ta nhận được hộp thoại với cấu trúc như sau: TYPE Mailbox = RECORD SendQueue: tList; ReceiveQueue: tList; MsgQueue: tList; MsgNumb: INTEGER; END; Việc xâm nhập trên các hàng đợi (với các hàm Treo vào (Msg) và Bứt ra (Msg)) phải được bảo vệ nhờ các tác vụ cờ hiệu, do đó, một cờ hiệu phải được nhìn thấy trên hộp thoại. Ta thấy biến MsgNumber dịch vụ như là một bộ đếm để điều khiển dòng chảy trong khoảng tới hạn giữa hai hàm Treovào(Msg) và Bứt ra(Msg). Nếu với biến MsgNumber =N mà dung lượng của hộp thoại đạt lớn nhất, thì do đó, tiến trình gởi được treo vào hàng đợi và được nằm ngủ; ngược lại, khi biến MsgNumber =0 thì đó là trường hợp đối với người nhận. Nếu tại MsgNumber =N thông tin được đọc, do đó, người nhậ còn phải thực hiện thêm hàm wakeup(SendQueue) để đánh thức cờ hiệu gởi tồn tại. Khi MsgNumber =0 thì cờ hiệu phải đánh thức người nhận đang nằm chờ.
- Sự trao đổi thông tin giữa các tiến trình bất kỳ và bỏ qua giới hạn các kiểu máy tính thì khả năng đầu tiên của các ấn bản mới hơn của Unix, thì chúng được bỏ qua đối với một pipe, ví như bỏ qua cấu trúc socket. 2.4.3. Trao đổi thông tin giữa các tiến trình với các kênh ở Windows NT Ở trong Windows NT cũng có trao đổi thông tin giữa các tiến trình với các kênh. Chúng đạt được nhờ gọi hệ thống CreadPipe(). Sau đó, người ta có thể nhận được hàm WriteFile() và ReadFile() nhờ các tác vụ đọc viết. Với một hàm gọi CloseHandle() thì chúng được kết nối. Vì ở đây, việc chiếm dụng các kênh này (pipes) thì không tồn tại bằng một nhận biết bên ngoài, do đó, giống như thế, nó bị giới hạn bởi các nhóm tiến trình cha và tiến trình con. Tuy nhiên, theo đó, một sự trao đổi thông tin tương hỗ luôn luôn có khả năng, nếu pipe là hai hướng. Thật vậy, để thay đổi tình trạng có hãm và không có hãm, trong Windows NT có cấu trúc named pipes giống cấu trúc socket đã nói. 2.4.4. Đồng bộ tiến trình bằng trao đổi thông tin Ở phần trước chúng ta thấy, các cờ hiệu là kiểu động bộ nguyên thuỷ sơ đẳng và hầu như các bộ kiểm tra cũng không được sử dụng. Cả hai vấn đề này đều cần thiết trong phạm vi đơn vi xử lý cũng như đa vi xử lý, nhưng mà không ở ngay trong một mạng máy tính. Do đó, chúng ta sử dụng kiểu đồng bộ nguyên thuỷ, mà kiểu đồng bộ này cũng được dùng trong các hệ thống phân bổ. Trước hết, điều đó có thể đạt được nhờ việc trao đổi thông tin với những thông tin rất ngắn và nhờ sự chờ đợi việc gởi thông tin. Có thể nói một cách chính xác, việc nhận được một thông tin bao gồm hai phần: phần chờ đợi (tức đồng bộ ) thông tin và phần đọc thông tin. Ở các thông tin dài, sự đồng bộ vẫn ở mức không. Các hàm send(Message) và receive(Message) thì giống hệt với các tác vụ send(Signal) và waitFor(Signal) đối với các thông tin như thế. Chúng ta xuất phát từ hai trường hợp này, rằng các thông tin truyền đi được lưu trữ trung gian và trước khi đọc không được biến đi mất. Một sự đồng bộ thuần khiết có thể được mở rộng một cách dễ dàng tới việc trao đổi các thông tin và ngược lại, một sự trao đổi thông tin cơ bản được dùng để làm đồng bộ thuần khiết. Tiếp theo, chúng ta khảo sát sự đồng bộ bằng tín hiệu. Sự đồng bộ bằng tín hiệu: Một trong các cơ sở quan trọng để nhận được thông tin là sự xuất hiện các biến cố. Đó là sự báo động các lỗi xuất hiện trong hệ thống (thí dụ lỗi dữ liệu, các địa chỉ lưu trữ không rõ ràng ), các cách sửa chữa ngoại lệ (thí dụ chia cho zero ) và các tín hiệu của các tiến trình khác. Do đó, tiến trình biên nhận có thể hoặc là chờ đợi đồng bộ trên biến cố cho đến khi có xuất hiện, hoặc là chỉ thiết lập việc xử
- khác nhau, mà tại đó với hàm logic AND và OR, người ta thiết đặt các điều kiện cho sự hoạt động của tiến trình nhờ các biến cố hay các tín hiệu nói ở trên. Thí dụ về chờ đợi biến cố: Các biến cố (như nhấp mouse hai lần, ấn ký tự chuẩn ASCII, chọn menu, điều khiển cửa sổ ) đòi hỏi nhiều phản ứng khác nhau. Một cách hữu hiệu, người ta chỉ có thể trông chờ vào các chương trình tương tác, ví dụ chương trình điều hành các hệ thống cửa sổ, chương trình điều hành một trong các biến cố khi truy nhập Vì thế, chúng được đạt tới một gọi hệ thống, gọi là chờ đợi đa biến cố (wait-multi-event). Chẳng hạn, nếu chúng chờ đời để kích mouse hay ấn nút ký tự ASCII, thì khi đó, một mặt nạ phù hợp được kiến lập. Thật vậy, một mặt nạ AND sẽ có điều kiện, nếu như một liên hiệp các nút bấm SHIFT và nhấp hai lần mouse được đáp ứng. 16 tín hiệu ở trong Unix có thể được sử dụng để tạo lập một sự đồng bộ tiến trình. Với sự trợ giúp của các hàm send(Signal) và wait(Signal), các tác vụ cờ hiệu được thực thi một cách dễ dàng. Ở loại máy tính MODULA-2, đoạn chương trình dưới đây cho thấy sự đồng bộ tiến trình được thiết lập trên một máy tính. Type Semaphor = POINTER to tSemaphor tSemaphor = RECORD besetz: BOOLEAN; free : SIGNAL; END; PROCEDURE P(VAR S: Semaphor); BEGIN IF S^.besetz THEN waitFor(S^.free) END; S^.besetz := TRUE; END P; PROCEDURE V(VAR S: Semaphor); BEGIN S^.besetz := TRUE; send(S^.free) END V; Tuy nhiên, một đơn thể cờ hiệu phải chiếm lấy một ưu tiên cao hơn các tiến trình còn lại để các tác vụ P() và V() trở thành các nhân tử. Điều đó có thể đạt được: nếu ở máy tính MODULA-2, nó có thể thực hiện được là nhờ sự chuyển giao ưu tiên ở bản khai đơn thể; còn ở một ngôn ngữ lập trình khác thì nó thực hiện được nhờ gọi hệ thống setPrio(high) đặt trực tiếp sau từ khoá BEGIN hay nhờ gọi hệ thống setPrio(low) đặt trực tiếp trước từ khoá END. Cờ hiệu được sinh ra và khởi xướng nhờ việc gọi thủ tục như sau:
- tất cả các bộ vi xử lý khác, nghĩa là: không có sự lưu thông dữ liệu. Điều đó dẫn tới sự mong muốn che phủ của các tiến trình khác nhau đối với phương tiện điều hành. Do đó, những mong muốn của các tiến trình phải được sửa chữa mọt cách mạnh mẽ ở trong dãy tuần tự, để tạo ra khắp mọi nơi trạng thái giống nhau đối với các biến che phủ. Phương pháp trên đây được sử dụng cho dãy tuần tự liên kết chặt chẽ các thông tin, không cần đánh số hiển thị toàn bộ các thông tin và loại trừ được nhiều vấn đề khi trao đổi thông tin giữa các nhóm thay đổi cục bộ. Đồng bộ các chương trình: Đối với việc gởi và nhận các tín hiệu, người ta dùng phương pháp trao đổi thông tin không cần đệm. Trong trường hợp này, chương trình bên nhận được làm chậm lại cho tới khi chương trình bên gởi chuyển thông tin: khi đó, gọi nhận đồng bộ có hãm. Tức là điều đó dẫn tới một sự đồng bộ giữa người gởi và người nhận, mà nó được mong muốn trong những hệ thống tiến trình như vậy, và nó có tên gọi nỗi tiếng Rendez-vous-Concept (bản phác thảo chỗ gặp lại). Ngôn ngữ lập trình ADA có chứa đựng một ý tưởng như vậy và nó tạo điều kiện để chạy một chương trình của các tiến trình trao đổi thông tin ở tất cả các hệ thống, mà ở đó, một chương trình biên dịch ADA được tạo lập. Hình 2.36 chỉ ra một quá trình đồng bộ như vậy. Hình 2.36 Một ý tưởng quan trọng khác đó là việc thực hiện song song các chương trình nhờ các tiến trình trao đổi thông tin. Nhiều chương trình có thể được tạo lập một cách đơn giản hơn, có thể mở rộng được và chờ đợi nhau niềm nở hơn, nếu người ta diễn đạt một trạng thái giống như một nhiệm vụ, mà nó được hoàn tất bởi những thực thể chuyên dụng (tách biệt và nhỏ) dùng để trao đổi thông tin với nhau. Nếu chúng ta phân tách chương trình thành những đoạn mã ngắn, thí dụ mã threads, do đó, những đoạn ngắn chương trình này cũng cần dùng một sự trao đổi thông tin hiệu quả để thực hiện nhiệm vụ chung của chương trình tổng thể. Kiểu trao đổi thông tin trong nội bộ một chương trình thì thật đơn giản đối với người lập trình để tránh các lỗi và để tạo ra khả năng lập trình hiệu suất. Với mục đích này, C.A.R. More (1978) đã thiết kế một kiểu ngôn ngữ lập trình cho các tiến trình trao đổi thông tin tuần tự (communicating sequential process: CSP). Ở các tiến trình CSP có các cấu trúc ngôn ngữ: receive! data1 cho thủ tục send(receive, data1) send?data2 cho thủ tục receive(send, data2) Đôi bạn trao đổi thông tin người gởi và người nhận phải chờ đợi việc trao đổi thông tin lẫn nhau. Điều này phù hợp với kiểu đồng bộ Rendez-vous-Concept (cùng nhau hẹn chờ), tức là phù hợp với kiểu trao đổi thông tin không có đệm thêm. Sau khi đồng bộ, việc sắp xếp dữ liệu data2:=data1 được thực hiện, khi đó
- 2.4.5 Trao đổi thông tin ẩn và hiện Trong thí dụ kiểu sản sinh- sử dụng ở mục 2.3.5, các dữ liệu của một tiến trình được chuyển tới một tiến trình khác nhờ khoảng nhớ cơ bản của bộ nhớ, tiến trình này sẽ xử lý các dữ liệu vừa chuyển tới. Sự chuyển giao thông tin này gọi là trao đổi thông tin ẩn, nếu như sử dụng putInBuffer(item); còn được gọi là trao đổi thông tin hiển thị sử dụng send(consumer, item) và receive(procedure, item). Theo hình 2.38, người ta rút ra những nhận xét sau đây: + Lệnh send(consumer, item) để chuyển item tới một bộ đệm hệ thống, mà nó được làm đầy nhờ một trong hai tác vụ P() và V(). Nếu bộ đệm đầy, tiến trình bị làm chậm lại cho tới khi không gian cho item tồn tại trở lại. + Lệnh receive(procedure, item) để đọc một item từ bộ đệm và được bảo vệ nhờ các tác vụ P() và V(). Nếu không có item nào được sử dụng, thì tiến trình sẽ bị làm chậm cho tới khi một item xuất hiện. Dạng trao đổi thông tin kiểu sản sinh- sử dụng có ưu điểm: Cơ cấu đồng bộ của kiểu này có thể được thực thi với cơ cấu đồng bộ của sự trao đổi thông tin và hoạt động bỏ qua giới hạn các kiểu máy tính. Chúng ta đã tiết kiệm được số tác vụ cờ hiệu, mà ở đây, chúng ta giả thiết mục đích xác định thích hợp của các thủ tục trao đổi thông tin send(Msg) và receive(Msg). Cụ thể, điều này cũng được thực thi trên hệ thống đơn vi xử lý nhờ các tác vụ cờ hiệu cục bộ. Trong trường hợp này, phạm vi bộ đệm là một hộp thoại (mainbox), mà ở đó thông tin được treo vào. Nói chung, hầu hết các cơ cấu trao đổi thông tin hoạt động giữa các tiến trình với sự trợ giúp của các vùng nhớ, chúng được trình bày tốt hơn nhờ sự trao đổi thông tin hiển. Tiêu phí sẽ giảm đi đáng kể, nếu phần mềm được tạo lập chạy được không chỉ trên hệ thống đơn vi xử lý, mà cả trong hệ phân bổ. Ở đây, người ta có thể chuyển đổi một cách dễ dàng từ sự trao đổi thông tin giữa các tiến trình này với sự trao đổi thông tin giữa các tiến trình khác, vì ở cùng một giao diện, việc thực thi các chức năng send() và receive() được sử dụng như là một thư viện. 2.5 Các bài tập của chương 2 2.5.1.Các bài tập về các trạng thái của tiến trình Bài tập 2.1 Về các dạng điều hành (operating-typs) Bạn hãy kể một vài dạng điều hành của một hệ điều hành (operating- system) mà bạn nhận thức được qua chương này. Bài tập 2.2 Về các tiến trình
- b). Kiểu định thời có ưu tiên; c). Kiểu định thời đến trước dịch vụ trước; d). Kiểu định thời Job ngắn nhất - trước nhất. Ghi chú: Đối với kiểu (a), bạn thấy rằng, hệ thống sử dụng kiểu điều hành đa chương trình và mỗi nhiệm vụ nhận một phần xác định thời gian bộ vi xử lý. Đối với các kiểu (b), (c) và (d), bạn thấy đấy, các nhiệm vụ lần lượt kế nhau được thực hiện. Bài tập 2.8. Về định thời song song a). Nếu một chương trình được dẫn tới 40% mã tuần tự (không thể dẫn tới mã song song). Khi đó, độ tăng tốc (speedup) đạt được bao nhiêu? b). Giả sử có một phương tiện điều hành A được tiếp tục sử dụng. Người ta có thể thay đổi sơ đồ Gantt trong hình 2.12 như thế nào để thời gian sử dụng là ít hơn? 2.5.1 Các bài tập về đồng bộ tiến trình Bài tập 2.9. Cái gì sẽ xảy ra, nếu ở mục 2.3.1, một tiến trình A nhận được sự điều khiển và sau bước 2 xảy ra sự đổi chiều? Có còn các khả năng tạo ra lỗi không? Bài tập 2.10. Về sự ngăn hãm lẫn nhau Bạn hãy diễn giải các thủ tục: Entering_area(Process: INTEGER) và leaving_area(Process: INTEGER), mà chúng chứa đựng giải pháp của Peterson đối với vấn đề ngăn hãm lẫn nhau. Cho cái đó, hạn hãy định nghĩa hai biến toàn cục cơ bản Interesse[1 2] và dran. Một sự khái quát có thể tồn tại trên n tiến trình không? Nếu có, thì như thế nào? Bài tập 2.11. Về cờ hiệu a). Các tác vụ cờ hiệu P và V được diễn đạt như thế nào, nếu s chứa đựng một số lượng các tiến trình chờ đợi? b) Giải pháp mô tả quan hệ nhà sản xuất và người tiêu dùng được thay đổi như thế nào? c). Người ta phải thay đổi s như thế nào, nếu có nhiều phương tiện điều hành tồn tại? Bài tập 2.12. Về đồng bộ tiến trình
- a). Bạn hãy mô tả một cách chi tiết dòng lệnh sau đây tác động lên cái gì ở trong hệ điều hành Unix? grep deb xyz | wc-1 b). Ở Unix, việc trao đổi thông tin bị bó hẹp bởi các thông tin trên nhóm tiến trình cha/ con. Tại sao việc thực thi gặp phải sự thu hẹp này? c). Bạn hãy trình bày sự quá độ giữa các trạng thái tiến trình ở mục 2.1 với sự trợ giúp của các thông tin và các hộp thư. Ai gởi cho ai các thông tin này? Bài tập 2.19. Về trao đổi thông tin kiểu đường kênh (còn gọi kiểu pip) Bạn hãy quan sát một hệ thống tiến trình, hệ thống này chỉ trao đổi thông tin kiểu các đường kênh (pips) của hệ điều hành Unix, mà bộ đệm của chúng được cấp phát một không gian bộ nhớ nói chung và mỗi đường kênh có đúng một tiến trình gởi và một tiến trình nhận. a). Dưới hoàn cảnh nào, một tiến trình được chen vào để đợi chờ? b). Bạn hãy sơ đồ hoá một cơ chế thích hợp để khẳng định hay để phòng tránh các khoá tử (deadlocks) cho hệ thống. c). Với hệ thống này có một quy tắc để lựa chọn một tiến trình như là vật hy sinh, khi một khoá tử còn tồn tại. Nếu đúng, bạn hãy thiết lập quy tắc này!