เว็บบล๊อกผลงาน (Web Blog) นักศึกษาระดับปริญญาโท คณะวิทยาศาสตร์และเทคโนโลยี สาขาวิทยาการคอมพิวเตอร์ มหาวิทยาลัยธรรมศาสตร์

วันพุธที่ 24 มีนาคม พ.ศ. 2553

Two-Phase Commit Protocol (Thread Model)

Project_Master-Slave แบบที่ใช้ Threads

ได้ทำโปรแกรม Master ในการรันใช้คำสั่ง
> tf-master -m -p -s

โดยที่สามารถกำหนดค่าต่างๆ ได้แก่
-m คือ โหมดในการรัน (โหมดโปรแกรม A หรือโหมดโปรแกรม B)
-p คือ หมายเลข port ที่จะให้ slave เข้ามา register
-s คือ จำนวน slave มากสุดที่จะให้เชื่อมต่อได้

สำหรับโปรแกรม Slave รันโดยใช้คำสั่ง
> tf-slave -i -p

โดยกำหนดค่าในการเชื่อมต่อไปหา Master ดังนี้
-i คือ IP ของเครื่อง master
-p คือ port ที่ใช้ register
สำหรับฟังก์ชั่นที่ทำเสร็จ (ในวันพรีเซนต์) ได้แก่

โปรแกรม A
- คำสั่ง list (พิมพ์ slave ทั้งหมด)
- คำสั่ง check-all-conn (เช็คว่า slave ยังอยู่ไหม)
- คำสั่ง close-conn (ตัดการเชื่อมต่อ)
- คำสั่ง delete-member (ลบออกจากกลุ่ม) 
- คำสั่ง run-code (2-phase, เช็คโค๊ดว่ารันได้ไหม, ถ้ารันได้ สั่งให้รันทุก slave, ถ้าไม่ได้ ให้ยกเลิกหมด) 
- คำสั่ง close-all-conn (ปิดการเชื่อมต่อ)
- คำสั่ง exit
โปรแกรม B ทั้ง 2 ข้อ

สำหรับฟังก์ชั่นที่ทำเสร็จ (เพิ่มหลังวันพรีเซนต์) ได้แก่
- คำสั่ง list-files
- แก้ bug ที่ check-all-conn ไม่ลบข้อมูล slave ที่หลุดจากการเชื่อมต่อไปแล้ว
- แก้ bug ที่เมื่อมีการ disconnect บาง slave แล้ว master ยังไม่สามารถรับ slave ตัวใหม่มาได้


สำหรับฟังก์ชั่นที่ไม่ได้ทำ คือ
- คำสั่ง put-file
- คำสั่ง get-file
- คำสั่ง stage-code


Program description





credit:
hotdog_x

วันอาทิตย์ที่ 21 มีนาคม พ.ศ. 2553

วิธีติดตั้งโปรแกรม Eclipse (ไว้สำหรับเขียน C/C++)

วิธีลง Eclipse บน Linux
Eclipse ที่ใช้เขียน C/C++ บน Linux ต้องการโปรแกรม 2 อย่างก่อน คือ


1) ตัวคอมไพเลอร์ C/C++ ได้แก่ gcc, g++, gdb, make ปกติใน linux เราลงไว้แล้ว
2) Java Runtime (JRE) เอาไว้รันโปรแกรม Eclipse



ติดตั้ง Java Runtime แบบ console
(ถ้าไม่อยากยุ่งยาก จะติดตั้งแบบ GUI ก็ได้)


1) เปิด console ใน linux
2) การติดตั้ง Java Runtime ต้องเป็น root ใช้คำสั่ง su หรือ sudo ก็ได้ในการเปลี่ยนสิทธิตัวเองเป็น root


  • su root แล้วใส่ password ของ root หลังจากนี้ตัวเองจะมีสิทธิเป็น root ตลอดไป
  • sudo xxx แล้วใส่ password ของตัวเอง (xxx คือคำสั่งที่จะให้ root รัน มีผลคำสั่งต่อคำสั่ง)
