แพริตีบิต

ประวัติ

แต่เดิม "แพริตีแทร็ก" (parity track) ได้เสนอขึ้นเป็นครั้งแรกพร้อมกับแถบแม่เหล็กสำรองข้อมูลใน ค.ศ. 1951 แพริตีในลักษณะนี้เป็นการตรวจสอบด้วยส่วนซ้ำซ้อนแนวตั้งหรือตามขวาง (transverse redundancy check) ซึ่งกระทำผ่านสัญญาณคู่ขนานหลายสัญญาณไขว้ข้ามกัน สิ่งนี้สามารถผสานได้กับแพริตีที่คำนวณโดยบิตหลายบิตที่ส่งมาจากสัญญาณเดียว นั่นคือการตรวจสอบด้วยส่วนซ้ำซ้อนตามยาว (longitudinal redundancy check) ในบัสคู่ขนาน จะมีหนึ่งบิตเพื่อการตรวจสอบด้วยส่วนซ้ำซ้อนตามยาว ต่อสัญญาณคู่ขนานหนึ่งคู่

การตรวจหาความผิดพลาด

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

ตัวอย่าง

สมมติว่า A ต้องการส่งข้อมูลขนาดสี่บิตคือ 1001 ไปยัง B กำหนดให้แพริตีบิตอยู่ทางขวา เครื่องหมาย ^ แทนเกต XOR และเครื่องหมาย ~ คือเกต NOT หรือนิเสธ
การส่งผ่านโดยใช้แพริตีบิตคู่ (even)

A ต้องการส่งข้อมูล 1001
A คำนวณค่าของแพริตีบิต 1^0^0^1 = 0
A เพิ่มแพริตีบิตต่อท้ายและส่งข้อมูล 10010
B ได้รับข้อมูล 10010
B คำนวณแพริตี 1^0^0^1^0 = 0
B รายงานว่าการส่งข้อมูลถูกต้อง เนื่องจากผลลัพธ์เป็นเลขคู่
การส่งผ่านโดยใช้แพริตีบิตคี่ (odd)

A ต้องการส่งข้อมูล 1001
A คำนวณค่าของแพริตีบิต ~ (1^0^0^1) = 1
A เพิ่มแพริตีบิตต่อท้ายและส่งข้อมูล 10011
B ได้รับข้อมูล 10011
B คำนวณแพริตี 1^0^0^1^1 = 1
B รายงานว่าการส่งข้อมูลถูกต้อง เนื่องจากผลลัพธ์เป็นเลขคี่
กลไกนี้สามารถตรวจหาความผิดพลาดในหนึ่งบิต เพราะหากมีหนึ่งบิตถูกสลับค่าอันเนื่องมาจากสัญญาณแทรกซ้อน จะให้จำนวนของค่า 1 ผิดไปในข้อมูลที่ได้รับ จากสองตัวอย่างข้างต้น B ได้คำนวณค่าแพริตีและพบว่าตรงกับแพริตีบิต แสดงว่าไม่มีหนึ่งบิตใดผิดพลาด ลองพิจารณาตัวอย่างต่อไปนี้ซึ่งมีความผิดพลาด ณ บิตที่สอง ส่งผ่านโดยใช้แพริตีบิตคู่

A ต้องการส่งข้อมูล 1001
A คำนวณค่าของแพริตีบิต 1^0^0^1 = 0
A เพิ่มแพริตีบิตต่อท้ายและส่งข้อมูล 10010
*** เกิดความผิดพลาดระหว่างทาง ***
B ได้รับข้อมูล 11010
B คำนวณแพริตี 1^1^0^1^0 = 1
B รายงานว่าการส่งข้อมูลผิดพลาด เนื่องจากผลลัพธ์เป็นเลขคี่
B คำนวณแพริตีได้ 1 แต่ในแพริตีบิตเป็น 0 จึงแจ้งว่าการส่งผ่านข้อมูลผิดพลาด
ในกรณีแพริตีบิตถูกเปลี่ยนค่าเสียเอง ส่งผ่านโดยใช้แพริตีบิตคู่เช่นกัน

