อะไรคือความแตกต่างระหว่างล็อคพิเศษและล็อคที่ใช้ร่วมกัน?


119

ตามวิกิพีเดีย

การล็อกที่ใช้ร่วมกันบางครั้งเรียกว่า "read locks" และบางครั้งเรียกว่า "write locks"

คุณช่วยอธิบายเหตุผลเบื้องหลังของคำว่า "แชร์" และ "เอกสิทธิ์เฉพาะตัว" ได้ไหม


การล็อกแบบไม่ผูกขาดเป็นชื่ออื่นของการล็อกที่ใช้ร่วมกันหรือไม่?
Ramesh Papaganti

คำตอบ:


419

ฉันเขียนคำตอบนี้เพราะฉันคิดว่านี่จะเป็นการเปรียบเทียบที่สนุก (และเหมาะสม):

คิดว่าวัตถุที่ล็อคได้เป็นกระดานดำ (ล็อคได้) ในห้องชั้นเรียนที่มีครู (นักเขียน) และนักเรียน (ผู้อ่าน) จำนวนมาก

ในขณะที่ครูกำลังเขียนบางสิ่ง (ล็อคพิเศษ) บนกระดาน:

  1. ไม่มีใครสามารถอ่านได้เพราะมันยังคงถูกเขียนและเธอปิดกั้นมุมมองของคุณ => ถ้าวัตถุถูกล็อคเฉพาะล็อคที่ใช้ร่วมกันไม่สามารถรับได้

  2. ครูคนอื่น ๆ จะไม่เกิดขึ้นและเริ่มต้นการเขียนอย่างใดอย่างหนึ่งหรือคณะกรรมการจะไม่สามารถอ่านได้และนักเรียนสับสน => ถ้าวัตถุถูกล็อคเฉพาะล็อคพิเศษอื่น ๆ ที่ไม่สามารถรับได้

เมื่อนักเรียนอ่าน (ล็อกที่ใช้ร่วมกัน) สิ่งที่อยู่บนกระดาน:

  1. พวกเขาทั้งหมดสามารถอ่านสิ่งที่อยู่ในนั้นร่วมกัน => การล็อกที่ใช้ร่วมกันหลายรายการสามารถอยู่ร่วมกันได้

  2. รอครูผู้สอนสำหรับพวกเขาที่จะเสร็จสิ้นการอ่านก่อนที่เธอจะล้างคณะกรรมการที่จะเขียนมากขึ้น => หากหนึ่งล็อคหรือใช้ร่วมกันมากขึ้นอยู่แล้วล็อคพิเศษไม่สามารถรับได้


2
คำอธิบายที่ดีมาก อย่างไรก็ตาม PO ถามเกี่ยวกับที่มาของนิกาย "แชร์" และ "เอกสิทธิ์" ไม่ใช่คำอธิบายเกี่ยวกับเงื่อนไขต่อตัวเลือก
serhio

นี่คือ "หากมีการล็อกที่ใช้ร่วมกันอย่างน้อยหนึ่งรายการอยู่แล้วจะไม่สามารถรับล็อกพิเศษได้" เป็นความจริง? interms ของ ReentrantReadWriteLock? ฉันคิดว่าสามารถล็อกการเขียนได้ตลอดเวลามิฉะนั้นความอดอยากในการเขียนอาจเกิดขึ้นเนื่องจากการอ่านอย่างต่อเนื่อง
Kanagavelu Sugumar

1
@KanagaveluSugumar ใช่มันเป็นเรื่องจริง คุณไม่สามารถรับการล็อกการเขียนได้เมื่อเอนทิตีอื่นมีการล็อกการอ่านบนวัตถุเดียวกันอยู่แล้ว นั่นคือจุดรวมของการล็อกการอ่าน - เขียน หากคุณบังเอิญเขียนทับบางสิ่งในขณะที่คนอื่นกำลังอ่านอยู่พวกเขาจะอ่านอะไร ฉันไม่รู้ว่าทำไมคุณถึงเลือกล็อกการอ่าน - เขียนแบบ "re-entrant" โดยเฉพาะ แต่ re-entrancy หมายความว่าเจ้าของล็อก re-entrant สามารถ 'lock ()' ได้อีกครั้งและการlock()เรียกที่ตามมาทั้งหมดหลังจาก คนแรกจะกลับมาทันทีและประสบความสำเร็จ กล่าวคือคุณสามารถล็อคสิ่งที่คุณเป็นเจ้าของได้สำเร็จ
ArjunShankar

2
นอกจากนี้คุณยังพูดถึงว่า "ฉันคิดว่าการล็อกการเขียนสามารถรับได้ตลอดเวลามิฉะนั้นความอดอยากในการเขียนอาจเกิดขึ้นเนื่องจากการอ่านอย่างต่อเนื่อง" ซึ่งไม่สามารถทำได้ เขียนล็อคไม่สามารถหาได้ในขณะที่บางหน่วยงานอื่นแล้วถืออ่าน / เขียนล็อค สิ่งที่อาจเกิดขึ้นได้ก็คือถ้าหลายเอนทิตีรอล็อกอ็อบเจ็กต์อยู่แล้วการรอwriterจะถูกกำหนดให้อยู่เหนือการรอผู้อ่านเมื่อล็อกเลือกว่าใครจะได้ล็อกต่อไป (เมื่อเจ้าของปัจจุบันปลดล็อก) นี้เป็นเรื่องเกี่ยวกับนโยบาย
ArjunShankar

