# 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="/files/yAwX9rTvfswEOgAj6RY7" alt=""><figcaption><p><em>รูปแบบการสื่อสารกับระหว่างโปรเซส</em></p></figcaption></figure>

<figure><img src="/files/p60Pa2MoCCm9BcsDnaNt" 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;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aic-eec.com/computer-operation-systems/linux-os-dev.-engineer/ipc/ipc-anatomy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
