Đây là cơ chế đồng bộ hóa đơn giản nhất. Đây là Cơ chế phần mềm được triển khai trong chế độ Người dùng. Đây là một giải pháp chờ bận có thể được sử dụng cho nhiều hơn hai quy trình.
Trong cơ chế này, một Lock variable Lock được sử dụng. Có thể có hai giá trị của lock, 0 hoặc 1. Giá trị lock 0 có nghĩa là phần quan trọng bị bỏ trống trong khi giá trị lock 1 có nghĩa là phần đó bị chiếm dụng.
Các bài viết liên quan:
Một quá trình muốn đi vào phần quan trọng trước tiên sẽ kiểm tra giá trị của biến lock. Nếu nó là 0 thì nó đặt giá trị của lock là 1 và đi vào phần quan trọng, nếu không thì nó sẽ đợi.
Mã giả của cơ chế này trông giống như sau.
Entry Section → While (lock! = 0); Lock = 1; //Critical Section Exit Section → Lock =0;
Nếu chúng ta nhìn vào Mã giả, chúng ta thấy rằng có ba phần trong mã. Phần đầu vào, Phần quan trọng và phần thoát.
Ban đầu giá trị của biến lock là 0 . Quá trình cần đi vào phần quan trọng , đi vào phần nhập và kiểm tra điều kiện được cung cấp trong vòng lặp while.
Quá trình sẽ đợi vô hạn cho đến khi giá trị của lock là 1 (được ngụ ý bởi vòng lặp while). Vì, ở lần đầu tiên phần quan trọng bị bỏ trống, do đó quá trình sẽ đi vào phần quan trọng bằng cách đặt biến lock là 1.
Khi quá trình thoát khỏi phần quan trọng, thì trong phần thoát, nó sẽ gán lại giá trị của lock là 0.
Mọi cơ chế Đồng bộ hóa được đánh giá dựa trên cơ sở bốn điều kiện.
- Mutual Exclusion
- Progress
- Bounded Waiting
- Portability
Trong số bốn tham số, Mutual Exclusion và Tiến độ phải được cung cấp bởi bất kỳ giải pháp nào. Hãy phân tích cơ chế này trên cơ sở các điều kiện nêu trên.
Xem thêm All-pairs Testing trong software testing
Mutual Exclusion
Cơ chế biến lock không cung cấp Mutual Exclusion trong một số trường hợp. Điều này có thể được mô tả tốt hơn bằng cách xem mã giả theo quan điểm Hệ điều hành IE Mã hội của chương trình. Hãy chuyển đổi Code thành hợp ngữ.
- lock tải, R0
- CMP R0, # 0
- JNZ Bước 1
- Cửa hàng số 1, lock
- Cửa hàng # 0, lock
Chúng ta hãy xem xét rằng chúng ta có hai quá trình P1 và P2. Quá trình P1 muốn thực hiện phần quan trọng của nó. P1 được vào mục nhập. Vì giá trị của lock là 0 do đó P1 thay đổi giá trị của nó từ 0 thành 1 và đi vào phần quan trọng.
Trong khi đó, P1 được CPU ưu tiên và P2 được lên lịch. Bây giờ không có quá trình nào khác trong phần quan trọng và giá trị của biến lock là 0. P2 cũng muốn thực hiện phần quan trọng của nó. Nó đi vào phần quan trọng bằng cách đặt biến lock thành 1.
Bây giờ, CPU thay đổi trạng thái của P1 từ chờ sang chạy. P1 vẫn chưa kết thúc phần quan trọng của nó. P1 đã kiểm tra giá trị của biến lock và nhớ rằng giá trị của nó là 0 khi nó kiểm tra trước đó. Do đó, nó cũng đi vào phần quan trọng mà không cần kiểm tra giá trị cập nhật của biến lock.
Bây giờ, chúng tôi có hai quy trình trong phần quan trọng. Theo điều kiện Mutual Exclusion, nhiều hơn một quy trình trong phần quan trọng không được xuất hiện cùng một lúc. Do đó, cơ chế biến lock không đảm bảo Mutual Exclusion.
Vấn đề với cơ chế biến lock là cùng một lúc, nhiều quá trình có thể nhìn thấy thẻ trống và nhiều quá trình có thể nhập vào phần quan trọng. Do đó, biến lock không cung cấp Mutual Exclusion, đó là lý do tại sao nó không thể được sử dụng nói chung.
Vì, phương pháp này không thành công ở bước cơ bản; do đó, không cần phải nói về các điều kiện khác phải được đáp ứng.
Xem thêm Chọn đối tượng html trong Selenium webdriver
Priority Inversion
Trong cơ chế TSL, có thể có vấn đề về sự Priority Inversion. Giả sử rằng có hai quá trình hợp tác, P1 và P2.
Mức độ ưu tiên của P1 là 2 trong khi của P2 là 1. P1 đến sớm hơn và được CPU lên lịch. Vì nó là một quá trình hợp tác và muốn thực hiện trong phần quan trọng, do đó nó sẽ đi vào phần quan trọng bằng cách đặt biến khóa thành 1.
Bây giờ, P2 đến trong hàng đợi sẵn sàng. Mức độ ưu tiên của P2 cao hơn P1 do đó theo lập lịch ưu tiên, P2 được lập lịch và P1 được ưu tiên trước. P2 cũng là một quá trình hợp tác và muốn thực hiện bên trong phần quan trọng.
Mặc dù, P1 đã được ưu tiên trước nhưng giá trị của biến khóa sẽ được hiển thị là 1 vì P1 chưa hoàn thành và nó vẫn chưa kết thúc phần quan trọng của nó.
P1 cần kết thúc phần quan trọng nhưng theo thuật toán lập lịch trình, CPU bằng P2. P2 muốn thực hiện trong phần quan trọng, nhưng theo cơ chế đồng bộ hóa, phần quan trọng là với P1.
Đây là một loại khóa mà mỗi quá trình không thực thi hoặc hoàn thành. Loại khóa như vậy được gọi là Spin Lock .
Điều này khác với deadlock vì chúng không ở trạng thái bị chặn. Một cái ở trạng thái sẵn sàng và cái kia ở trạng thái đang chạy, nhưng cả hai đều không được thực thi.
Xem thêm Tham số hàm Swift và giá trị trả về
Cơ chế Test Set Lock
Sửa đổi trong assembly
Trong cơ chế lock variable, Đôi khi Quy trình đọc giá trị cũ của lock variable và đi vào critical section. Vì lý do này, nhiều quá trình có thể đi vào critical section. Tuy nhiên, mã hiển thị trong phần một của phần sau có thể được thay thế bằng mã hiển thị trong phần hai. Điều này không ảnh hưởng đến thuật toán nhưng bằng cách làm này, chúng tôi có thể quản lý để cung cấp mutual exclusion ở một mức độ nào đó nhưng không hoàn toàn.
Trong phiên bản cập nhật của mã, giá trị của Khóa được tải vào thanh ghi cục bộ R0 và sau đó giá trị của khóa được đặt thành 1.
Tuy nhiên, trong bước 3, giá trị trước đó của khóa (hiện được lưu vào R0) được so sánh với 0. nếu giá trị này là 0 thì quá trình sẽ chỉ đơn giản là nhập vào critical section, nếu không sẽ đợi bằng cách thực thi liên tục trong vòng lặp.
Lợi ích của việc đặt khóa ngay lập tức thành 1 bởi chính quá trình đó là, bây giờ quá trình đi vào critical section sẽ mang giá trị cập nhật của lock variable là 1.
Trong trường hợp khi nó được ưu tiên và lên lịch lại thì nó cũng sẽ không vào critical section bất kể giá trị hiện tại của lock variable vì nó đã biết giá trị cập nhật của lock variable là bao nhiêu.
Phần 1 | Phần 2 |
1. Load Lock, R02. CMP R0, #0 3. JNZ step14. store #1, Lock | 1. Load Lock, R02. Store #1, Lock3. CMP R0, #04. JNZ step 1 |
Xem thêm Mảng Swift
Hướng dẫn TSL
Tuy nhiên, giải pháp được cung cấp trong phân đoạn trên cung cấp mutual exclusion ở một mức độ nào đó nhưng nó không đảm bảo rằng mutual exclusion sẽ luôn ở đó. Có khả năng có nhiều hơn một quy trình trong critical section.
Điều gì sẽ xảy ra nếu quá trình được ưu tiên ngay sau khi thực hiện lệnh đầu tiên của mã hợp ngữ được viết trong phần 2? Trong trường hợp đó, nó sẽ mang theo giá trị cũ của lock variable và nó sẽ đi vào critical section bất kể biết giá trị hiện tại của lock variable. Điều này có thể làm cho hai quá trình hiện diện trong critical section cùng một lúc.
Để loại bỏ vấn đề này, chúng ta phải đảm bảo rằng quyền ưu tiên không được diễn ra ngay sau khi tải giá trị trước đó của lock variable và trước khi đặt nó thành 1. Vấn đề có thể được giải quyết nếu chúng ta có thể hợp nhất hai biến đầu tiên. hướng dẫn.
Để giải quyết vấn đề, hệ điều hành cung cấp một lệnh đặc biệt được gọi là lệnh Test Set Lock (TSL) , lệnh này chỉ cần tải giá trị của lock variable vào thanh ghi cục bộ R0 và đặt nó thành 1 đồng thời.
Quá trình thực thi TSL đầu tiên sẽ đi vào critical section và không quá trình nào khác sau đó có thể vào cho đến khi quá trình đầu tiên xuất hiện. Không có quy trình nào có thể thực hiện critical section ngay cả trong trường hợp ưu tiên quy trình đầu tiên.
Assembly code của giải pháp sẽ giống như sau.
- TSL Lock, R0
- CMP R0, #0
- JNZ step 1
Hãy xem xét TSL trên cơ sở của bốn điều kiện.
mutual exclusion : mutual exclusion được đảm bảo trong cơ chế TSL vì một quy trình không bao giờ có thể được thực hiện trước ngay trước khi thiết lập lock variable. Chỉ một quy trình có thể xem lock variable là 0 tại một thời điểm cụ thể và đó là lý do tại sao, mutual exclusion được đảm bảo.
Progress: Theo định nghĩa của process, một quy trình không muốn tham gia vào critical section sẽ không được dừng các quy trình khác tham gia vào nó. Trong cơ chế TSL, một process sẽ chỉ thực hiện lệnh TSL khi nó muốn vào critical section. Giá trị của khóa sẽ luôn là 0 nếu không có quy trình nào không muốn đi vào critical section, do đó process luôn được đảm bảo trong TSL.
Bounded Waiting: Chờ đợi có giới hạn không được đảm bảo trong TSL. Một số quá trình có thể không có cơ hội trong thời gian dài. Chúng tôi không thể dự đoán cho một quá trình rằng nó chắc chắn sẽ có cơ hội vào critical section sau một thời gian nhất định.
Architectural Neutrality:TSL không cung cấp Tính trung lập về kiến trúc. Nó phụ thuộc vào nền tảng phần cứng. Lệnh TSL được cung cấp bởi hệ điều hành. Một số nền tảng có thể không cung cấp điều đó. Do đó nó không phải là kiến trúc tự nhiên.
Xem thêm Phương pháp resampling