RACE CONDITION LÀ GÌ

  -  

Vấn đề

Trong lập trình song khi bọn họ phải đương đầu với trường thích hợp cần ngăn ngừa một yêu ước đang muốn truy vấn vào một biến, file, tuyệt một cấu trúc dữ liệu nào này mà yêu mong khác đang nuốm giữ. Việc các yêu cầu tất cả quyền truy vấn đồng thời vào một trong những tài nguyên và sửa đổi bọn chúng tự do sẽ gây ra khá nhiều vấn đề hay thậm chí còn là lỗi mà bọn họ không hề muốn muốn.

Bạn đang xem: Race condition là gì

Trong môi trường thiên nhiên cân bằng tải - có nghĩa là bạn cố gắng tạo ra những phiên bạn dạng máy chủ (instance) API tương đương nhau nhằm tăng tài năng chịu lỗi cũng như xử lý đồng thời những yêu cầu. Khi đó họ càng khó ngăn ngừa việc tranh chấp khoáng sản hơn bởi vì mỗi instance là độc lập và rất trở ngại để tạo giao tiếp giữa chúng. Chưa nói tới vấn đề hiệu suất cũng như độ tinh vi trong lúc triển khai.

Tất cả điều trên buộc bạn phải kiếm tìm kiếm một giải pháp. Đó là lúc bạn cần biết đến một thuật ngữ có tên là Mutex, vậy thì Mutex là gì và nó đề xuất được áp dụng trong những trường hợp như thế nào?

Race condition là gì?

*

Race condition xẩy ra khi có hai hay những yêu cầu rất có thể truy cập dữ liệu được chia sẻ và chúng thay gắng chuyển đổi nó cùng một lúc. Vì thuật toán lập kế hoạch luồng có thể hoán đổi giữa các luồng ngẫu nhiên lúc nào, phải bạn chần chờ thứ tự mà các luồng sẽ nỗ lực truy cập vào tài liệu được phân tách sẻ. Do đó, công dụng của sự chuyển đổi dữ liệu lại nhờ vào vào thuật toán lập kế hoạch luồng, tức là cả nhị luồng sẽ “chạy đua” nhằm truy cập/thay đổi dữ liệu.

Vì lẽ đó, Race condition hoàn toàn có thể gây ra lỗi không mong muốn trong lập trình, do thế họ cần cần tìm ra cách để giải quyết việc tranh chấp này. Hay ít ra là phải xác định được yêu cầu nào gồm quyền thao tác làm việc với dữ liệu. Đó là lí vị Mutex ra đời.

Mutex là gì?

*

Mutex - Mutual Exclusion hay nói một cách khác là “loại trừ lẫn nhau” được tạo ra nhằm ngăn chặn Race condition. Với phương châm một luồng không khi nào được truy cập vào tài nguyên nhưng một luồng triển khai đang cầm cố giữ.

Tài nguyên được share là một đối tượng người tiêu dùng dữ liệu, cơ mà hai hoặc các luồng mặt khác đang nỗ lực sửa đổi. Thuật toán Mutex đảm bảo an toàn rằng trường hợp một quy trình đang chuẩn bị thao tác sửa thay đổi trên một đối tượng người tiêu dùng dữ liệu thì không một quy trình/luồng nào không giống được phép truy vấn hay sửa đổi cho đến khi nó hoàn tất và giải phóng đối tượng người tiêu dùng để những quy trình khác hoàn toàn có thể tiếp tục.

Mutex thực hiện trong trường thích hợp nào?

Trong lập trình, Mutex được biểu hiện tuỳ nằm trong vào ngôn từ hay phương pháp lập trình.

Node.js không có khái niệm ví dụ về Mutex. Có thể họ đã nghe ở chỗ nào đó Node.js chỉ bao gồm một luồng vậy thì trường thích hợp tranh chấp khoáng sản đâu tất cả xảy ra? Thực ra đúng là Node.js chỉ bao gồm một luồng với luồng này được sử dụng để giải pháp xử lý mã JS, cơ mà còn các tác vụ I/O đa phần được tiến hành bởi các luồng song song hay còn gọi là Worker Pool có trong libuv, chũm nên năng lực tranh chấp vẫn có tác dụng xảy ra trên đây.

Một số thư viện cung ứng triển khai mutex như async-mutex, về cơ bản nó áp dụng các giải pháp đánh dấu một luồng đang truy vấn tài nguyên để loại trừ lẫn nhau, thực hiện Promise để hóng đợi cho đến khi được giải hòa (resolve)… rất nhiều thứ hoạt động, có lẽ vấn đề lo ngại lúc này chỉ là hiệu suất. Mà lại hãy tạm dừng một chút, họ đang mới nói tới trường thích hợp chỉ có một instance. Vậy trong môi trường có nhiều instance như môi trường xung quanh phân tán (distributed) thì sao?

