ในการออกแบบระบบ IO ที่มีประสิทธิภาพสูงมีแนวคิดคำนามหลายประการที่ทำให้เราสับสน รายละเอียดมีดังนี้:
1 การซิงโครไนซ์คืออะไร?
2 แบบอะซิงโครนัสคืออะไร?
3 การบล็อกคืออะไร?
4 การไม่ปิดกั้นคืออะไร?
5 การบล็อกแบบซิงโครนัสคืออะไร?
6 การไม่ปิดกั้นแบบซิงโครนัสคืออะไร?
7 การบล็อกแบบอะซิงโครนัสคืออะไร?
8 การไม่ปิดกั้นแบบอะซิงโครนัสคืออะไร?
ให้ฉันยกตัวอย่างในชีวิต:
หากคุณต้องการชามข้าวไก่ Kung Pao:
การอุดตันแบบซิงโครนัส: คุณไปที่ร้านอาหารเพื่อสั่งอาหารจากนั้นรอที่นั่นแล้วตะโกน: โอเค?
การไม่ปิดกั้นแบบซิงโครนัส: หลังจากสั่งซื้อในร้านอาหารฉันไปเดินเล่นสุนัข แต่หลังจากเดินไปซักพักเขาก็กลับไปที่ร้านอาหารและตะโกน: โอเค?
การอุดตันแบบอะซิงโครนัส: เมื่อเดินสุนัขฉันได้รับโทรศัพท์จากร้านอาหารบอกว่าอาหารพร้อมและขอให้คุณรับด้วยตนเอง
การไม่ปิดกั้นแบบอะซิงโครนัส: ร้านอาหารเรียกและพูดว่า "เรารู้ที่ตั้งของคุณและฉันจะส่งให้คุณในภายหลังดังนั้นฉันจึงสามารถเดินสุนัขด้วยความอุ่นใจ"
ก่อนที่เราจะหาปัญหาข้างต้นเราต้องเข้าใจก่อนว่าการซิงโครไนซ์แบบอะซิงโครนัสการปิดกั้นและการไม่ปิดกั้นคืออะไร เฉพาะเมื่อมีการเข้าใจแนวคิดเดียวเหล่านี้อย่างชัดเจนและเมื่อรวมเข้าด้วยกันมันจะค่อนข้างง่าย
1. การซิงโครไนซ์และความสัมพันธ์แบบอะซิงโครนัสมีไว้สำหรับการโต้ตอบระหว่างแอปพลิเคชันและเคอร์เนล
2. การปิดกั้นและการไม่ปิดกั้นเป็นวิธีการที่แตกต่างกันโดยกระบวนการเมื่อเข้าถึงข้อมูลตามสถานะที่พร้อมของการดำเนินการ IO เพื่อให้มันตรงไปตรงมามันเป็นวิธีการใช้งานการอ่านหรือการเขียนฟังก์ชั่นการทำงาน ภายใต้วิธีการบล็อกฟังก์ชั่นการอ่านหรือการเขียนจะรอมากกว่าฟังก์ชั่นการอ่านหรือการเขียนจะส่งคืนค่าสถานะทันที
จากคำอธิบายข้างต้นโดยทั่วไปเราสามารถสรุปประโยคสั้น ๆ : การซิงโครไนซ์และการเกิดแบบอะซิงโครนัสเป็นจุดประสงค์และการปิดกั้นและการไม่ปิดกั้นเป็นวิธีการดำเนินการ
1. การซิงโครไนซ์: หมายถึงกระบวนการของผู้ใช้ที่เรียกใช้การดำเนินการ IO และการรอคอยหรือการสำรวจเพื่อตรวจสอบว่าการดำเนินการ IO พร้อมหรือไม่ ฉันออกไปซื้อเสื้อผ้าบนถนนและทำสิ่งนี้ด้วยตัวเองและฉันไม่สามารถทำอะไรได้อีก
2. อะซิงโครนัส: อะซิงโครนัสหมายความว่าหลังจากกระบวนการของผู้ใช้กระตุ้นการทำงานของ IO มันจะเริ่มทำสิ่งต่าง ๆ ของตัวเอง เมื่อการดำเนินการ IO เสร็จสมบูรณ์จะได้รับแจ้งถึงความสำเร็จของ IO (ลักษณะของการแจ้งเตือนแบบอะซิงโครนัส) บอกเพื่อนของคุณให้เหมาะกับขนาดขนาดและสีของเสื้อผ้าและปล่อยให้เพื่อนของคุณมอบหมายให้ขายแล้วคุณสามารถทำสิ่งอื่น ๆ ได้ (เมื่อใช้ IO แบบอะซิงโครนัส Java มอบหมายให้ IO อ่านและเขียนไปยังระบบปฏิบัติการและจำเป็นต้องผ่านที่อยู่บัฟเฟอร์ข้อมูลและขนาดไปยังระบบปฏิบัติการ)
3. การบล็อก: วิธีการบล็อกที่เรียกว่าหมายความว่าเมื่อพยายามอ่านและเขียนตัวอธิบายไฟล์หากไม่มีอะไรจะอ่านหรือไม่สามารถอ่านได้ชั่วคราวโปรแกรมจะเข้าสู่สถานะรอจนกว่าจะอ่านหรือเขียนได้และไปที่ป้ายรถเมล์เพื่อชาร์จ ในเวลานี้ผู้ชาร์จไม่ได้อยู่ที่นั่น (บางทีเขาอาจเข้าห้องน้ำ) จากนั้นเรารอที่นี่จนกว่าผู้ชาร์จจะกลับมาอีกครั้ง (แน่นอนนี่ไม่ใช่กรณีในสังคมจริง แต่เป็นกรณีในคอมพิวเตอร์)
4. การไม่ปิดกั้น: ในสถานะที่ไม่ปิดกั้นหากไม่มีอะไรจะอ่านหรือไม่สามารถเขียนได้ฟังก์ชั่นการอ่านและการเขียนจะกลับมาทันทีโดยไม่ต้องรอ เมื่อธนาคารถอนเงินเพื่อจัดการธุรกิจเราจะได้รับใบเสร็จเล็กน้อย หลังจากที่เราได้รับมันเราสามารถเล่นกับโทรศัพท์มือถือหรือแชทกับผู้อื่น เมื่อเราหันผู้พูดของธนาคารจะแจ้งให้เราทราบและเราสามารถไปได้
การดำเนินการของ IO แบ่งออกเป็นสองขั้นตอน: การเริ่มต้นคำขอ IO และการดำเนินการ IO ที่เกิดขึ้นจริง
ความแตกต่างระหว่าง IO แบบซิงโครนัสและอะซิงโครนัส IO คือขั้นตอนที่สองถูกบล็อกหรือไม่ หาก IO อ่านและเขียนบล็อกกระบวนการร้องขอจริงมันก็เป็น IO แบบซิงโครนัส
ความแตกต่างระหว่างการปิดกั้น IO และ IO ที่ไม่ปิดกั้นอยู่ในขั้นตอนแรกไม่ว่าคำขอ IO จะถูกบล็อกหรือไม่ หากมันถูกบล็อกจนกว่าจะเสร็จสมบูรณ์มันเป็น IO ที่ปิดกั้นแบบดั้งเดิม หากไม่ได้ถูกบล็อกมันเป็น IO ที่ไม่ปิดกั้น
การซิงโครไนซ์และอะซิงโครนัสมุ่งเน้นไปที่การมีปฏิสัมพันธ์ระหว่างแอปพลิเคชันและเคอร์เนล การซิงโครไนซ์หมายถึงกระบวนการของผู้ใช้ที่กระตุ้นการดำเนินงานของ IO และการรอคอยหรือการสำรวจเพื่อดูว่าการดำเนินการ IO พร้อมหรือไม่ Asynchronous หมายความว่ากระบวนการของผู้ใช้เริ่มทำสิ่งต่าง ๆ ของตัวเองหลังจากทริกเกอร์การดำเนินการ IO และเมื่อการดำเนินการ IO เสร็จสมบูรณ์จะได้รับแจ้งว่าการเสร็จสิ้น IO จะเสร็จสมบูรณ์
การปิดกั้นและการไม่ปิดกั้นเป็นวิธีการที่แตกต่างกันโดยกระบวนการเมื่อเข้าถึงข้อมูลตามสถานะพร้อมของการดำเนินการ IO เพื่อให้มันตรงไปตรงมามันเป็นวิธีการใช้งานการอ่านหรือการเขียนฟังก์ชั่นการทำงาน ภายใต้วิธีการบล็อกฟังก์ชั่นการอ่านหรือการเขียนจะรอมากกว่าฟังก์ชั่นการอ่านหรือการเขียนจะส่งคืนค่าสถานะทันที
ดังนั้นการดำเนินการของ IO สามารถแบ่งออกเป็นสามประเภท: การปิดกั้นแบบซิงโครนัส (เช่นการดำเนินการทางชีวภาพในช่วงต้น), การไม่ปิดกั้นแบบซิงโครนัส (NIO) และการไม่ปิดกั้นแบบอะซิงโครนัส (AIO)
การปิดกั้นแบบซิงโครนัส (ชีวภาพ):
ด้วยวิธีนี้หลังจากกระบวนการของผู้ใช้เริ่มต้นการดำเนินการ IO มันจะต้องรอให้การดำเนินการ IO เสร็จสมบูรณ์ หลังจากการดำเนินการ IO เสร็จสมบูรณ์อย่างแท้จริงกระบวนการของผู้ใช้จะทำงานได้ โมเดล IO แบบดั้งเดิมของ Java เป็นวิธีนี้
การไม่ปิดการปิดกั้นแบบซิงโครนัส (NIO):
ด้วยวิธีนี้กระบวนการผู้ใช้สามารถกลับไปทำสิ่งอื่น ๆ หลังจากเปิดการดำเนินการ IO แต่กระบวนการของผู้ใช้จำเป็นต้องถามว่าการดำเนินการ IO นั้นพร้อมเป็นครั้งคราวหรือไม่ซึ่งต้องใช้กระบวนการของผู้ใช้ในการถามอย่างต่อเนื่อง ในหมู่พวกเขาปัจจุบัน NIO ของ Java นั้นไม่ได้เป็นแบบซิงโครนัส IO
การไม่ปิดกั้นแบบอะซิงโครนัส (AIO):
ด้วยวิธีนี้หลังจากแอปพลิเคชันเริ่มต้นการดำเนินการ IO มันไม่รอให้การดำเนินการ IO ของเคอร์เนลเสร็จสมบูรณ์และจะแจ้งแอปพลิเคชันหลังจากเคอร์เนลเสร็จสิ้นการดำเนินการ IO
การปิดกั้นแบบซิงโครนัส IO (Java Bio):
การซิงโครไนซ์และบล็อกโหมดการใช้งานเซิร์ฟเวอร์คือการเชื่อมต่อกับเธรดหนึ่งนั่นคือเมื่อไคลเอนต์มีคำขอการเชื่อมต่อเซิร์ฟเวอร์ต้องเริ่มเธรดสำหรับการประมวลผล หากการเชื่อมต่อนี้ไม่ได้ทำอะไรมันจะทำให้เกิดการใช้ด้ายที่ไม่จำเป็นและแน่นอนว่าสามารถปรับปรุงได้ผ่านกลไกพูลเธรด
ซิงโครนัสไม่ปิดกั้น IO (Java Nio):
การไม่ปิดกั้นแบบซิงโครนัสโหมดการใช้งานเซิร์ฟเวอร์คือการขอหนึ่งเธรดนั่นคือคำขอการเชื่อมต่อที่ส่งโดยไคลเอนต์จะลงทะเบียนกับมัลติเพล็กเซอร์ มัลติเพล็กเซอร์สำรวจการเชื่อมต่อกับคำขอ I/O และเริ่มเธรดสำหรับการประมวลผล กระบวนการผู้ใช้ยังต้องถามว่าการดำเนินการ IO นั้นพร้อมเป็นครั้งคราวหรือไม่ซึ่งต้องใช้กระบวนการของผู้ใช้ในการถามอย่างต่อเนื่อง
การปิดกั้นแบบอะซิงโครนัส IO (Java Nio):
ด้วยวิธีนี้หลังจากแอปพลิเคชันเริ่มต้นการดำเนินการ IO มันไม่รอให้การดำเนินการ IO ของเคอร์เนลเสร็จสมบูรณ์และจะแจ้งแอปพลิเคชันหลังจากเคอร์เนลเสร็จสิ้นการดำเนินการ IO นี่คือความแตกต่างที่สำคัญที่สุดระหว่างการซิงโครไนซ์และอะซิงโครนัส การซิงโครไนซ์ต้องรอหรือถามอย่างแข็งขันว่า IO เสร็จสมบูรณ์หรือไม่ แล้วทำไมจึงถูกบล็อก? เนื่องจากทำโดยการเลือกการโทรของระบบในเวลานี้และการใช้งานฟังก์ชั่นการเลือกนั้นเป็นการปิดกั้นและข้อดีอย่างหนึ่งของการใช้ฟังก์ชั่นการเลือกคือมันสามารถฟังไฟล์ที่จัดการหลายไฟล์ในเวลาเดียวกัน (ถ้าจากมุมมองของ UNP เลือกการดำเนินการแบบซิงโครนัส
(Java AIO (NIO.2)) แบบอะซิงโครนัสที่ไม่ปิดกั้น IO:
ในโหมดนี้กระบวนการผู้ใช้จะต้องเริ่มต้นการดำเนินการ IO และส่งคืนทันที หลังจากการดำเนินการ IO เสร็จสมบูรณ์อย่างแท้จริงแอปพลิเคชันจะได้รับแจ้งว่าการดำเนินการ IO เสร็จสมบูรณ์ ในเวลานี้กระบวนการของผู้ใช้จะต้องประมวลผลข้อมูลเท่านั้นและไม่จำเป็นต้องดำเนินการอ่านและเขียน IO จริงเนื่องจากการดำเนินการอ่านหรือเขียนจริงของ IO ได้เสร็จสิ้นโดยเคอร์เนล
การวิเคราะห์สถานการณ์ที่เกี่ยวข้องสำหรับ Bio, Nio และ AIO:
วิธีการทางชีวภาพเหมาะสำหรับสถาปัตยกรรมที่มีการเชื่อมต่อค่อนข้างเล็กและการเชื่อมต่อคงที่ วิธีนี้ต้องใช้ทรัพยากรเซิร์ฟเวอร์สูงและพร้อมกันนั้น จำกัด เฉพาะแอปพลิเคชัน มันเป็นตัวเลือกเดียวก่อน JDK1.4 แต่โปรแกรมนั้นใช้งานง่ายง่ายและเข้าใจง่าย
วิธี NIO เหมาะสำหรับสถาปัตยกรรมที่มีการเชื่อมต่อจำนวนมากและการเชื่อมต่อที่ค่อนข้างสั้น (การทำงานแบบเบา) เช่นเซิร์ฟเวอร์แชท การเกิดขึ้นพร้อมกันนั้น จำกัด เฉพาะแอปพลิเคชันและมีการเขียนโปรแกรมที่ค่อนข้างซับซ้อน JDK1.4 เริ่มสนับสนุนแล้ว
วิธี AIO ใช้สำหรับสถาปัตยกรรมที่มีการเชื่อมต่อเป็นจำนวนมากและการเชื่อมต่อที่ค่อนข้างยาว (การเปิดใหม่) เช่นเซิร์ฟเวอร์อัลบั้มซึ่งเรียกระบบปฏิบัติการอย่างเต็มที่เพื่อเข้าร่วมในการดำเนินการพร้อมกันและการเขียนโปรแกรมค่อนข้างซับซ้อน JDK7 ได้เริ่มสนับสนุนแล้ว
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น