3) ดาวน์โหลดติดตั้ง Java Runtime (ต้องต่อเน็ตด้วย)


  • ใน Fedora ใช้คำสั่ง yum install java-1.6.0-openjdk
  • ใน Ubuntu ใช้คำสั่ง apt-get install openjdk-6-jre


ติดตั้ง Java Runtime แบบ GUI

1) ใน Fedora หรือ Ubuntu คล้ายๆ กัน ให้เปิดโปรแกรม Package Manager
หรือ Add/Remove Softwareหรือ Install Software อะไรทำนองนี้ (ต้องต่อเน็ตขณะเปิดโปรแกรมด้วย)

2) Search หา OpenJDK
3) คลิ๊กเลือก แล้วติดตั้ง


 เช็คว่า Java Runtime ทำงานได้ถูกต้องหรือเปล่า
1) เปิด console แล้วพิมพ์คำสั่ง java ถ้าเจอคำสั่งนี้แปลว่า Java Runtime
ทำงานได้ถูกต้องแล้ว สามารถลง Eclipse ต่อได้


 ติดตั้ง Eclipse

1) ดาวน์โหลด Eclipse ที่ http://www.eclipse.org/downloads/ เลือก Eclipse IDE for C/C++ Developers


Linux 32bit ดาวน์โหลดเสร็จแล้วเอาไปไว้ที่ไดเรกทอรี่ /usr/local
(เอาไฟล์ที่นี่ก็ได้ http://www.hotdog-x.com/eclipsecpp/eclipse-cpp-galileo-SR2-linux-gtk.tar.gz )


2) เปิด console แล้วเปลี่ยนตัวเองเป็น root (ใช้คำสั่ง su หรือ sudo)
3) ไปที่ไดเรกทอรี่ /usr/local ใช้คำสั่ง cd /usr/local
4) extract ไฟล์ Eclipse ที่ดาวน์โหลดมา ใช้คำสั่ง tar xvfz eclipse-cpp-galileo-SR2-linux-gtk.tar.gz


เสร็จแล้วโปรแกรม Eclipse จะติดตั้งอยู่ที่ /usr/local/eclipse

5) เรียกโปรแกรม Eclipse ได้ที่ /usr/local/eclipse/eclipse หรือจะสร้าง shortcut ไว้ที่ desktop ก็ได้




credit:
hotdog_x

วิธีใช้งานโปรแกรม Eclipse เบื้องต้น

credit:
hotdog_x

วิธีติดตั้ง Linux เป็น Virtual Machine โดยใช้โปรแกรม VirtualBox




credit:
hotdog_x

Project Video Demo

Project video demo: แบบที่ใช้ Process


Youtube: http://www.youtube.com/watch?v=uXUidcmiR5g
Download: twophase-20100320-2143.zip (11 MB)

credit:cs.bong.nine

Two-Phase Commit Protocol (Process Model)

Project_Master-Slave แบบที่ใช้ Process

การทำให้ Process สามารถติดต่อสื่อสารกันได้ มีอยู่หลายวิธีด้วยกัน เช่น Pipe, Shared Memory, Message Queue, etc สำหรับโปรแกรมที่เขียนขึ้นนี้ แบ่งออกเป็น 2 แบบ (ทำไว้ 2 วิธี) ในการทำให้ Process ติดต่อสื่อสารกันได้

ส่วนที่ทำเสร็จ

  • list (พิมพ์ slave ทั้งหมด)
  • list-files
  • delete-member (ตัดการเชื่อมต่อแล้วลบออกจากกลุ่ม)
  • run-code (2-phase, เช็คโค๊ดว่ารันได้ไหม, ถ้ารันได้ สั่งให้รันทุก slave, ถ้าไม่ได้ ให้ยกเลิกหมด)
  • put-file (master ส่งไฟล์ให้ slave)
  • get-file (master ขอไฟล์จาก slave)
  • list-files (สั่งให้ slave list ไฟล์)
  • stage-code

คำสั่งที่อาจจะไม่ได้ทำ คือ
  • close-conn
  • check-all-file


ขั้นแรก
ทำให้ Process ติดต่อสื่อสารกันได้ ระหว่าง Parent กับ Child Process (ของ Master)
โดยใช้ Message Queue มีการเรียกใช้งานอยู่หลักๆ 4 ฟังก์ชัน
  • msgget() เริ่ม
  • msgsnd() ส่ง
  • msgrcv() รับ
  • msgctl() ลบ ตอนจบการทำงาน