Môi ngôi trường phân tán là môi trường khi bạn “nhân bản” nhiều phiên bản instance tương tự nhau và những instance này không nhất thiết nên nằm trên và một máy chủ. Hay thậm chí là bạn còn tận dụng tối đa được đa lõi CPU nhằm chạy từng instance bên trên chúng. Khi ấy những tủ sách chỉ cung cấp liên lạc nội cỗ như trên chắc rằng sẽ ko thể xử lý mutex theo cách thông thường được, vì chúng không tạo ra môi trường giành cho việc liên lạc giữa các instance cùng với nhau.

Xem thêm: Organic Traffic Là Gì ? Tầm Quan Trọng Của Truy Cập Tự Nhiên

Thực tế nếu áp dụng của bạn chỉ việc 1 instance thì không phải lo đến trường vừa lòng phân tán nữa. Tuy vậy ai biết trước một ngày nào đó ứng dụng của người tiêu dùng phát triển vượt trội, việc “nhân bản” chúng lên để thăng bằng tải là vấn đề khó kị khỏi. Mặc dù sớm giỏi muộn này vẫn là vấn đề bạn phải biết bí quyết giải quyết.

Có nhiều cách thức để cách xử lý mutex vào trường phù hợp phân tán. Mỗi cách sẽ biểu lộ ra phần nhiều ưu yếu điểm để họ áp dụng mang đến từng bài toán làm sao cho phù hợp. Cách dễ dàng nhất là chỉ chạy một instance triệu tập xử lý nghiệp vụ tương quan đến tài nguyên phân chia sẻ. Mô hình này có thể được biểu thị qua câu hỏi dùng message queue tốt stream… đầy những yêu cầu yêu cầu xử lý vào queue và cách xử lý chúng lần lượt. đương nhiên rằng như thế sẽ không tồn tại việc xung đột ở đây nữa.

Nhưng không phải lúc nào bạn có thể tạo ra hầu như instance hiếm hoi như vậy, buộc các bạn phải tìm một chiến thuật khác phù hợp hơn. Một trong các đó là tận dụng tốc độ của redis để làm kênh thương lượng giữa các Instance. Về cơ bản cách này hoạt động trên nguyên tắc tạo ra một “key” và luồng cách xử lý nào cấp tốc tay cụ được key sẽ sở hữu quyền truy vấn vào tài nguyên chia sẻ trước. Sau thời điểm toàn vớ nó sẽ giải phóng key nhằm nhường cho những luồng giải pháp xử lý tiếp theo.

Bạn có thể tự tiến hành một thuật toán Mutex đến riêng bản thân hoặc áp dụng thư viện triển khai mutex gồm trên npm. Warlock giỏi live-mutex là phần đông ví dụ. Trong những khi warlock thực hiện Redis để chế tạo ra mối link giữa những instance thì live-mutex tự tiến hành cho mình một hệ thống liên kết riêng và cung cấp client để sử dụng. Nhìn chung những tủ sách này có thể đáp ứng yêu cầu sử dụng ở 1 mức độ như thế nào đó. Vào một hệ thống thông tin, kĩ năng “tin cậy”, “chịu lỗi” và hồi sinh sau sự cố luôn là mối thân thương hàng đầu.

Redis cũng có một thành phầm gọi là Distributed Locks nhưng theo họ thực thi một thuận toán call là Redlock theo mô hình sử dụng nhiều sever redis vâng lệnh 2 chế độ “Safety” với “Liveness” cho mức độ tin cẩn cao cùng kỹ năng chịu lỗi trong môi trường thiên nhiên phân tán.

Ngoài ra mutex còn được thể hiện trong việc giải quyết và xử lý xung đột dữ liệu ở những dịch vụ (services) như là Database. Khi bạn có thể tạo ra các khoá (locks) để toàn quyền truy vấn vào một bảng hay 1 hàng tài liệu mà những truy vấn tiếp theo phải chờ đợi cho tới khi khoá được giải phóng.

Chúng ta có thể tận dụng locks vào cơ sở tài liệu để giải quyết và xử lý Race condition, nhưng tài nguyên bị khoá liên tục trong thời gian dài là không mấy hiệu quả. Khi đó bạn phải cân bằng hoặc đưa ra một giải pháp khác sao để cho hợp lý.

Xem thêm: Snowball Là Gì ? Cách Trả Nợ Thông Minh Với Phương Pháp Snowball

Tổng kết

Trong lập trình nhất là lập trình trên các luồng xử lý tài liệu đòi hỏi chúng ta phải xử lý vấn đề tranh chấp tài nguyên. Mutex là một trong những kĩ thuật được tạo thành nhằm giải quyết những lỗi lầm do Race condition khiến ra. Gọi được mutex để giúp đỡ bạn có thêm một kỹ năng giải quyết xung đột.