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

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

มีข้อสังเกตเกี่ยวกับการออกแบบของอุปกรณ์ว่าจะเป็นการรับเข้าหรือการส่งออกขึ้นอยู่กับมุมมอง ตัวอย่างเช่น เมาส์และคีย์บอร์ดรับเข้าการเคลื่อนไหวทางกายภาพที่ส่งออกโดยมนุษย์ผู้ใช้งาน และแปลงเป็นสัญญาณที่คอมพิวเตอร์สามารถเข้าใจ สัญญาณส่งออกจากอุปกรณ์เหล่านี้จึงเป็นสัญญาณรับเข้าของคอมพิวเตอร์ และเช่นเดียวกัน เครื่องพิมพ์และจอภาพรับเข้าสัญญาณที่ส่งออกจากคอมพิวเตอร์ และแปลงสัญญาณเหล่านี้เป็นการแสดงผลที่มนุษย์ผู้ใช้งานสามารถมองเห็นหรืออ่านได้ กระบวนการอ่านหรือการมองเห็นการแสดงผลก็เป็นข้อมูลรับเข้าของมนุษย์ผู้ใช้งาน การศึกษาการโต้ตอบเหล่านี้อยู่ในขอบเขตที่เรียกว่าการโต้ตอบระหว่างมนุษย์กับคอมพิวเตอร์ (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) ซึ่งอนุญาตให้โปรแกรมสั่งการไอ/โอได้เท่านั้น ส่วนการทำงานจะเกิดขึ้นนอกตัวโปรแกรม สิ่งนี้เป็นสิ่งสำคัญเพราะฟังก์ชันไอ/โอจะต้องเพิ่มผลข้างเคียงเข้าไปในภาษาโปรแกรมใด ๆ แต่ในทางปฏิบัติ การเขียนโปรแกรมเชิงฟังก์ชันโดยแท้จริงเท่านั้นที่ทำได้ในขณะนี้

## ภาวะการกำหนดเลขที่

```asm
MOV register, [address] ; อ่าน
MOV [address], register ; เขียน

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

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


```asm
MOV register, [address] ; อ่าน
MOV [address], register ; เขียน

; ในทำนองเดียวกัน
IN  register, [address] ; อ่านเป็นอินพุต
OUT [address], register ; เขียนเป็นเอาต์พุต
```


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

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

## อ้างอิง