อ่าน 2 นาที
ลำดับ
seqlock (ย่อมาจาก sequence lock ) เป็น กลไก การล็อก แบบพิเศษ ที่ใช้ใน Linux เพื่อรองรับการเขียนตัวแปรที่ใช้ร่วมกันอย่างรวดเร็วระหว่างสอง รูทีน ของระบบปฏิบัติการ แบบขนาน...
ลำดับ
seqlock (ย่อมาจากsequence lock ) เป็น กลไก การล็อก แบบพิเศษ ที่ใช้ในLinuxเพื่อรองรับการเขียนตัวแปรที่ใช้ร่วมกันอย่างรวดเร็วระหว่างสอง รูทีน ของระบบปฏิบัติการ แบบขนาน ความหมายของกลไก นี้มีความเสถียรตั้งแต่เวอร์ชัน 2.5.59 และมีอยู่ในเคอร์เนลเวอร์ชัน 2.6.x ที่เสถียรแล้ว seqlock ได้รับการพัฒนาโดย Stephen Hemminger และเดิมเรียกว่า frlocks โดยอิงจากงานก่อนหน้าของ Andrea Arcangeli การใช้งานครั้งแรกอยู่ในรหัสเวลา x86-64 ซึ่งจำเป็นต้องซิงโครไนซ์กับพื้นที่ผู้ใช้ เนื่องจากไม่สามารถใช้ล็อกจริงได้
นี่คือ กลไกที่สอดคล้องกันระหว่าง ผู้อ่านและผู้เขียนซึ่งช่วยหลีกเลี่ยงปัญหาการขาดแคลนทรัพยากรสำหรับผู้เขียน (writer starvation ) seqlock ประกอบด้วยพื้นที่จัดเก็บสำหรับบันทึกหมายเลขลำดับ นอกเหนือจากตัวล็อก ตัวล็อกใช้เพื่อรองรับการซิงโครไนซ์ระหว่างผู้เขียนสองคน และตัวนับใช้เพื่อระบุความสอดคล้องในผู้อ่าน นอกจากการอัปเดตข้อมูลที่ใช้ร่วมกันแล้ว ผู้เขียนจะเพิ่มหมายเลขลำดับ ทั้งหลังจากได้รับล็อกและก่อนปล่อยล็อก ผู้อ่านจะอ่านหมายเลขลำดับก่อนและหลังการอ่านข้อมูลที่ใช้ร่วมกัน หากหมายเลขลำดับเป็นเลขคี่ในทั้งสองครั้ง แสดงว่าผู้เขียนได้ล็อกข้อมูลไว้ในขณะที่กำลังอ่านข้อมูล และข้อมูลอาจมีการเปลี่ยนแปลง หากหมายเลขลำดับแตกต่างกัน แสดงว่าผู้เขียนได้เปลี่ยนแปลงข้อมูลในขณะที่กำลังอ่าน ในทั้งสองกรณี ผู้อ่านจะลองใหม่ (โดยใช้ลูป) จนกว่าจะอ่านหมายเลขลำดับที่เป็นเลขคู่เดียวกันทั้งก่อนและหลัง
ตัวอ่านจะไม่ถูกบล็อก แต่Hอาจต้องลองใหม่หากมีการเขียนข้อมูลอยู่ ซึ่งจะช่วยเพิ่มความเร็วในการอ่านในกรณีที่ข้อมูลไม่ได้ถูกแก้ไข เนื่องจากไม่ต้องขอสิทธิ์การเข้าถึงเหมือนกับการใช้ล็อกแบบอ่าน-เขียนแบบดั้งเดิม นอกจากนี้ ผู้เขียนไม่ต้องรอผู้อ่าน ในขณะที่ล็อกแบบอ่าน-เขียนแบบดั้งเดิมนั้นผู้เขียนต้องรอ ซึ่งอาจนำไปสู่การขาดแคลนทรัพยากรในกรณีที่มีผู้อ่านจำนวนมาก (เนื่องจากผู้เขียนต้องรอจนกว่าจะไม่มีผู้อ่านเหลืออยู่) ด้วยเหตุผลสองประการนี้ ล็อกแบบลำดับจึงมีประสิทธิภาพมากกว่าล็อกแบบอ่าน-เขียน แบบดั้งเดิม ในสถานการณ์ที่มีผู้อ่านจำนวนมากและผู้เขียนจำนวนน้อย ข้อเสียคือ หากมีการเขียนข้อมูลมากเกินไปหรือตัวอ่านช้าเกินไป อาจทำให้เกิดการติดขัด (และผู้อ่านอาจขาดแคลนทรัพยากร)
เทคนิคนี้ใช้ไม่ได้กับข้อมูลที่มีตัวชี้ เพราะผู้เขียนคนใดก็ได้สามารถทำให้ตัวชี้ที่ผู้อ่านได้ติดตามอยู่แล้วนั้นใช้การไม่ได้ การอัปเดตบล็อกหน่วยความจำที่ตัวชี้ชี้ไปนั้นสามารถทำได้โดยใช้ seqlocks แต่การอัปเดตตัวชี้เองนั้นไม่ได้รับอนุญาต ในกรณีที่จำเป็นต้องอัปเดตหรือเปลี่ยนแปลงตัวชี้ การใช้ การซิงโครไนซ์ แบบอ่าน-คัดลอก-อัปเดต (read-copy-update)จะเป็นวิธีที่เหมาะสมกว่า
วิธีการนี้ถูกนำมาใช้ครั้งแรกในการอัปเดตตัวนับเวลาของระบบ การขัดจังหวะเวลาแต่ละครั้งจะอัปเดตเวลาของวัน อาจมีตัวอ่านเวลาหลายตัวสำหรับการใช้งานภายในระบบปฏิบัติการและแอปพลิเคชันต่างๆ แต่การเขียนข้อมูลนั้นค่อนข้างไม่บ่อยนักและเกิดขึ้นเพียงครั้งละหนึ่งรายการเท่านั้น ตัวอย่างเช่น โค้ดตัวนับเวลาของ BSD ดูเหมือนจะใช้วิธีการที่คล้ายกันนี้
ปัญหาเล็กน้อยอย่างหนึ่งของการใช้ seqlocks สำหรับตัวนับเวลาคือ เป็นไปไม่ได้ที่จะไล่ดูทีละขั้นตอนด้วยดีบักเกอร์ ตรรกะการลองใหม่จะทำงานตลอดเวลา เพราะดีบักเกอร์ทำงานช้าพอที่จะทำให้เกิดการแย่งอ่านข้อมูลขึ้นเสมอ
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ลำดับ
seqlock (ย่อมาจาก sequence lock ) เป็น กลไก การล็อก แบบพิเศษ ที่ใช้ใน Linux เพื่อรองรับการเขียนตัวแปรที่ใช้ร่วมกันอย่างรวดเร็วระหว่างสอง รูทีน ของระบบปฏิบัติการ แบบขนาน...
ดูเพิ่มเติม
การซิงโครไนซ์ สปินล็อค ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Seqlock&oldid=1321575449 "