Process หรือ Task

ในการทำงานของเครื่องคอมจะมีการเก็บ ข้อมูลของ process ต่างๆ เช่่น register, mem, file ไว้ใน Process Table โดยการทำงานของ process เหล่านี้ไม่จำเป็นต้องรู้ว่าเครื่องมี CPU กี่ตัว mem เท่าไหร่ เพราะจะมีตัวจัดการอยู่ข้างหลัง แต่การที่ CPU จะ switch ไปมาระหว่าง process ได้นั้น CPU จะต้องใช้เวลามาก เพราะต้องแก้ไขค่าต่างๆใน table และแก้ MMU ที่เกี่ยวข้อง หรือในบางครั้งอาจจะต้องมีการ swap process มาจาก disk

Thread

คือส่วนของกิจกรรมการ execute ของ cpu เท่ากับ 1 ชุดการทำงาน ทำให้เกิด concurrency

ใน process ประกอบไปด้วย Thread หลายๆตัว เฉพาะ OS ที่รองรับการทำงาน Multi-Thread โดยแต่ละ thread จะมี thread context ประกอบไปด้วย cpu context ที่เก็บค่าการทำงานของ thread ไว้แต่จะน้อยกว่า process table และข้อมูลสำหรับการจัดการ thread การ สลับการทำงานของ thread ที่อยู่ใน process เดียวกันจะทำงานได้เร็วกว่าการทำงานข้าม process เพราะต้องมีการสลับ process ด้วย และสามารถแชร์ resource ได้ง่าย เพราะ OS ไม่ยอมให้มีการ share resource ระหว่าง processes แต่การทำงานของ thread จะไม่มีการป้องกัน memory ส่วนใดๆไว้ ทำให้หน้าที่ตรงนี้ตกมาอยู่ที่ programmer ในการ lock resource ที่จำเป็น

Multi thread in DS

  • Multi threaded Client

ใน asynchronous rpc : process จะสร้าง thread สำหรับแต่ละ request แล้วให้ thread รอรับ reply กลับมาด้วย ทำให้ process สามารถทำงานอย่างอื่นต่อไปได้โดยไม่ต้องรอ reply เช่น การทำงานของ web browser ในการดึงข้อมูลจาก HTML

Dispatcher Thread เป็น main thread โดยจะรอ รับ request แล้วจะทำการสร้าง worker thread สำหรับแต่ละ request
Server

  • Iterative Server เป็นตัวรับ ประมวลผล ส่งผลลัพธ์ req ในตัวมันเอง
  • Concurrent Server รับการประมวลผลโดยแตกเป็น thread หรือ process สำหรับแต่ละ req

process ใน server จะต้องไปเชื่อมต่อกับ port เพื่อให้ client ส่ง req ไปยัง port ได้
superserver คือ server ตัวกลางที่ทำหน้าที่รับ req แล้วแตก process สำหรับแต่ละ req มีลักษณะคล้ายกับ dispatcher ในระดับ process เช่น inetd ที่จะคอยรับ request จาก port แล้วส่งข้อมูลไปให้โปรแกรมอื่นๆ

  • stateless server ไม่ได้เก็บสถานะการทำงานของ client เอาไว้ที่ server เช่นถ้าต้องการ download ต่อ ต้องไปบอก server ชื่อไฟล์ จำนวนไบท์ ตำแหน่ง
  • stateful server เก็บสถานะการทำงานของ client เอาไว้ที่ server ทำให้ครั้งต่อไปที่ client เรียก server client สามารถส่ง pointer ไปอ้างอิง ข้อมูลที่สามารถทำงานต่อไปได้เลย เช่น fileserver ที่เราสามารถ continued การ download โดยการอ้างอิงถึงตำแหน่งของไฟล์

แต่ statefull server ก็ไม่ได้ดีกว่า stateless เนื่องจากหาก มี server fail หรือถ้ามี file server หลายๆตัว แล้ว sv1 fail req ที่ไปยัง sv2 ก็ต้องไปทำการเริ่มต้นใหม่

Code Migration
คือ การเคลื่อนย้ายของโปรแกรมไปยังเครื่องอื่นๆ ที่ต้องทำเช่นนี้ก็เพราะว่า บางเครื่องอาจจะกำลังทำงานหนัก การย้านโปรแกรม(process) ไปยังเครื่องที่ว่าง ก็จะทำให้ประสิทธิภาพดีขึ้น หรือลองคิดในกรณีที่ว่า สมมติ client เรียก query data เป็นจำนวนมาก ไปยัง server เหตุใดจึงต้องโอนข้อมูลผ่าน network ทำไมไม่ส่งแค่ผลลัพธ์กลับมายัง client แทน

ลักษณะของ code migration อีกแบบก็คือ การที่ client ไปร้องขอโค้ดมาจาก server แล้วมา execute ที่ตัวมันเอง ทำให้ client ไม่จำเป็นต้องติดตั้งโปรแกรม สามารถใช้งานเมื่อไหร่ก็ได้ โดยจะเป็น version ล่าสุดเสมอ แต่ข้อเสียก็คือความปลอดภัยต่ำ

Model สำหรับ Code Migration

ในการทำงานแบบนี้ process จะประกอบไปด้วย

  1. Code segment – set of instructions
  2. Resource segment – resources needed by the process
  3. Execution segment – current state พวก stack counter etc

Weak mobility : ย้ายแต่ code การทำแบบนี้ตัว process จะ start ตั้งแต่เริ่มเช่นพวก applet
Strong mobility : ย้าย code + execution สามารถหยุด process แล้วย้ายไปทำงานเครื่องอื่นได้
ลักษณะการเคลื่อนย้าย
Sender-Inititated การเคลื่อนย้ายเกิดจากการร้องขอของผู้ส่ง เช่นการอัพโหลดโปรแกรมไปยัง server แล้วให้ server ทำงานแทน เหมือนกับตย การ search database
Receiver-Initiated ผู้รับร้องขอให้ส่ง code มาให้ เช่น java applet

การทำแบบ receiver ง่ายกว่า sender เพราะไม่ต้องหวงเรื่อง security มากนัก

เราแบ่งประเภทของทรัพยากร (resources) ออกเป็น

  1. Unattached สามารถย้ายไปมาได้ง่ายเช่นพวก file
  2. Fastened สามารถย้ายได้แต่ยากเช่นพวก database
  3. Fixed ย้ายไม่ได้ จำเพาะแต่ละเครื่อง

การแบ่งตามการเรียกใช้ทรัพยากร (Binding)
1. identifier ระบุตัวทรัพยากรลงไป เช่นขอ URL ของเว็บ
2. value เอาเฉพาะค่ามาทำงาน เช่นขอเรียกใช้ library ใน C หรือ JAVA ที่ตัว project เรารับรู้ว่ามันมีอยู่ (add มาแล้ว) แต่ว่าถ้าเราย้าย project ไปเครื่องอื่นแล้ว add lib ใหม่ lib ไม่จำเป็นต้องอยู่ที่ location เดิม
3. type เรียกใช้โดยชนิด โดยไม่ระบุอะไรเลยนอกจาก ขอเป็นชนิดเดียวกัน เช่นขอเป็น file printer

เมื่อเอามารวมกันก็จะได้ผลลัพธ์แบบตาราง ซับซ้อนเข้าไปอีก ทำให้ต้องใช้ action ที่แตกต่างสำหรับแต่ละชนิด