Hội thảo POSIX với Lập trình C

Posix Semaphores With C Programming



POSIX đề cập đến Giao diện Di động của Hệ điều hành, là một tiêu chuẩn IEEE, được phát triển để hỗ trợ tính di động của các ứng dụng khác nhau. POSIX là nỗ lực xây dựng một phiên bản chuẩn hóa chung của UNIX thông qua sự hợp tác của các nhà cung cấp. Nó sẽ giúp chuyển ứng dụng giữa các nền tảng phần cứng dễ dàng hơn nếu chúng hiệu quả. Hewlett-Packard đang tích hợp POSIX vào hệ điều hành MPE / iX phiên bản 5.0 và HP / UXX phiên bản 10.0 được cấp phép tương ứng (UNIX của nó).

Tiêu chuẩn POSIX có nhiều hơn mười phần, tuy nhiên, có hai phần có thể dễ dàng đạt được. POSIX.1 mô tả giao diện lập trình C (tức là thư viện lệnh gọi hệ thống) cho các tệp, thủ tục và thiết bị đầu cuối I / O. Thư viện gói C POSIX dành cho nền tảng POSIX là một khung của thư viện tiêu chuẩn C. Điều này được thiết lập cùng lúc với tiêu chuẩn ANSI C. Để làm cho POSIX tuân thủ tiêu chuẩn C, một số nỗ lực đã được thực hiện. POSIX cung cấp các tính năng bổ sung cho những tính năng được triển khai trong tiêu chuẩn C.







Hội nghị bán lẻ POSIX

Semaphore là một cấu trúc dữ liệu thường được sử dụng để đồng bộ hóa các quy trình và hỗ trợ các luồng mà không cần sự tương tác của chúng với nhau để hoạt động cùng nhau. Giao diện cho semaphores được chỉ định bởi tiêu chuẩn POSIX. Nó không phải là một phần của Pthreads. Tuy nhiên, hầu hết các UNIX hỗ trợ Pthreads thậm chí còn cung cấp các semaphores. Trong các khung công tác giống Unix, như Linux, các semaphores được hợp nhất với các hàng đợi tin nhắn và bộ nhớ chung bên dưới các dịch vụ Interprocess Communication (IPC). Semaphores khung V cũ hơn và semaphores POSIX hiện đại trở thành hai loại semaphores. Lệnh gọi Semaphore của POSIX dễ dàng hơn nhiều so với lệnh gọi Semaphore của Hệ thống V. Mặc dù, Semaphores System V dễ lấy hơn, đặc biệt là trên các nền tảng giống Unix trước đó. Cần phải kết nối các chương trình bằng cách sử dụng bán phần mềm POSIX với thư viện Pthread. Chúng ta sẽ xem xét các Semaphores POSIX trong bài viết này.



Tại sao nên sử dụng POSIX Semaphores?

Có một vấn đề lớn xung quanh chủ đề, đó là điều kiện chủng tộc. Đó là một tình huống trong đó hai luồng tìm cách lấy và thay đổi cùng một thông tin, do đó làm cho nó xung đột. Để tránh tình trạng chủng tộc, chúng tôi đã sử dụng semaphores trong một thời gian rất dài.



Semaphores có 2 loại:





Binary Semaphore :

Nó cũng được công nhận là một khóa mutex. Nó sẽ chỉ có hai giá trị có thể có, 0 và 1. Giá trị sẽ được khởi tạo là 1. Nó đang được sử dụng để thực thi nhiều quy trình nhằm giải quyết vấn đề nghiêm trọng của phần.



Đếm Semaphore :

Kích thước của nó có thể khác nhau trên một miền không hạn chế. Nó đang được sử dụng để có quyền truy cập vào nhiều tài nguyên phiên bản.

Khung công tác Linux POSIX có kho lưu trữ Semaphore tích hợp. Để sử dụng nó, chúng ta phải:

  • Thêm semaphore.h
  • Tích lũy mã bằng cách kết nối với -lpthread -lrt.

Hầu hết tất cả các phương thức và biểu mẫu của POSIX Semaphore đều được tạo mẫu hoặc được chỉ định trong ‘Semaphore.h’. Chúng tôi sẽ sử dụng Semaphore để mô tả một thực thể hoặc đối tượng là:

>>sem_t sem_name;

Dưới đây là các chức năng khác nhau mà chúng tôi sẽ sử dụng trong POSIX Semaphore.

Sem_init