คำสั่งแบบ command line สำหรับตรวจสอบ


  • ipcs -q
คำสั่งสำหรับลบ

  • ipcrm -Q [หมายเลข key]
Message Queue

  • ปกติเราจะคุ้นเคยกับ เขียนโปรแกรมแบบ synchronous คือ ถามไปต้องตอบมา ขอไปต้องได้รับผล แต่ Message Queue ในที่นี้ เป็นลักษณะของการเขียน Message ลงไปใน Queue คนที่รับก็รอรับในส่วนของการติดต่อระหว่าง Master กับ Slave ใช้ Socket ธรรมดา

Program description



รูปที่1


1.โครงสร้าง Master กับ Slave ตามในรูปที่ 1 ใช้ Virtual Machine (VM) สำหรับการติดตั้ง VM โดยใช้ Xen สามารถเข้าไปศึกษาได้ที่ http://www.lsr.nectec.or.th/index.php/Howto_Install_and_Setup_Xen_Virtualization_on_CentOS_Linux


รูปที่ 2








2. การติดต่อสื่อสารกันระหว่าง Master กับ Slave อยู่ในรูปแบบ Socket โดยที่ Master จะทำการ Fork Process ขึ้นมาหลาย ๆ Child Process เพื่อให้รองรับหลาย ๆ Slave ได้ การติดต่อสื่อสารระหว่าง Parent กับ Child ใช้ Message Queue การติดต่อสื่อสารระหว่าง Master กับ User ผ่าน Command Prompt
รูปที่ 3

 3. การติดต่อสื่อสารระหว่าง User กับเครื่อง Master ผ่าน Prompt "twophase>"




รูปที่ 4


4. หลังจากที่ได้รับคำสั่งจาก User ตัว Parent ก็จะสั่งงานไปยัง Child ในรูปแบบ Message Queue มีโครงสร้างข้อความตามรูป (ทำนองเดียวกันเมื่อ Child ทำงานเสร็จแล้ว จะส่งผลให้ Parent ในรูปแบบ Message Queue เหมือนกัน)


รูปที่ 5




5. เราใช้ Key เป็นตัวแยกแยะว่า Message ไหน ใช้ติดต่อกับ Child ตัวไหน (โปรแกรมที่เขียนขึ้นมานี้ กำหนด Key ตาม Rank)




รูปที่ 6


6. เหมือนมีหลาย ๆ Message ถูกส่งไปยัง Child


จากแนวคิดการเขียนโปรแกรม
น่าจะช่วยเพิ่มความเข้าใจให้กับตัวโปรแกรมมากยิ่งขึ้นนะครับ  ^^

credit:
cs.bong.nine



วันศุกร์ที่ 19 มีนาคม พ.ศ. 2553

Message Queues

Message Queues

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

อย่างไรก็ตาม มาตรฐาน X/Open ก็ไม่ได้ระบุข้อจำกัดเหล่านี้ไว้อย่างชัดเจน เมื่อมีการใช้ขนาดของออบเจ็คข้างต้นมีความจุมากเกินไปอาจจะทำให้บางฟังก์ชั่นทำงานไม่ได้ สำหรับ ลีนุกซ์จะมีตัวแปร 2 อย่าง คือ MSGMAX(4096) และ MSGMNB(16384) ซึ่งหมายถึงความจุของแต่ละบล็อกข้อความ และ ความจุทั้งหมดของ queue ค่าเหล่านี้อาจะแตกต่างกันไปหรือ ในบางระบบอาจจะไม่ใช้ค่านี้เลยก็ได้

ฟังก์ชั่นที่ใช้งานใน Message Queues

Msgget

จะสร้าง message queue มีรูปแบบการใช้งานดังนี้

Int megget(key_t key, int msgflg);

key เป็นตัวแปร int เพื่อจำแนกออบเจ็ค IPC เช่นเดียวกับ IPC fadlities อื่นๆ เพื่อสร้าง message queue เฉพาะขึ้นมา นอกจากนี้ยังมีค่าเฉพาะ คือ IPC_PRIVATE ที่จะสร้าง เพื่อจะใช้งานในโปรเซสปัจจุบันเท่านั้น

