# IPC Anatomy

การสื่อสารระหว่างโปรเซส (Interprocess communication - IPC) เป็นกลไกสำคัญในการติดต่อสื่อสารระหว่างโปรเซสให้สามารถแลกเปลี่ยนข้อมูลซึ่งกันและกัน ไม่ว่าจะอยู่ภายในคอมพิวเตอร์เดียวกันหรือโปรเซสที่อาจจะอยู่ต่างคอมพิวเตอร์แต่ถูกเชื่อมต่อผ่านระบบเครือข่ายเดียวกัน ตัวอย่างเช่น การเรียกคำสั่งผ่านเชลล์โดยผลลัพธ์จากโปรเซสแรกจะส่งไปเป็นอินพุทให้กับโปรเซสถัดไป ด้วยการใช้เครื่องหมาย "**`|`**" (Pipe)

```shell-session
$ ls -al | grep "source"
drwxr-xr-x 24 root root     4096 2013-09-25 04:51 linux-source-2.6.32
```

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

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2F3fxoW7Pc9Wu9BGUSXt3n%2FIPC%20Basic.png?alt=media&#x26;token=427691f8-07d7-40ac-908e-795779d40898" alt=""><figcaption><p><em>รูปแบบการสื่อสารกับระหว่างโปรเซส</em></p></figcaption></figure>

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FR7YSfPciCTVU4lolTv4r%2FIPC%20overview.png?alt=media&#x26;token=c06a50ff-e3c2-4d83-9f7f-3b4f4a469e3d" alt=""><figcaption><p>ประเภทการกลไกสื่อสาร IPC</p></figcaption></figure>

จากตารางข้างล่างแสดงวิธีการสื่อสารระหว่างโปรเซสในแบบต่างๆ และที่ถูกรองรับสำหรับแต่ละมาตราฐานในระบบปฏิบัติการ UNIX/LINUX&#x20;

{% hint style="info" %}
**ตารางแสดงวิธีการสื่อสารในแบบต่างๆของ IPC**
{% endhint %}

<table><thead><tr><th>ชนิดการสื่อสาร</th><th width="346.3333333333333">วัตถุประสงค์</th><th>รองรับระบบ</th></tr></thead><tbody><tr><td><a href="http://en.wikipedia.org/wiki/Signal_(computing)">Signal</a></td><td>เป็นการส่งสัญญาณของระบบในระดับล่างไปขัดจังหวะของโปรเซส เพื่อบอกให้โปรเซสทำตามวัตถุประสงค์ของสัญญาณนั้นๆ หรืออาจจะใช้เป็นการส่งสัญญาณระหว่างโปรเซสด้วยกัน</td><td>POSIX, System V, BSD</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Pipeline_(Unix)">Pipe</a></td><td>สตรีมข้อมูลระหว่างโพรเซสชนิดทางเดียว หรือ half duplex</td><td>POSIX, System V, BSD</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Named_pipe">Named pipe (FIFO)</a></td><td>ดำเนินการผ่านไฟล์บนระบบไฟล์แทนมาตรฐาน input และ    output</td><td>POSIX, System V, BSD</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Message_queue">Message queue</a></td><td>สตรีมข้อมูลที่ไม่ระบุคล้ายกับไปป์ แต่เก็บและเรียกข้อมูลจากใน แพ็กเกจ</td><td>POSIX, System V</td></tr><tr><td>Locks, Mutexes, and Condition Variables</td><td>เทคนิคทางโปรแกรมเพื่อป้องกันไม่ให้โปรเซสแย่งกันเข้าไปใช้ทรัพยากรของระบบพร้อมกัน</td><td>POSIX, IRIX</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Semaphore_(programming)">Semaphore</a></td><td>โครงสร้างมาตรฐานที่ประสาน thread หรือกระบวนการที่กระทำกับทรัพยากรที่ใช้ร่วมกัน</td><td>POSIX, IRIX, System V</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Shared_memory">Shared memory</a></td><td>เป็นวิธีการส่งข้อมูลไปไว้ในส่วนของหน่วยความจำที่แชร์ให้กับ    โปรเซสอื่นๆให้สามารถเข้าถึงข้อมูลนั้นได้</td><td>POSIX, IRIX, System V</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Memory-mapped_file">Memory-mapped file</a></td><td>แมพไฟล์ไปยัง RAM และสามารถแก้ไขได้โดยการเปลี่ยนที่อยู่หน่วยความจำโดยตรง</td><td>POSIX, IRIX, System V</td></tr><tr><td><a href="http://en.wikipedia.org/wiki/Network_socket">Socket</a></td><td>ส่งข้อมูลไปยังเครือข่ายเน็ทเวิร์คบนคอมพิวเตอร์เครื่องเดียวกันหรือไปยังคอมพิวเตอร์เครื่องอื่น</td><td>BSD</td></tr></tbody></table>

การรองรับแต่ละรูปของการสื่อสาร IPC ของแต่ละมาตราฐานสามารถสรุปได้ดังนี้

* <mark style="color:blue;">**มาตราฐาน POSIX**</mark> จะมี system calls ที่รองรับการจัดการสัญญาณ (signal), shared memory, semaphores, mutexes, condition variables, และ message queues&#x20;
* <mark style="color:blue;">**มาตราฐาน IRIX**</mark> จะมี library calls รองรับสำหรับ shared memory, semaphores, locks, และ barriers โดย IRIX จะมีขั้นตอนการทำงานที่มากกว่า POSIX แต่ในบางกรณีจะได้เปรียบกว่า POSIX ในกรณีที่ใช้หน่วยประมวลผลแบบ multiprocessors นอกจากนั้นยังมีฟังก์ชัน poll() ที่สามารถนำไปใช้กับ semaphores
* <mark style="color:blue;">**มาตราฐาน AT\&T**</mark> System V (system five) Release 4 จะมี system calls สำหรับการจัดการสัญญาณ (signal), shared memory, semaphores, message queues, และ file locking ซึ่งเป็นมาตราฐานที่เหมาะกับการนำไปใช้ในโปรแกรมที่จะถูกนำไปทำงานอยู่บนแต่ละแพลตฟอร์ม (porting software) แต่อย่างไรก็ตามอาจจะไม่ได้ประสิทธิภาพเต็มที่
* <mark style="color:blue;">**มาตราฐาน BSD UNIX**</mark> จะรองรับการจัดการสัญญาณ (signal), file locking, และ socket&#x20;

โดยตัว**มาตราฐาน POSIX** นั้นถือว่าเป็นตัวล่าสุด ซึ่งถ้าพิจารณาการเรียกใช้ system calls ในภาพรวมตัว POSIX จะเหมาะสมและได้ประสิทธิภาพดีที่สุด นอกจากนั้นถ้าจะใช้ฟังก์ชันในมาตราฐานของ System V ก็จะเหมาะกับหน่วยประมวลผล MIPS ที่ใช้รูปแบบการติดต่อระหว่างโปรแกรมภายในระบบปฏิบัติการแบบ ABI (Application Binary Interface) รวมทั้งการนำโปรแกรมไปทำงานบนแพลตฟอร์มอื่นๆที่ใช้มาตราฐาน System V เช่นเดียวกัน&#x20;
