ส่งข้อความ

จากวิกิพีเดีย สารานุกรมเสรี
ข้ามไปที่การนำทาง ข้ามไปที่การค้นหา

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

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

ภาพรวม

การส่งข้อความเป็นเทคนิคในการเรียกใช้พฤติกรรม (เช่น การรันโปรแกรม) บนคอมพิวเตอร์ ตรงกันข้ามกับเทคนิคดั้งเดิมในการเรียกโปรแกรมด้วยชื่อ การส่งข้อความใช้โมเดลวัตถุเพื่อแยกความแตกต่างของฟังก์ชันทั่วไปออกจากการใช้งานเฉพาะ โปรแกรมที่เรียกใช้จะส่งข้อความและอาศัยอ็อบเจ็กต์เพื่อเลือกและรันโค้ดที่เหมาะสม เหตุผลสำหรับการใช้เลเยอร์กลางโดยพื้นฐานแล้วแบ่งออกเป็นสองประเภท: การห่อหุ้มและการกระจาย

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

ตัวอย่างแรกๆ ของวิธีการใช้สิ่งนี้คือในโดเมนของคอมพิวเตอร์กราฟิก มีความซับซ้อนหลายอย่างที่เกี่ยวข้องกับการจัดการวัตถุกราฟิก ตัวอย่างเช่น การใช้สูตรที่ถูกต้องในการคำนวณพื้นที่ของรูปร่างที่ล้อมรอบจะแตกต่างกันไปขึ้นอยู่กับว่ารูปร่างนั้นเป็นรูปสามเหลี่ยม สี่เหลี่ยมผืนผ้า วงรี หรือวงกลม ในการเขียนโปรแกรมคอมพิวเตอร์แบบเดิม คำสั่ง IF-THEN แบบยาวจะทดสอบว่ารูปร่างเป็นวัตถุประเภทใด และเรียกรหัสที่เหมาะสม วิธีที่เน้นวัตถุในการจัดการสิ่งนี้คือการกำหนดคลาสที่เรียกShapeด้วยคลาสย่อยเช่นRectangleและEllipse(ซึ่งจะมีคลาสย่อยSquareและCircle) จากนั้นเพียงส่งข้อความไปยังทุก ๆ เพื่อShapeขอให้คำนวณพื้นที่ แต่ละShapeจากนั้น object จะเรียกใช้เมธอดของคลาสย่อยด้วยสูตรที่เหมาะสมกับอ็อบเจกต์ประเภทนั้น [1]

การส่งข้อความแบบกระจายช่วยให้นักพัฒนามีเลเยอร์ของสถาปัตยกรรมที่ให้บริการทั่วไปเพื่อสร้างระบบที่ประกอบด้วยระบบย่อยที่ทำงานบนคอมพิวเตอร์ที่แตกต่างกันในสถานที่ต่างๆ และในเวลาที่ต่างกัน เมื่อวัตถุแบบกระจายกำลังส่งข้อความ ชั้นข้อความสามารถดูแลปัญหาต่างๆ เช่น:

  • การค้นหากระบวนการโดยใช้ระบบปฏิบัติการและภาษาโปรแกรมต่างๆ ในสถานที่ต่างๆ จากแหล่งที่มาของข้อความ
  • การบันทึกข้อความบนคิวถ้าอ็อบเจ็กต์ที่เหมาะสมในการจัดการข้อความไม่ได้รันอยู่ในขณะนี้ จากนั้นเรียกใช้ข้อความเมื่อวัตถุพร้อมใช้งาน นอกจากนี้ ให้จัดเก็บผลลัพธ์หากต้องการจนกว่าวัตถุที่ส่งจะพร้อมที่จะรับ
  • ควบคุมข้อกำหนดของธุรกรรมต่างๆ สำหรับธุรกรรมแบบกระจาย เช่นACID - การทดสอบข้อมูล [2]

การส่งข้อความแบบซิงโครนัสกับอะซิงโครนัสผ่าน

การส่งข้อความแบบซิงโครนัส

การส่งข้อความแบบซิงโครนัสเกิดขึ้นระหว่างอ็อบเจ็กต์ที่ทำงานพร้อมกัน มันถูกใช้โดยภาษาการเขียนโปรแกรมเชิงวัตถุเช่น Java และ Smalltalk

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

