คำถามที่พบบ่อยที่สุดที่ถามในการสัมภาษณ์เมื่อเร็ว ๆ นี้คือฟิลด์ IO บางคนได้รับคำตอบในขณะที่บางคนตอบไม่ดี เมื่อเร็ว ๆ นี้ฉันได้เริ่มเรียนรู้เพิ่มเติมเกี่ยวกับสิ่งเหล่านี้และต้องการสรุปพวกเขา
จุดส่วนหน้า
1. พื้นที่ระบบพื้นที่ผู้ใช้
ระบบ Linux จะแบ่งกระบวนการออกเป็นสองช่องว่างพื้นที่ผู้ใช้และพื้นที่ระบบ ตัวอย่างเช่นการเข้ารหัสปกติของเราคือพื้นที่ผู้ใช้ทั้งหมด หากเราต้องการเรียกใช้ฟังก์ชั่นระบบเช่นไฟล์ระบบคัดลอกเราจำเป็นต้องเรียกส่วนประกอบระบบรับบริการเคอร์เนลและการดำเนินการที่สมบูรณ์
สองขั้นตอนของ IO
กระบวนการดำเนินการของ IO แบ่งออกเป็นสองขั้นตอนรอให้พร้อมที่จะดำเนินการคัดลอก
รอพร้อม: เรารู้ว่าเมื่อเราดำเนินการ IO ข้อมูลอาจมาจากแอปพลิเคชันหรือเครือข่ายอื่น ๆ หากไม่มีข้อมูลระบบปฏิบัติการจะรอ ในเวลานี้แอปพลิเคชันอาจรอการคัดลอก: คัดลอกข้อมูลไปยังพื้นที่ทำงานแอปพลิเคชัน
การปิดกั้นและไม่ปิดกั้นแบบซิงโครนัสและแบบอะซิงโครนัส
มาพูดคุยเกี่ยวกับการซิงโครไนซ์และการไม่เปลี่ยนแปลงก่อน สิ่งที่ง่ายที่สุดคือดูว่าเธรดหรือกระบวนการเริ่มเสร็จสิ้น IO เมื่อซิงโครไนซ์ IO ระบบจะหยุดและรอให้สิ่งนี้เสร็จก่อนทำสิ่งอื่น ๆ Asynchronous IO ใช้วิธีการหลายเธรดเพื่อเริ่มต้นเธรดใหม่เพื่อทำสิ่งนี้และคุณสามารถทำสิ่งอื่น ๆ และรอการแจ้งเตือน
มาพูดคุยเกี่ยวกับการบล็อกและไม่ปิดกั้น สองสิ่งนี้มุ่งเน้นไปที่สถานะของโปรแกรมเมื่อรอผลการโทร การบล็อกหมายความว่าเมื่อคุณได้รับผลลัพธ์นี้คุณจะแขวนจนกว่าคุณจะรอผลลัพธ์ที่สมบูรณ์ การไม่ปิดกั้นหมายความว่าเมื่อกระบวนการไม่สามารถรับผลลัพธ์ได้จะไม่มีเธรดบล็อก นี่คือการพันกันเล็กน้อย มีคำอธิบายร่วมกัน ถ้ามันปิดกั้นฉันต้องการได้รับสิ่งนี้ ในระหว่างกระบวนการซื้อกิจการฉันสูญเสีย CPU ฉันจะไม่ได้รับ CPU จนกว่าจะได้ผลลัพธ์ อย่างไรก็ตามถ้าฉันไม่ปิดกั้นฉันจะถือ CPU ต่อไปและฉันยังสามารถตรวจสอบได้
หลายรุ่น IO
ปัจจุบันมี 5 ประเภท
การปิดกั้น io
ประเภท IO แบบดั้งเดิมที่สุดคือการอ่านและการเขียนจะบล็อก
IO ที่ไม่ปิดกั้น
เมื่อผู้ใช้เริ่มต้นการอ่านมันจะไม่สูญเสีย CPU มันจะตรวจสอบต่อไป หากไม่ประสบความสำเร็จข้อผิดพลาดจะถูกส่งคืน หากได้รับสัญญาณที่ประสบความสำเร็จมันจะเริ่มต้นการดำเนินการอ่านเพื่อให้ได้ผลลัพธ์ที่สมบูรณ์
มัลติเพล็กซิ่ง io
นี่คือแกนกลางของ Java Nio จะมีเธรดที่จัดการสถานะของซ็อกเก็ตหลายตัวเพื่อตรวจสอบว่าคุณพร้อมหรือไม่ เฉพาะเมื่อคุณพบว่าคุณพร้อมจริงๆคุณจะเรียก CPU เพื่อดำเนินการ IO สิ่งนี้สำคัญกว่า
ไดรฟ์สัญญาณ io
ใช้น้อยกว่าเพิกเฉย
IO แบบอะซิงโครนัส
รับเธรดเพื่อดำเนินการ