msgflg จะเป็นบิตเพอร์มิสชั่น 9 บิตด้วยกัน นอกจากนี้ยังสามารถใช้งาน IPC_CREAT เพื่อสร้าง queue ใหม่ โดยจะต้อง or กับบิตเพอร์มิตชั่น 9 บิตข้างต้น อย่างไรก็ตามถ้ามี queue อยู่แล้วก็จะไม่ใช้ IPC_CREAT ฟังก์ชั่นจะส่งค่ากลับเป็น message identifier จำนวนเต็มบวก หรือ -1 ถ้าทำงานไม่สำเร็จ

Msgsnd

จะเพิ่มข้อมูลเข้าไปในโครงสร้างข้อมูล message queue มีรูปแบบการใช้งานดังนี้

Int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

โครงสร้างข้อมูลในบล็อก จะประกอบด้วยสองส่วน คือ ข้อความจะต้องเล็กกว่าความจุบล็อกและจะต้องมีตัวแปร long int เพื่ออ้างอิงถึงข้อความ ดังนั้นโครงสร้างข้อมูลของข้อความ ควรจะมีลักษณะดังนี้
struct my_q_st {
     long int mesg_ident;
     /* The data you wish to transfer */
}

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

msqid เป็น message identifier ที่ส่งกลับฟังก์ชั่น msgget

msg_ptr เป็นพอยเตอร์ชี้ไปยังข้อความทีจะส่งไป (ซึ่งจะต้องเริ่มต้นด้วยตัวแปร lomg int ข้างต้น) พารามิเตอร์ msg_sz เป็นขนาดของข้อความที่ชี้ไปโดยพอยเตอร์ msg_ptr

msgflg เป็นแฟลกกำหนดการทำงานถ้า message queue เต็ม หรือ มีจำนวน queues เกินกว่าที่กำหนด โดยถ้าแฟลกประกอบด้วย IPC_NOWAIT จะไม่มีการส่งข้อความเข้าไปยัง queue และส่งค่า กลับเป็น -1 ทันที แต่ถ้าแฟลกนี้เคลียร์ จะรอจนกว่า queue จะว่าง

Msgrcv

จะแอ็คเซสข้อมูลใน message queue มีรูปแบบการใช้งานดังนี้

