รับเข้า/ส่งออก

อินพุต/เอาต์พุต ย่อว่า ไอ/โอ (input/output: I/O) หรือภาษาไทยว่า รับเข้า/ส่งออก ในทางคอมพิวเตอร์ หมายถึงการสื่อสารระหว่างระบบประมวลผลสารสนเทศ (เช่นคอมพิวเตอร์) กับโลกภายนอก ซึ่งอาจเป็นมนุษย์หรือระบบประมวลผลสารสนเทศอีกระบบหนึ่ง อินพุตหรือสิ่งรับเข้าคือสัญญาณหรือข้อมูลที่ระบบรับเข้ามา และเอาต์พุตหรือสิ่งส่งออกคือสัญญาณหรือข้อมูลที่ระบบส่งออกไป ศัพท์นี้ใช้เรียกการกระทำเพียงส่วนหนึ่ง กล่าวคือ “การกระทำไอ/โอ” หมายถึงการปฏิบัติการรับเข้าหรือส่งออกสัญญาณหรือข้อมูล บุคคลหนึ่ง (หรือระบบอื่น) สามารถใช้อุปกรณ์ไอ/โอเพื่อสื่อสารกับคอมพิวเตอร์ ตัวอย่างเช่น คีย์บอร์ดหรือเมาส์จัดว่าเป็นอุปกรณ์รับเข้าสำหรับคอมพิวเตอร์ ในขณะที่จอภาพและเครื่องพิมพ์จัดว่าเป็นอุปกรณ์ส่งออกสำหรับคอมพิวเตอร์ ส่วนอุปกรณ์ที่สื่อสารระหว่างคอมพิวเตอร์ด้วยกัน เช่นโมเด็มหรือแผ่นวงจรเครือข่าย โดยปกติสามารถเป็นได้ทั้งอุปกรณ์รับเข้าและส่งออก
มีข้อสังเกตเกี่ยวกับการออกแบบของอุปกรณ์ว่าจะเป็นการรับเข้าหรือการส่งออกขึ้นอยู่กับมุมมอง ตัวอย่างเช่น เมาส์และคีย์บอร์ดรับเข้าการเคลื่อนไหวทางกายภาพที่ส่งออกโดยมนุษย์ผู้ใช้งาน และแปลงเป็นสัญญาณที่คอมพิวเตอร์สามารถเข้าใจ สัญญาณส่งออกจากอุปกรณ์เหล่านี้จึงเป็นสัญญาณรับเข้าของคอมพิวเตอร์ และเช่นเดียวกัน เครื่องพิมพ์และจอภาพรับเข้าสัญญาณที่ส่งออกจากคอมพิวเตอร์ และแปลงสัญญาณเหล่านี้เป็นการแสดงผลที่มนุษย์ผู้ใช้งานสามารถมองเห็นหรืออ่านได้ กระบวนการอ่านหรือการมองเห็นการแสดงผลก็เป็นข้อมูลรับเข้าของมนุษย์ผู้ใช้งาน การศึกษาการโต้ตอบเหล่านี้อยู่ในขอบเขตที่เรียกว่าการโต้ตอบระหว่างมนุษย์กับคอมพิวเตอร์ (human-computer interaction)
ในสถาปัตยกรรมคอมพิวเตอร์ การรวมผสานระหว่างหน่วยประมวลผลกลางกับหน่วยความจำหลักจะถูกพิจารณาว่าเป็น “สมอง” ของคอมพิวเตอร์ (หน่วยประมวลผลกลางที่อ่านและเขียนหน่วยความจำหลักได้โดยตรงด้วยชุดคำสั่งเฉพาะเป็นอาทิ) และจากมุมมองดังกล่าว การถ่ายโอนสารสนเทศมาจากหรือไปสู่การรวมผสานนั้นกับหน่วยอื่น เช่นหน่วยขับจานบันทึก ถือว่าเป็นไอ/โอ หน่วยประมวลผลกลางและวงจรที่รองรับได้จัดเตรียมไอ/โอที่จับจองบนหน่วยความจำ (memory-mapped I/O) ไว้ให้ ซึ่งใช้ในการเขียนโปรแกรมระดับล่างเพื่อพัฒนาโปรแกรมขับอุปกรณ์ (device driver) ขั้นตอนวิธีของไอ/โอเป็นสิ่งหนึ่งที่ออกแบบมาเพื่อใช้ประโยชน์เอกลักษณ์เฉพาะเครื่องและปฏิบัติการอย่างมีประสิทธิภาพ เมื่อมีข้อมูลอยู่บนหน่วยเก็บข้อมูลสำรองเช่นหน่วยขับจานบันทึก

