⚠️ Note: Project นี้พัฒนาเป็นส่วนหนึ่งของวิชา Operating System (OS) ร่วมกับทีม โดยได้นำมา Re-host เพื่อใช้สำหรับแสดงผลงาน
โปรเจคนี้เน้นการออกแบบสถาปัตยกรรมแบบ Multi-threading, การจัดการ Synchronization และการสื่อสารผ่าน Socket Programming ใช้งานผ่าน Command-Line Interface (CLI) เพื่อจำลองระบบแชทในระดับ OS
พัฒนาระบบ Chatroom Server ที่รองรับผู้ใช้งานจำนวนมากพร้อมกัน (Concurrent Users) โดยเน้นการแก้ปัญหาที่เกิดขึ้นในระดับ OS เช่น Race Conditions, Deadlocks และการบริหารจัดการทรัพยากร (Resource Management) ให้มีประสิทธิภาพสูงสุดผ่านคิว (Queues) และ Thread Pools
ระบบนี้ประกอบด้วย:
- Server – รับคำสั่งและจัดการ session ผู้ใช้
- Client – โปรแกรมที่ผู้ใช้โต้ตอบคำสั่งแชทผ่าน terminal
โปรแกรมนี้จำลองการทำงานแบบพื้นฐานของโปรโตคอล chat ที่รองรับ:
- การเข้าร่วมห้อง
- ส่งข้อความ
- ส่งข้อความส่วนตัว
- แสดงรายชื่อสมาชิก
- ระบบออกจากระบบ
การสื่อสารทั้งหมดทำงานผ่าน Java Socket และ threading เพื่อรองรับผู้ใช้หลายคนพร้อมกัน
ระบบถูกออกแบบให้ทำงานแบบ Asynchronous โดยแบ่งการทำงานของ Thread ออกเป็นส่วนๆ เพื่อไม่ให้เกิดการบล็อก (Non-blocking)
- ClientHandler: รับหน้าที่จัดการการเชื่อมต่อของ Client แต่ละคน
- Router Pool: ตัวกลางคอยดึงงานจาก
Control Queueไปแจกจ่ายให้ Thread อื่นๆ ทำงานต่อ - Broadcaster Pool (Worker Threads): กลุ่ม Thread ที่รับหน้าที่กระจายข้อความ (Broadcast) ไปยังสมาชิกทุกคนในห้องแชท
- Queue Management:
ControlQueue(Size: 5000) – สำหรับจัดการคำสั่งจาก ClientReplyQueue(Size: 1000) – สำหรับส่งข้อความกลับไปยัง Client
- RoomRegistry & ClientRegistry: ใช้
ReentrantReadWriteLockเพื่อจัดการการเข้าถึงข้อมูลห้องแชท (อนุญาตให้หลาย Thread อ่านข้อมูลได้พร้อมกัน แต่บล็อกเมื่อมีการเขียน) ป้องกันปัญหา Data Inconsistency - Thread-Safe Data Structures: ใช้
ConcurrentHashMapและCopyOnWriteArrayListเพื่อจัดการข้อมูล Client ที่เชื่อมต่ออยู่
- Ping Mechanism: มีระบบ
HeartbeatQueueและHeartbeatMapที่ให้ Client ส่ง Ping มาทุกๆ 10 วินาที - Dead Client Removal: Server จะตรวจสอบทุก 5 วินาที หากพบว่า Client ใดไม่ส่ง Ping เกิน 30 วินาที จะตัดการเชื่อมต่อและนำออกจากระบบอัตโนมัติ (แก้ปัญหา Client ปิดโปรแกรมโดยไม่ใช้คำสั่ง Quit)
- มีการรับมือกับกรณี Queue เต็ม (Rate Limiting):
- หาก
ReplyQueueเต็ม: ทิ้งข้อความและแจ้งเตือน "Reply queue full. Please try again later." - หาก
ControlQueueเต็ม: แจ้งเตือน "Server busy. Your command was dropped."
- หาก
เพื่อหาจุดสมดุล (Sweet Spot) ของทรัพยากร ได้มีการทดสอบยิง Request (2000 Messages/Client) เพื่อวัดประสิทธิภาพของ Server ตามจำนวน Threads:
| Threads | Total Time (s) | Avg Latency (ms/msg) | Throughput (msg/s) |
|---|---|---|---|
| 1 | 0.439 | 0.157 | 9,178.0 |
| 4 | 0.124 | 0.337 | 11,870.1 |
| 12 | 0.119 | 0.323 | 12,391.9 |
| 24 | 0.120 | 0.327 | 12,248.8 |
🏆 Conclusion: จากการทดสอบพบว่า 12 Threads คือจุดที่เหมาะสมที่สุด (Optimal) ให้ผลลัพธ์ Throughput สูงสุดที่
12,391.9 msg/sและ Latency ต่ำสุด โดยการเพิ่ม Thread มากกว่า 16 ไม่ได้ช่วยให้ประสิทธิภาพดีขึ้นอย่างมีนัยสำคัญ แต่กลับกินทรัพยากร CPU เพิ่มขึ้นจาก Context Switching
(ทดสอบบน: Intel Core i3-10100, RAM 16GB)
- Language: Java
- Network: Java Sockets (TCP/IP)
- Concurrency:
java.util.concurrent(ThreadPool, BlockingQueue, ReentrantReadWriteLock)
- Run Server: สั่ง Run ไฟล์
server_os.javaเพื่อเปิดใช้งานฝั่งของ Server
javac server_os.java- Client Side: สั่ง Run ไฟล์
ChatClient.javaเพื่อเริ่มต้นใช้งานในฝั่ง Client
javac ChatClient.java
⚠️ Note: หากไม่เปิดใช้งาน Server ก่อน จะไม่สามารถใช้โปรแกรมได้ ระบบจะทำการ Retry ทั้งหมด 5 ครั้ง ก่อนที่จะ Terminate การทำงานไป
- Login: เมื่อเชื่อมต่อสำเร็จ ขั้นแรกให้กรอก Name (ห้ามมีเว้นวรรค) จากนั้นกด
Enter
เมื่อเข้าสู่ระบบ โปรแกรมจะแสดงรายการคำสั่งและรูปแบบการใช้งานดังนี้:
| คำสั่ง (Command) | รูปแบบ (Format) | รายละเอียด (Description) |
|---|---|---|
| DM | DM <receiver_name> <message> |
ส่งข้อความส่วนตัวหาเพื่อน (Direct Message) |
| JOIN | JOIN <#room_name> |
เข้าร่วมห้องแชท (ต้องมี # นำหน้าชื่อห้อง) |
| WHO | WHO <#room_name> |
ดูรายชื่อคนที่อยู่ในห้องนั้นๆ |
| SAY | SAY <#room_name> <message> |
ส่งข้อความหาทุกคนในห้องแชท |
| LEAVE | LEAVE <#room_name> |
ออกจากห้องแชท |
| QUIT | QUIT |
ออกจากโปรแกรม |
- Invalid Command: หากป้อนคำสั่งผิดหรือไม่มีในระบบ โปรแกรมจะแสดงข้อความแจ้งเตือน
- SAY Command: จำเป็นต้อง
JOINห้องที่ต้องการก่อน จึงจะสามารถส่งข้อความได้ - Auto Leave: หากใช้คำสั่ง
QUITโปรแกรมจะนำผู้ใช้ออกจากทุกห้องโดยอัตโนมัติ - Timeout: หากผู้ใช้ไม่ได้ออกจากโปรแกรมอย่างถูกต้อง (ไม่ได้ใช้
QUIT) เมื่อครบเวลาที่กำหนด ระบบจะทำการนำผู้ใช้ออกจากระบบให้อัตโนมัติ
เอกสารฉบับเต็มที่อธิบายรายละเอียดของระบบ ได้แก่:
- System Architecture
- Concurrency Design
- Synchronization Strategy
- Performance Testing & Analysis
- Design Decisions
🔗 ดูสไลด์ฉบับเต็มได้ที่: OS Project – Technical Presentation
โปรเจคนี้เป็นหนึ่งในผลงานชิ้นแรกๆของผม ที่ได้มีการใช้งาน Github ทำงานร่วมกับเพื่อนในทีม การเขียน Commit message และการจัดการโค้ดในโปรเจคอาจจะยังไม่เป็นมาตรฐาน แต่ถือเป็นจุดเริ่มต้นที่ทำให้ผมพัฒนาการใช้ Git และการจัดการ Version Control อย่างจริงจังมากขึ้น




