สัญญาณ POSIX พร้อมการเขียนโปรแกรม C

Posix Semaphores With C Programming



POSIX หมายถึง Portable Interface ของ OS ซึ่งเป็นมาตรฐาน IEEE ที่พัฒนาขึ้นเพื่อช่วยในการเคลื่อนย้ายแอพพลิเคชั่นต่างๆ POSIX เป็นความพยายามในการสร้าง UNIX เวอร์ชันมาตรฐานทั่วไปผ่านการทำงานร่วมกันของผู้ขาย มันจะทำให้การพอร์ตแอพระหว่างแพลตฟอร์มฮาร์ดแวร์ง่ายขึ้นหากมีประสิทธิภาพ Hewlett-Packard กำลังรวม POSIX เข้ากับ MPE/iX OS เวอร์ชัน 5.0 ที่ได้รับลิขสิทธิ์และ HP/UXX เวอร์ชัน 10.0 ตามลำดับ (UNIX)

มาตรฐาน POSIX มีมากกว่าสิบส่วน อย่างไรก็ตาม มี 2 ชิ้นที่หาซื้อได้ง่าย POSIX.1 อธิบายอินเตอร์เฟสการเขียนโปรแกรม C (เช่น ไลบรารีการเรียกระบบ) สำหรับไฟล์ โพรซีเดอร์ และเทอร์มินัล I/O ไลบรารีแพ็คเกจ C POSIX สำหรับแพลตฟอร์ม POSIX เป็นเฟรมเวิร์กของไลบรารีมาตรฐาน C สิ่งนี้กำหนดขึ้นในเวลาเดียวกันกับ ANSI C มาตรฐาน เพื่อให้ POSIX สอดคล้องกับมาตรฐาน C ได้มีการพยายามหลายครั้ง POSIX ให้คุณสมบัติเพิ่มเติมแก่คุณสมบัติที่นำไปใช้ในมาตรฐาน C.







สัญญาณ POSIX

สัญญาณเป็นโครงสร้างข้อมูลที่มักใช้สำหรับการซิงโครไนซ์กระบวนการและช่วยเหลือเธรดโดยไม่ต้องมีปฏิสัมพันธ์ระหว่างกันเพื่อทำงานร่วมกัน อินเทอร์เฟซสำหรับสัญญาณถูกกำหนดโดยมาตรฐาน POSIX มันไม่ได้เป็นส่วนหนึ่งของ Pthreads อย่างไรก็ตาม UNIX ส่วนใหญ่ที่รองรับ Pthreads ยังให้สัญญาณ ในเฟรมเวิร์กที่เหมือน Unix เช่น Linux สัญญาณจะถูกรวมเข้ากับคิวข้อความและหน่วยความจำทั่วไปภายใต้บริการ Interprocess Communication (IPC) เฟรมเวิร์ก V semaphores ที่เก่ากว่าและ semaphores POSIX ที่ทันสมัยกลายเป็น semaphores สองประเภท การโทรด้วยสัญญาณ POSIX นั้นง่ายกว่าการโทรของระบบ V Semaphore มาก แม้ว่าเซมาฟอร์ System V จะหาได้ง่ายกว่า โดยเฉพาะอย่างยิ่งบนแพลตฟอร์มที่เหมือน Unix รุ่นก่อนหน้า ไม่จำเป็นต้องเชื่อมต่อโปรแกรมโดยใช้สัญญาณ POSIX กับไลบรารี Pthread เราจะมาดูสัญญาณของ POSIX ในบทความนี้



ทำไมต้องใช้สัญญาณ POSIX

มีปัญหาใหญ่เกี่ยวกับเธรดซึ่งเป็นสภาพการแข่งขัน เป็นสถานการณ์ที่สองเธรดพยายามรับและแก้ไขข้อมูลเดียวกัน ทำให้เกิดความขัดแย้ง เพื่อหลีกเลี่ยงสภาวะการแข่งขัน เราใช้สัญญาณมาเป็นเวลานานมาก



Semaphores มีให้เลือก 2 แบบ:





สัญญาณไบนารี :

มันยังเป็นที่รู้จักในฐานะล็อค mutex จะมีค่าที่เป็นไปได้สองค่าเท่านั้น คือ 0 และ 1 ค่าจะถูกเตรียมใช้งานเป็น 1 ค่านี้ใช้เพื่อบังคับใช้กระบวนการจำนวนมากเพื่อแก้ปัญหาส่วนร้ายแรง



การนับสัญญาณ :

ขนาดอาจแตกต่างกันไปตามโดเมนที่ไม่จำกัด มีการใช้เพื่อให้มีอำนาจในการเข้าถึงทรัพยากรอินสแตนซ์จำนวนมาก

กรอบงาน Linux POSIX มีที่เก็บ Semaphore ในตัว ในการใช้งาน เราต้อง:

  • เพิ่ม semaphore.h
  • รวบรวมรหัสโดยเชื่อมต่อกับ -lpthread -lrt

วิธีการและรูปแบบสัญญาณของ POSIX เกือบทั้งหมดเป็นแบบต้นแบบหรือระบุไว้ใน 'Semaphore.h' เราจะใช้ Semaphore เพื่ออธิบายเอนทิตีหรือวัตถุเป็น:

>>sem_t sem_name;

ต่อไปนี้คือฟังก์ชันต่างๆ ที่เราจะใช้ใน POSIX Semaphore

