Computer >> Máy Tính >  >> Lập trình >> lập trình C

Đồng bộ hóa quy trình trong C / C ++

Đồng bộ hóa quy trình là kỹ thuật để khắc phục vấn đề truy cập đồng thời vào dữ liệu được chia sẻ có thể dẫn đến sự không nhất quán của dữ liệu. Quy trình hợp tác là quy trình có thể ảnh hưởng hoặc bị ảnh hưởng bởi quy trình khác, điều này sẽ dẫn đến sự không nhất quán trong dữ liệu quy trình, do đó, cần phải đồng bộ hóa quy trình để đảm bảo tính nhất quán của dữ liệu.

Vấn đề của Mục quan trọng

Mọi quy trình đều có một đoạn mã dành riêng được gọi là Phần quan trọng . Trong phần này, quá trình có thể thay đổi các biến chung, cập nhật bảng, ghi tệp, v.v. Điểm chính cần lưu ý về phần quan trọng là khi một quá trình đang thực thi trong phần quan trọng của nó, thì không quá trình nào khác có thể thực thi trong phần quan trọng của nó. Mỗi quy trình phải yêu cầu quyền trước khi tham gia vào phần quan trọng của nó và phần của mã thực hiện yêu cầu này là Phần mục nhập , phần cuối của mã là Phần thoát và mã còn lại là phần còn lại.

Dưới đây là cấu trúc của phần quan trọng của một quy trình cụ thể P1

Đồng bộ hóa quy trình trong C / C ++

Có ba yêu cầu phải được đáp ứng cho một phần quan trọng

  • Loại trừ lẫn nhau - Nếu một quy trình giả sử P1 đang thực thi trong phần quan trọng của nó hơn bất kỳ quy trình nào khác, giả sử P2 không thể thực thi trong phần quan trọng của nó.
  • Tiến độ - Nếu không có quy trình nào đang thực thi trong phần quan trọng của nó và có những quy trình muốn tham gia vào phần quan trọng của nó, thì chỉ những quy trình không thực thi trong phần còn lại của chúng mới có thể yêu cầu tham gia phần quan trọng và việc lựa chọn có thể bị hoãn vô thời hạn .
  • Chờ đợi có Giới hạn - Trong thời gian chờ đợi có giới hạn, có những giới hạn hoặc giới hạn về số lần một quy trình có thể vào phần quan trọng của nó sau khi một quy trình đưa ra yêu cầu nhập phần quan trọng của nó và trước khi yêu cầu đó được chấp nhận.

Có hai cách tiếp cận thường được sử dụng trong hệ điều hành để xử lý phần quan trọng.

Nhân dự phòng - Hạt nhân ưu tiên cho phép tiến trình được ưu tiên trong khi nó đang chạy ở chế độ hạt nhân.

Nhân không dự phòng - Một nhân không ưu tiên không cho phép tiến trình chạy ở chế độ nhân được ưu tiên.

Giải pháp của Peterson

Giải pháp của Peterson là một giải pháp phần mềm dựa trên cổ điển cho vấn đề của phần quan trọng. Nó bị hạn chế đối với hai quy trình thực hiện luân phiên giữa các phần quan trọng và các phần còn lại của chúng. Phần của Peterson yêu cầu hai mục dữ liệu được chia sẻ giữa hai quy trình, tức là

  • Lượt giới thiệu;
  • Cờ boolean [2];

Ở đây, lượt biến cho biết lượt của ai sẽ đi vào phần quan trọng của nó và mảng cờ cho biết liệu quá trình đã sẵn sàng để đi vào phần quan trọng của nó hay chưa.

Nếu turn ==i, điều đó có nghĩa là quá trình Pi được phép nhập vào phần quan trọng của nó.

Nếu cờ [j] là TRUE, điều đó có nghĩa là quá trình j đã sẵn sàng để tham gia vào phần quan trọng của nó

Dưới đây là cấu trúc của quy trình P trong giải pháp của Peterson

Đồng bộ hóa quy trình trong C / C ++

Giải pháp của Peterson duy trì cả ba điều kiện -

  • Loại trừ lẫn nhau - một quá trình tại một thời điểm có thể truy cập vào phần quan trọng.
  • Tiến độ - Một quy trình bên ngoài phần quan trọng không chặn các quy trình khác vào phần quan trọng.
  • Chờ đợi có Giới hạn - Mọi quy trình sẽ có cơ hội đi vào phần quan trọng của nó mà không phải chờ đợi vô thời hạn.

Phần cứng đồng bộ hóa

Nó được triển khai bằng hai loại hướng dẫn -

  • Kiểm tra và Đặt ()
  • swap ()

Test and Set () là một giải pháp phần cứng để giải quyết vấn đề đồng bộ hóa. Trong đó, có một biến chia sẻ được chia sẻ bởi nhiều quy trình được gọi là Khóa có thể có một giá trị từ 0 và 1 trong đó 1 đại diện cho Khóa đạt được và 0 đại diện cho Khóa được phát hành.

Bất cứ khi nào quá trình đang cố gắng đi vào các phần quan trọng của họ, họ cần phải hỏi về giá trị của khóa. Nếu giá trị của khóa là 1 thì họ phải đợi cho đến khi giá trị của khóa không bị thay đổi thành 0.

Dưới đây là cách triển khai loại trừ lẫn nhau với TestAndSet ()

Đồng bộ hóa quy trình trong C / C ++

Semaphores

Semaphore là một công cụ đồng bộ hóa được sử dụng để khắc phục các sự cố do các lệnh TestAndSet () và Swap () tạo ra. Semaphore S là một biến số nguyên có thể được truy cập thông qua hai phép toán nguyên tử tiêu chuẩn là wait () và signal ()

Hàm đợi ():

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}

Hàm cho Tín hiệu ():

signal(S) {
   S++;
}

Khi một quá trình đang sửa đổi giá trị của semaphore thì không quá trình nào khác có thể đồng thời thao tác cùng một giá trị semaphore.

Dưới đây là cách triển khai loại trừ lẫn nhau với semaphore

Đồng bộ hóa quy trình trong C / C ++

Hệ điều hành sử dụng hai loại semsphores -

Đếm Semaphore - giá trị của loại semaphore này có thể trên một miền không hạn chế

Binary Semaphore - giá trị của loại semaphore này có thể trên 0 đến 1. Chúng còn được gọi là Mutex Locks. Hệ điều hành sử dụng điều này để giải quyết các vấn đề với phần quan trọng trong nhiều quy trình.