int msgrcv (int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

msqid เป็น message queue identifier ค่าส่งกลับจากฟังก์ชั่น msgget

msg_ptr เป็นพอยเตอร์ชี้ไปยยังโครงสร้างข้อมูลที่จะเก็บข้อมูลจาก queue (จะต้องประกอบด้วย ตัวแปร long int ดังที่ได้อธิบายไปแล้วข้างต้น)

msg_sz เป็นขนาดข้อมูลที่ชี้โดยพอยเตอร์ msg_ptr

msgtype จะกำหนดข้อความที่ต้องการ โดยถ้าเป็น 0 จะแอ็คเซสข้อความตามลำดับที่ส่งเข้าไปใน queue ถ้าต้องการจะแอ็คเซสข้อความที่ต้องการ ให้กำหนดเป็นชนิด (หมายเลข) ของข้อความนั้น แต่ ถ้าน้อยกว่า 0 (-n) จะแอ็คเซสข้อความที่ตรงกัน หรือ น้อยกว่าค่า msgtype

msgflg จะควบคุมการทำงานเมื่อไม่มีข้อความอยู่ใน queue โดยถ้าแฟลกนี้เคลียร์ จะทำให้ฟังก์ชั่นรอ จนกระทั่งมีข้อความมาใน queue

Msgctl

ฟังก์ชั่นสุดท้าย คือ msgctl ทำหน้าที่คล้ายกับฟังก์ชั่นที่ควบคุม shared memory มีรูปแบบการใช้งานดังนี้ int msgctl (int msqid, int command, struct msqid_ds *buf);

Msqid เป็น message identifier ค่าส่งกลับจากฟังก์ชั่น msgget

command เป็นคำสั่งที่จะให้ฟังก์ชั่นทำงาน ดังต่อไปนี้

คำสั่งการตรวจสอบสถานะของ Message Queue

โดยใช้คำสั่ง ipcs –q และ ipcrm msg (หรือ ipcrm -q ) ดังตัวอย่างการใช้งานต่อไปนี้

ipcs –q คือการ list ข้อมูล

ipcrm –q คือการลบข้อมูล

$ ipcs -q

________________Message Queues___________________

msqid owner perms used-bytes messages

384 benn 666 2048 2

หมายถึงมีข้อความ 2 ข้อความอยู่ใน queue มีความจุรวม 2048 ไบต์

ส่วนคำสั่ง ipcrm msg จะลบ queue ออกจากระบบ

การออกแบบโครงสร้างของ Master-Slave

*** รูปที่ 1 การออกแบบโครงสร้าง master-slave ***




  • master กำหนดให้เป็นเครื่อง server ที่รับ connection มาจาก slave ซึ่งเป็นเครื่อง client
  • master กับ slave ติดต่อผ่าน network ใช้ tcp protocol
  • master เป็น process หลัก 1 process
  • master มี register thread ไว้รอรับ connection จาก slave ได้ตลอดเวลา
  • ถ้าในโปรแกรมยาก B, register threads เปิด port 5555 (ชื่อ port 5555 ครับ อิอิ) ไว้รอรับ slave ตลอดเวลา, master สามารถไปทำคำสั่งอื่นได้
  • ถ้าในโปรแกรมง่าย A, register threads จะเปิดเฉพาะตอนเริ่มโปรแกรม หลังจากครบ 4 ก็จะบล๊อก
  • เมื่อมี slave เข้ามาขอ register, register threads จะสร้าง threads ย่อยเพื่อใช้สื่อสารกับ slave คนนั้นเช่น thread สื่อสาร 1 เอาไว้ติดต่อกับ slave 1, thread สื่อสาร 2 เอาไว้ติดต่อกับ slave 2
  • ภายในโปรแกรม master เวลาที่ master จะสั่งงาน thread สื่อสารย่อย ต่างๆ จะใช้วิธีเรียก function โดยตรง เพราะ process และ threads ถือว่าอยู่ในโปรแกรมเดียวกันสามารถเรียก function ตรงๆ ได้เลย
สังเกตุ โปรแกรม รูปแบบ (วิธี) ที่ 1 ใช้ message queue ในการติดต่อสื่อสารระหว่าง process แตกต่าจากโปรแกรม รูปแบบ (วิธี) ที่ 2 ที่ใช้



*** รูปที่ 2 การออกแบบ master อธิบายด้านโปรแกรมมิ่ง ***


  • master เป็น process หลัก ประกอบไปด้วย main, master, register threads และ slave threads
  • main function ทำหน้าที่สร้าง master, master จะถูกสร้างขึ้น จนถึงขั้นตอน listen() และ accept() จะมีการแยก threads ไปทำต่างหาก เพื่อให้โปรแกรมสามารถ listen() ได้ตลอดเวลา
  • ถ้ามี slave เขามา register ที่ listen() ไว้ ก็จะมีการสร้าง threads สื่อสารสำหรับ slave นั้น
  • ที่ main function ถ้า user สั่งงาน มันจะไปสั่งงานต่อที่ master ซึ่งก็มีฟังก์ชั่นต่างๆ ตามที่โจทย์กำหนด list(), runcode(), ... แล้ว master ก็จะไปสั่งงานต่อที่ slave threads ทุกๆ ตัว
  • จากนั้น slave thread ก็จะส่งคำสั่งผ่าน tcp network ไปหา slave แล้ว slave ก็จะตอบผลกลับมา

ยังเหลือการออกแบบ slave.... to be continue ครับ

Interprocess Communication in UNIX

.....





--------{

code หนี .. ไปวิ่งเล่น

---------}


..

...



credit:
รองศาสตราจารย์ ดร.พีระพนธ์ โสพัศสถิตย์

การจัดการเกี่ยวกับกระบวนการ (Process Management)



......



....




 credit:
รองศาสตราจารย์ ดร.พีระพนธ์ โสพัศสถิตย์

คลังบทความของบล็อก

favourites