Sem_init

ในการเริ่มต้นสัญญาณ คุณต้องใช้วิธี sem_init ในฟังก์ชันนี้ sem สอดคล้องกับอ็อบเจ็กต์สัญญาณเริ่มต้น Pshared เป็นแบนเนอร์หรือแฟล็กที่ระบุว่าสามารถแชร์สัญญาณกับขั้นตอน forked() ได้หรือไม่ ในขณะนี้ LinuxThreads ไม่ได้รองรับเซมาฟอร์ที่แชร์ ค่าอาร์กิวเมนต์คือค่าเริ่มต้นที่สัญญาณถูกกำหนดไว้

>> intsem_init(sem_t*sem, intpshared, ไม่ได้ลงนาม intค่า);

Sem_wait

เราจะใช้วิธี sem-wait เพื่อระงับ/ล็อคสัญญาณ หรือทำให้รอ หากสัญญาณมีค่าเป็นลบ รอบการโทรจะถูกบล็อกโดยอัตโนมัติ เมื่อใดก็ตามที่เธรดอื่นเรียก sem_post หนึ่งในกระบวนการที่อุดตันอยู่แล้วจะตื่นขึ้น

>> intsem_wait(sem_t*sem);

Sem_post

เราจะใช้วิธี sem_post เพื่อเพิ่มมูลค่าของสัญญาณ เมื่อมีการโทร sem_post จะเพิ่มค่า และหนึ่งในกระบวนการที่อุดตันหรือรออยู่แล้วจะตื่นขึ้น

>> intsem_post(sem_t*sem);

Sem_getvalue

หากคุณต้องการทราบค่าของสัญญาณ คุณต้องใช้ฟังก์ชัน sem_getvalue ด้านล่าง จะได้รับมูลค่าปัจจุบันของสัญญาณและวางไว้ในปลายทางที่ชี้ด้วยวาล์

>>Int sem_getvalue(sem_t*sem, int *ลูกสุนัข);

Sem_destroy

คุณควรใช้เมธอด sem_destroy หากคุณต้องการทำลายสัญญาณ หากการสิ้นสุดของสัญญาณกำลังดำเนินไป จะไม่มีเธรดใดรออยู่ในสัญญาณ

>>Int sem_destroy(sem_t*sem);

ติดตั้งยูทิลิตี้ GCC

ในการคอมไพล์โค้ด POSIX Semaphore C คุณต้องติดตั้งยูทิลิตี้ gcc ไว้ในระบบ Linux ของคุณ เพื่อจุดประสงค์นี้ ให้เปิดเทอร์มินัลคำสั่งแล้วลองใช้คำสั่งด้านล่าง

$sudo apt-get install gcc

ยืนยันการกระทำของคุณโดยกดปุ่ม และ .

การใช้งาน POSIX Semaphore ด้วยการเขียนโปรแกรม C ใน Ubuntu

ในตอนเริ่มต้น คุณต้องสร้างไฟล์ใหม่ที่มีนามสกุล .cpp บนระบบ Ubuntu 20.04 สำหรับสิ่งนี้ คุณต้องไปที่โฮมไดเร็กทอรีของคุณและสร้างไฟล์เปล่าใหม่ชื่อ new.cpp คุณสามารถสร้างได้โดยใช้คำสั่งสัมผัสในเทอร์มินัลคำสั่งของคุณ

คุณจะเห็นว่ามีการสร้างไฟล์ new.cpp ในโฮมไดเร็กทอรี


หลังจากสร้างไฟล์ .cpp แล้ว ให้เปิดเป็นตัวแก้ไขข้อความในระบบ Linux ของคุณและเขียนโค้ดด้านล่างในไฟล์นี้ตามที่เป็นอยู่ หลังจากนั้นให้บันทึกและปิด

ดำเนินการโปรแกรม POSIX Semaphore C ใน Ubuntu 20.04

เปิดเทอร์มินัลของคุณใน Ubuntu 20.04 และรันคำสั่ง gcc ด้านล่างตามด้วยชื่อไฟล์

$gccfilename.c –lpthread –lrt

มี 2 ​​เธรดเกิดขึ้น เธรดหนึ่งเกิดขึ้นหลังจากอีก 2 วินาทีของเธรดอื่น หลังจากได้รับโบลต์แล้ว เกลียวแรกสุดจะสลีปเป็นเวลา 4 วินาที ดังนั้น หลังจากที่เรียกแล้ว เธรดที่สองจะไม่เข้าร่วมโดยตรง และจะปรากฏขึ้น 4-2=2 วินาทีหลังจากที่ถูกเรียก นี่คือผลลัพธ์:

ถ้าเราไม่ได้ใช้เซมาฟอร์ ตามบริบทที่เปลี่ยน ผลลัพธ์อาจเป็นไปตามข้อสังเกต:

บทสรุป

ในคู่มือนี้ ได้ให้ภาพรวมโดยละเอียดของการใช้ POSIXSemaphore กับการเขียนโปรแกรม C ใน Ubuntu 20 เพียงใช้ไลบรารี POSIX หรือ Pthread ตลอดทั้งโค้ด C บางอย่าง POSIX Semaphore ก็สามารถใช้เพื่อป้องกันสภาวะการแข่งขันระหว่างการเข้ารหัสได้อย่างง่ายดาย