Để khởi tạo một semaphore, bạn phải sử dụng phương thức sem_init. Trong hàm này, sem tương ứng với một đối tượng semaphore đã khởi tạo. Pshared là một biểu ngữ hoặc cờ chỉ định xem semaphore có thể được chia sẻ với một thủ tục fork () hay không. Các semaphores được chia sẻ hiện không được hỗ trợ bởi LinuxThreads. Giá trị đối số là giá trị bắt đầu mà semaphore được cố định.

>> NSsem_init(sem_t*sem, NSchia sẻ, chưa ký NSgiá trị);

Sem_wait

Chúng tôi sẽ sử dụng phương thức sem-wait để giữ / khóa một semaphore hoặc làm cho nó đợi. Nếu semaphore đã được cung cấp một giá trị âm, thì chu kỳ cuộc gọi sẽ tự động bị chặn. Bất cứ khi nào bất kỳ luồng nào khác gọi sem_post, một trong những quy trình đã bị tắc nghẽn sẽ hoạt động.

>> NSsem_wait(sem_t*sem);

Sem_post

Chúng tôi sẽ sử dụng phương thức sem_post để tăng giá trị của một semaphore. Khi gọi, sem_post sẽ tăng giá trị và một trong các quá trình đã bị tắc hoặc đang chờ sẽ hoạt động.

>> NSsem_post(sem_t*sem);

Sem_getvalue

Nếu bạn muốn biết về giá trị của semaphore, bạn phải sử dụng hàm sem_getvalue bên dưới. Nó sẽ lấy giá trị hiện tại của semaphore và được đặt vào đích valp-trỏ.

>>Int sem_getvalue(sem_t*sem, NS *cún yêu);

Sem_destroy

Bạn nên sử dụng phương thức sem_destroy nếu bạn muốn hủy semaphore. Nếu sự sụp đổ của semaphore được tiếp tục, sẽ không có luồng nào đang đợi trong semaphore.

>>Int sem_destroy(sem_t*sem);

Cài đặt Tiện ích GCC

Để biên dịch mã POSIX Semaphore C, bạn phải cài đặt tiện ích gcc trong hệ thống Linux của mình. Với mục đích này, hãy mở cửa sổ lệnh của bạn và thử lệnh dưới đây.

$sudo apt-get cài đặt gcc

Khẳng định hành động của bạn bằng cách nhấn .

Triển khai POSIX Semaphore với lập trình C trong Ubuntu

Ngay từ đầu, bạn phải tạo một tệp mới có phần mở rộng .cpp trên hệ thống Ubuntu 20.04. Đối với điều này, bạn phải điều hướng đến Thư mục chính của mình và tạo một tệp trống mới có tên new.cpp. Bạn cũng có thể tạo nó bằng cách sử dụng lệnh cảm ứng trong thiết bị đầu cuối lệnh của mình.

Bạn có thể thấy rằng tệp new.cpp đã được tạo trong Home Directory.


Sau khi tạo tệp .cpp, hãy mở tệp dưới dạng Trình soạn thảo văn bản trong hệ thống Linux của bạn và viết mã dưới đây vào tệp này. Sau đó, lưu và đóng nó lại.

Thực thi Chương trình POSIX Semaphore C trong Ubuntu 20.04

Mở thiết bị đầu cuối của bạn Trong Ubuntu 20.04 và thực hiện lệnh gcc dưới đây, theo sau là tên tệp.

$gccfilename.c –lpthread –lrt

Có 2 chủ đề được hình thành, một chủ đề được hình thành sau 2 giây của chủ đề kia. Sau khi nhận được bu lông, sợi đầu tiên sẽ ngủ trong 4 giây. Vì vậy, sau khi nó được gọi, luồng thứ hai sẽ không tham gia trực tiếp và điều này sẽ xuất hiện 4-2 = 2 giây sau khi nó được gọi. Đây là kết quả:

Nếu chúng tôi không sử dụng semaphore, theo chuyển đổi ngữ cảnh, kết quả có thể là như quan sát:

Phần kết luận

Trong hướng dẫn này, một cái nhìn tổng quan chi tiết về việc sử dụng POSIXSemaphore với lập trình C trong Ubuntu 20 đã được đưa ra. Bằng cách chỉ sử dụng thư viện POSIX hoặc Pthread trong suốt mã C nhất định, POSIX Semaphore có thể được sử dụng khá dễ dàng để ngăn chặn các điều kiện chủng tộc trong quá trình mã hóa.