ลองนึกภาพสำนักงานธุรกิจที่พลุกพล่านซึ่งมีคอมพิวเตอร์เดสก์ท็อป 100 เครื่องที่ส่งอีเมลถึงกันโดยใช้ข้อความซิงโครนัสที่ส่งผ่านเท่านั้น พนักงานคนหนึ่งปิดคอมพิวเตอร์อาจทำให้คอมพิวเตอร์อีก 99 เครื่องค้างจนกว่าพนักงานจะเปิดคอมพิวเตอร์อีกครั้งเพื่อประมวลผลอีเมลฉบับเดียว

การส่งข้อความแบบอะซิงโครนัส

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

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

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

ลูกผสม

การสื่อสารแบบซิงโครนัสสามารถสร้างขึ้นบนการสื่อสารแบบอะซิงโครนัสได้โดยใช้เครื่องซิงโครนัตัวอย่างเช่น α-Synchronizer ทำงานโดยมั่นใจว่าผู้ส่งจะรอข้อความตอบรับจากผู้รับเสมอ ผู้ส่งจะส่งข้อความถัดไปหลังจากที่ได้รับการตอบรับแล้วเท่านั้น ในทางกลับกัน การสื่อสารแบบอะซิงโครนัสยังสามารถสร้างขึ้นจากการสื่อสารแบบซิงโครนัสได้อีกด้วย ตัวอย่างเช่นโดยทั่วไปmicrokernels สมัยใหม่จะให้การ ส่งข้อความแบบซิงโครนั ส ดั้งเดิม เท่านั้น ( ต้องการการอ้างอิง )และการส่งข้อความแบบอะซิงโครนัสสามารถนำไปใช้ด้านบนได้โดยใช้เธรดตัว ช่วย

วัตถุกระจาย

ระบบการส่งข้อความใช้อ็อบเจ็กต์แบบกระจายหรือแบบโลคัล ด้วยอ็อบเจ็กต์แบบกระจาย ผู้ส่งและผู้รับอาจอยู่ในคอมพิวเตอร์คนละเครื่อง ใช้ระบบปฏิบัติการต่างกัน ใช้ภาษาโปรแกรมต่างกัน ฯลฯ ในกรณีนี้ เลเยอร์บัสจะดูแลรายละเอียดเกี่ยวกับการแปลงข้อมูลจากระบบหนึ่งไปยังอีกระบบหนึ่ง การส่งและรับข้อมูลผ่าน เครือข่าย ฯลฯ โปรโตคอล Remote Procedure Call (RPC) ในUnixเป็นตัวอย่างเบื้องต้นของสิ่งนี้ โปรดทราบว่าการส่งข้อความประเภทนี้ไม่จำเป็นที่ผู้ส่งและผู้รับต้องใช้โปรแกรมเชิงวัตถุ ระบบภาษาขั้นตอนสามารถห่อหุ้มและถือเป็นวัตถุเม็ดเล็กขนาดใหญ่ที่สามารถส่งและรับข้อความได้ [4]

ตัวอย่างระบบที่รองรับอ็อบเจ็กต์แบบกระจาย ได้แก่Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinderและD-Bus ระบบอ็อบเจ็กต์แบบกระจายถูกเรียกว่าระบบ "ไม่แชร์อะไร" เนื่องจากข้อความที่ส่งผ่าน abstraction จะซ่อนการเปลี่ยนแปลงสถานะพื้นฐานที่อาจใช้ในการดำเนินการส่งข้อความ


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

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

เว็บเบราว์เซอร์และเว็บเซิร์ฟเวอร์เป็นตัวอย่างของกระบวนการที่สื่อสารโดยการส่งข้อความ URLเป็นตัวอย่างของการอ้างอิงทรัพยากรโดยไม่เปิดเผยกระบวนการภายใน

การ เรียก รูทีนย่อยหรือ การเรียก ใช้เมธอดจะไม่จบจนกว่าการคำนวณที่เรียกใช้จะสิ้นสุดลง ในทางตรงกันข้าม การส่งข้อความแบบอะซิงโครนัสอาจส่งผลให้การตอบกลับมาถึงเวลาที่มีนัยสำคัญหลังจากส่งข้อความคำขอแล้ว