**ส่วนต่อประสาน**
ส่วนต่อประสานไอ/โอจะเป็นสิ่งจำเป็นก็ต่อเมื่ออุปกรณ์ไอ/โอถูกขับเคลื่อนโดยหน่วยประมวลผล ส่วนต่อประสานต้องมีตรรกะที่จำเป็นเพื่อตีความเลขที่อยู่ของอุปกรณ์ซึ่งสร้างโดยหน่วยประมวลผล การเจรจาตกลง (handshaking) ควรกระทำให้เกิดผลด้วยคำสั่งที่เหมาะสมของส่วนต่อประสานอย่างเช่น BUSY, READY, WAIT หน่วยประมวลผลจึงจะสามารถสื่อสารกับอุปกรณ์ไอ/โอผ่านส่วนต่อประสานนั้น ถ้ารูปแบบข้อมูลที่จะแลกเปลี่ยนมีลักษณะต่างไป ส่วนต่อประสานจะต้องสามารถแปลงข้อมูลลำดับเป็นรูปแบบขนานและในทางกลับกันได้ ต้องมีข้อกำหนดเพื่อสร้างสัญญาณขัดจังหวะ (interrupt) พร้อมทั้งเลขประเภทที่สอดคล้องสำหรับการประมวลผลในภายหน้าเมื่อเป็นที่ต้องการโดยหน่วยประมวลผล
คอมพิวเตอร์ประเภทที่ใช้ไอ/โอที่จับจองบนหน่วยความจำ เข้าถึงฮาร์ดแวร์โดยการอ่านและการเขียนบนตำแหน่งที่อยู่บนหน่วยความจำที่ระบุ โดยใช้ชุดคำสั่งภาษาแอสเซมบลีชุดเดิมตามปกติที่คอมพิวเตอร์ใช้เข้าถึงหน่วยความจำ

**การทำให้เกิดผลในระดับที่สูงกว่า**
ระบบปฏิบัติการและเครื่องมืออำนวยความสะดวกในการเขียนโปรแกรมในระดับที่สูงกว่า ใช้มโนทัศน์และพื้นฐานไอ/โอที่เป็นนามธรรมมากกว่าและแบ่งแยกออกจากกัน ตัวอย่างเช่น ระบบปฏิบัติการส่วนมากจัดเตรียมโปรแกรมประยุกต์ต่าง ๆ ไว้ด้วยแนวคิดของไฟล์ ภาษาโปรแกรมกลุ่มภาษาซี ภาษาซีพลัสพลัส และระบบปฏิบัติการตระกูลยูนิกซ์ โดยดั้งเดิมจะถือว่าไฟล์และอุปกรณ์ต่าง ๆ เป็นกระแสข้อมูล (stream) ซึ่งสามารถอ่าน เขียน หรือกระทำได้ทั้งสองอย่าง ไลบรารีภาษาซีมาตรฐานได้จัดเตรียมฟังก์ชันเพื่อจัดดำเนินการกระแสข้อมูลรับเข้าและส่งออกไว้ด้วย
ในบริบทของภาษาอัลกอล 68 เครื่องมืออำนวยความสะดวกเกี่ยวกับสิ่งรับเข้าและสิ่งส่งออกกล่าวโดยรวมเป็น ทรานสพุต (transput) ไลบรารีทรานสพุตของภาษาอัลกอล 68 สามารถรับรู้ไฟล์หรืออุปกรณ์มาตรฐานต่อไปนี้ได้แก่ stand in, stand out, stand errors และ stand back
ฟังก์ชันพื้นฐานพิเศษอีกทางเลือกหนึ่งคือไอ/โอโมแนด (I/O monad) ซึ่งอนุญาตให้โปรแกรมสั่งการไอ/โอได้เท่านั้น ส่วนการทำงานจะเกิดขึ้นนอกตัวโปรแกรม สิ่งนี้เป็นสิ่งสำคัญเพราะฟังก์ชันไอ/โอจะต้องเพิ่มผลข้างเคียงเข้าไปในภาษาโปรแกรมใด ๆ แต่ในทางปฏิบัติ การเขียนโปรแกรมเชิงฟังก์ชันโดยแท้จริงเท่านั้นที่ทำได้ในขณะนี้

**ภาวะการกำหนดเลขที่**
MOV register, address ; อ่าน
MOV address, register ; เขียน
 ในทำนองเดียวกัน
IN  register, address ; อ่านเป็นอินพุต
OUT address, register ; เขียนเป็นเอาต์พุต
หน่วยความจำสามารถอ่านหรือเก็บบันทึกข้อมูลได้หลายวิธี แต่ละวิธีก็เป็นภาวะการกำหนดเลขที่อยู่แบบหนึ่ง ซึ่งก็มีข้อได้เปรียบและข้อจำกัดของมันเอง ภาวะการกำหนดเลขที่อยู่มีหลายประเภทเช่น การกำหนดเลขที่อยู่ทางตรง ทางอ้อม แบบใช้ทันที แบบดัชนี แบบฐาน แบบดัชนีบนฐาน แบบแสดงนัย ฯลฯ

**การกำหนดเลขที่อยู่ทางตรง**
การกำหนดเลขที่อยู่ด้วยวิธีนี้เป็นส่วนหนึ่งของชุดคำสั่งในตัวเองอยู่แล้ว เมื่อหน่วยประมวลผลตีความชุดคำสั่ง จะดึงเลขที่อยู่หน่วยความจำจากตำแหน่งที่สามารถอ่านหรือเขียนข้อมูลสารสนเทศที่ต้องการ ตัวอย่างเช่น 
MOV register, address ; อ่าน
MOV address, register ; เขียน
 ในทำนองเดียวกัน
IN  register, address ; อ่านเป็นอินพุต
OUT address, register ; เขียนเป็นเอาต์พุต
ในที่นี้ตัวถูกดำเนินการ address ชี้ไปยังตำแหน่งบนหน่วยความจำที่มีข้อมูลอยู่ และคัดลอกค่าที่อ่านได้ลงใน register ที่ระบุ หรือคัดลอกค่าจาก register ที่ระบุไปยังตำแหน่งบนหน่วยความจำ สัญลักษณ์วงเล็บเหลี่ยมคือตัวดำเนินการอ้างอิงกลับ (dereference operator)

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

**อ้างอิง ==