A ต้องการส่งข้อมูล 1001
A คำนวณค่าของแพริตีบิต 1^0^0^1 = 0
A เพิ่มแพริตีบิตต่อท้ายและส่งข้อมูล 10010
*** เกิดความผิดพลาดระหว่างทาง ***
B ได้รับข้อมูล 10011
B คำนวณแพริตี 1^0^0^1^1 = 1
B รายงานว่าการส่งข้อมูลผิดพลาด เนื่องจากผลลัพธ์เป็นเลขคี่
B คำนวณแพริตีได้ 1 แม้จะตรงกับแพริตีบิตที่ส่งมาก็ตาม แต่เงื่อนไขที่กำหนดไว้ในตอนต้นว่าให้ใช้หลักแพริตีบิตคู่ ดังนั้นจึงแจ้งว่าการส่งผ่านข้อมูลผิดพลาด
การใช้แพริตีก็มีข้อจำกัด แพริตีบิตสามารถรับรองได้แค่จำนวนบิตที่เปลี่ยนแปลงไปเป็นเลขคี่ (1 บิต 3 บิต 5 บิต ฯลฯ) ถ้าหากจำนวนบิตถูกเปลี่ยนแปลงไปเป็นจำนวนคู่ แพริตีบิตจะยังคงคำนวณได้ถูกต้องอยู่ ถึงแม้ข้อมูลจะผิดแผกไปจากเดิม จากตัวอย่างนี้ใช้แพริตีบิตคู่

A ต้องการส่งข้อมูล 1001
A คำนวณค่าของแพริตีบิต 1^0^0^1 = 0
A เพิ่มแพริตีบิตต่อท้ายและส่งข้อมูล 10010
*** เกิดความผิดพลาดระหว่างทาง ***
B ได้รับข้อมูล 11011
B คำนวณแพริตี 1^1^0^1^1 = 0
B รายงานว่าการส่งข้อมูลถูกต้อง เนื่องจากผลลัพธ์เป็นเลขคู่ ถึงแม้ข้อมูลจะผิดพลาด
B ซึ่งกำลังสังเกตการณ์แพริตีบิตเป็นเลขคู่ ล้มเหลวในการตรวจหาบิตที่ผิดพลาดสองบิตนั้น

การใช้งาน

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

แพริตีบล็อก

แพริตีบล็อกมีการใช้โดยเรดในบางระดับ ส่วนซ้ำซ้อนของข้อมูลจะถูกเก็บไว้ในแพริตีบล็อก ถ้าหากมีไดรฟ์หนึ่งในเรดเกิดผิดพลาด บล็อกข้อมูลและแพริตีบล็อกจะสามารถผสานกันเพื่อสร้างข้อมูลส่วนที่ขาดหายไปขึ้นมาได้ใหม่
สมมติให้แผนภาพต่อไปนี้เป็นการต่อจานบันทึกแบบเรดระดับ 5 ซึ่งทรงกระบอกแต่ละอันแทนจานบันทึกหนึ่งเครื่อง กำหนดให้ข้อมูลที่อยู่ในบล็อก A1 = 00000111, A2 = 00000101, และ A3 = 00000000 ส่วนบล็อก Ap (แพริตีบล็อก) จะถูกสร้างขึ้นจากข้อมูลใน A1 A2 และ A3 นำมาดำเนินการ XOR ต่อกัน ได้ผลลัพธ์เป็น 00000010 ถ้าหากจานบันทึกหมายเลข 1 เกิดล้มเหลว บล็อก A2 ก็จะไม่สามารถเข้าถึงได้ แต่จะสามารถสร้างข้อมูลเดิมกลับมาได้โดยการทำ XOR บล็อกที่เหลือคือ A1 A3 และ Ap นั่นคือ A2 = A1 XOR A3 XOR Ap = 00000101 ซึ่งเท่ากับข้อมูลในตอนแรก

ข้อเสีย

การใช้ Parity bit คือ เสียเวลา และไม่ได้ประโยชน์เท่าไรนัก เพราะไม่สามารถบอกได้ว่าผิดที่ตำแหน่งตรงไหน และแก้ไขข้อผิดพลาดไม่ได้ บอกได้แค่เพียงว่ามีความผิดพลาดเกิดขึ้นเท่านั้น และ ถ้าสมมติข้อมูลเกิดผิดพลาดทีเดียว 2 บิต เช่น 10001001 เปลี่ยนเป็น 10101011 เราก็ไม่สามารถเช็คข้อผิดพลาดโดยใช้วิธี Parity ได้