ขอบคุณ! ฉันเลือก ReentrantReadWriteLock แล้ว เนื่องจากเป็นคลาสการนำไปใช้งานสำหรับ ReadWriteLock ใน java แล้วมีการตั้งค่าสถานะหรือลำดับความสำคัญมากกว่าเพื่อพูดอ่านเธรดการอ่านใหม่เพิ่มเติมเพื่อรอเมื่อเริ่มการเขียนเธรดรอหรือไม่? เพราะวิธีการหลีกเลี่ยงความอดอยากจากการเขียนกระทู้เนื่องจากการร้องขอการอ่านอย่างต่อเนื่อง?
Kanagavelu Sugumar

34

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

ดังนั้นล็อคการอ่านจะบอกว่า "คุณสามารถอ่านได้แล้ว แต่ถ้าคุณต้องการเขียนคุณจะต้องรอ" ในขณะที่ล็อกการเขียนระบุว่า "คุณต้องรอ"


ฉันรู้ว่าคุณกำลังค้นคว้าเพื่อสนับสนุนการศึกษาของคุณ แต่ฉันไม่สามารถต้านทานแรงกระตุ้นในการบรรยายได้

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

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

การรวมสถานะเซสชันทั้งหมดไว้ในโครงสร้างก็เป็นการปรับปรุงครั้งใหญ่ การเปลี่ยนแปลงสถานะเซสชันเป็นเพียงการเปลี่ยนแปลงค่าของสมาชิกของโครงสร้างสถานะของเซสชัน เนื่องจากไม่มีเซสชันอื่นใดที่มีโอกาสหรือแม้แต่โอกาสในการอ้างอิงสถานะของเซสชันโดยตรงคอลเลคชันเดียวที่อัปเดตคือรายการเซสชัน ด้วยเหตุนี้การล็อกจึงไม่จำเป็นอย่างยิ่งในระหว่างการฝึกโดยเฉพาะที่จุดเริ่มต้นและจุดสิ้นสุดและปริมาณงานเพิ่มขึ้น 3000

สถานการณ์การล็อกทั่วไปอื่น ๆ คือรีซอร์สที่ใช้ร่วมกันระหว่างเธรดของแอ็พพลิเคชันผู้ใช้ เฟรมเวิร์กที่ทันสมัยที่สุดกล่าวถึงสิ่งนี้โดยใช้ข้อความมากกว่าการล็อก เมื่อคุณ "เปลี่ยนไปใช้เธรด UI" คุณกำลังจัดคิวข้อความที่มีตัวชี้ฟังก์ชันและพารามิเตอร์บางตัว (หรือผู้รับมอบสิทธิ์และสแต็กเฟรมขึ้นอยู่กับการนำไปใช้งาน)


6
  • การล็อกแบบเอกสิทธิ์เฉพาะบุคคลหรือการเขียนช่วยให้สามารถเข้าถึงกระบวนการพิเศษสำหรับการเขียนไปยังส่วนที่ระบุของไฟล์ ในขณะที่มีการล็อกการเขียนไม่มีกระบวนการอื่นใดที่สามารถล็อกส่วนนั้นของไฟล์ได้

  • การล็อกที่ใช้ร่วมกันหรือการอ่านห้ามกระบวนการอื่นใดในการขอล็อกการเขียนในส่วนที่ระบุของไฟล์ อย่างไรก็ตามกระบวนการอื่น ๆ สามารถขอล็อกการอ่านได้

เพิ่มเติมเกี่ยวกับเรื่องนั้น: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html


2

หลักการเดียวกันในด้านฐานข้อมูลเช่นกัน ตามเอกสารของ Oracle

โหมดล็อคพิเศษป้องกันไม่ให้แชร์ทรัพยากรที่เกี่ยวข้อง โหมดล็อคนี้ได้มาเพื่อแก้ไขข้อมูล ธุรกรรมแรกที่ล็อคทรัพยากรโดยเฉพาะคือธุรกรรมเดียวที่สามารถเปลี่ยนแปลงทรัพยากรได้จนกว่าจะมีการปลดล็อกเฉพาะ

โหมดล็อคการแชร์อนุญาตให้แชร์ทรัพยากรที่เกี่ยวข้องขึ้นอยู่กับการดำเนินการที่เกี่ยวข้อง ผู้ใช้หลายคนที่อ่านข้อมูลสามารถแชร์ข้อมูลได้โดยการล็อกการแชร์เพื่อป้องกันการเข้าถึงพร้อมกันโดยผู้เขียน (ซึ่งต้องการการล็อกแบบพิเศษ) ธุรกรรมหลายรายการสามารถ
ได้รับการล็อกการแชร์ในทรัพยากรเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.