โดยทั่วไป ตัวจัดการข้อความจะประมวลผลข้อความจากผู้ส่งมากกว่าหนึ่งราย ซึ่งหมายความว่าสถานะสามารถเปลี่ยนแปลงได้ด้วยเหตุผลที่ไม่เกี่ยวข้องกับพฤติกรรมของผู้ส่งหรือกระบวนการไคลเอนต์เดียว สิ่งนี้ตรงกันข้ามกับพฤติกรรมทั่วไปของอ็อบเจ็กต์ที่มีการเรียกใช้เมธอด: ส่วนหลังคาดว่าจะยังคงอยู่ในสถานะเดียวกันระหว่างการเรียกใช้เมธอด อีกนัยหนึ่ง ตัวจัดการข้อความทำงานคล้ายกับ อ็อบเจ ต์ระเหย

แบบจำลองทางคณิตศาสตร์

แบบจำลองทางคณิตศาสตร์ที่โดดเด่นของการส่งข้อความคือโมเดลนักแสดงและแคลคูลัสPi [5] [6]ในทางคณิตศาสตร์ ข้อความเป็นวิธีเดียวในการส่งการควบคุมไปยังวัตถุ ถ้าวัตถุตอบสนองต่อข้อความ ก็มีวิธีการสำหรับข้อความนั้น

Alan Kayแย้งว่าการส่งข้อความมีความสำคัญมากกว่าออบเจกต์ใน OOP และตัวออบเจกต์นั้นมักจะเน้นมากเกินไป โมเดล การ เขียนโปรแกรม อ็อบเจ็กต์แบบกระจายสดสร้างขึ้นจากการสังเกตนี้ มันใช้แนวคิดของการไหลของข้อมูลแบบกระจายเพื่อกำหนดลักษณะการทำงานของระบบกระจายที่ซับซ้อนในแง่ของรูปแบบข้อความ โดยใช้ข้อกำหนดระดับสูง ลักษณะการทำงาน [7]

ตัวอย่าง

ดูเพิ่มเติมที่

อ้างอิง

  1. โกลด์เบิร์ก, อเดล; เดวิด ร็อบสัน (1989) Smalltalk-80 ภาษา . แอดดิสัน เวสลีย์. น. 5–16. ISBN 0-201-13688-0.
  2. ^ ออร์ฟาลี, โรเบิร์ต (1996). คู่มือการเอาตัวรอดของไคลเอ็นต์/เซิร์ฟเวอร์ที่จำเป็น นิวยอร์ก: Wiley Computer Publishing. หน้า  1–22 . ISBN 0-471-15325-7.
  3. ^ ออร์ฟาลี, โรเบิร์ต (1996). คู่มือการเอาตัวรอดของไคลเอ็นต์/เซิร์ฟเวอร์ที่จำเป็น นิวยอร์ก: Wiley Computer Publishing. น.  95–133 . ISBN 0-471-15325-7.
  4. ^ ออร์ฟาลี, โรเบิร์ต (1996). คู่มือการเอาตัวรอดของไคลเอ็นต์/เซิร์ฟเวอร์ที่จำเป็น นิวยอร์ก: Wiley Computer Publishing. น.  375–397 . ISBN 0-471-15325-7.
  5. ^ มิลเนอร์, โรบิน (ม.ค. 1993) "องค์ประกอบของปฏิสัมพันธ์: การบรรยายรางวัลทัวริง" . การสื่อสาร ของACM 36 (1): 78–89. ดอย : 10.1145/151233.151240 .
  6. คาร์ล ฮิววิตต์; ปีเตอร์บิชอป; ริชาร์ด สไตเกอร์ (1973) "พิธีการของนักแสดงโมดูลาร์สากลสำหรับปัญญาประดิษฐ์" ไอเจซีไอ. {{cite journal}}:อ้างอิงวารสารต้องการ|journal=( ความช่วยเหลือ )
  7. ^ เคย์, อลัน. "ต้นแบบ vs คลาสคือ: Re: Sun's HotSpot " list.squeakfoundation.org . สืบค้นเมื่อ2 มกราคม 2557 .
  8. ^ "การใช้ข้อความที่ส่งผ่านเพื่อถ่ายโอนข้อมูลระหว่างเธรด - ภาษาการเขียนโปรแกรม Rust " doc.rust-lang.org .

อ่านเพิ่มเติม

ลิงค์ภายนอก