ไปป์ไลน์ (การประมวลผล)
ในด้านคอมพิวเตอร์ไปป์ไลน์หรือที่เรียกว่าไปป์ไลน์ข้อมูลคือชุดของ องค์ประกอบการประมวลผล ข้อมูลที่เชื่อมต่อกันเป็นอนุกรม โดยที่ผลลัพธ์ขององค์ประกอบหนึ่งจะเป็นอินพุตขององค์ประกอบถัดไป องค์ประกอบของไปป์ไลน์มักจะถูกประมวลผลแบบขนานหรือแบบแบ่งเวลา และมักจะมีการแทรกหน่วยความจำบัฟเฟอร์ไว้ระหว่างองค์ประกอบต่างๆ
แนวคิดและแรงจูงใจ
การวางผังกระบวนการผลิตเป็นแนวคิดที่ใช้กันทั่วไปในชีวิตประจำวัน ตัวอย่างเช่น ในสายการประกอบรถยนต์ของโรงงาน แต่ละงานเฉพาะ เช่น การติดตั้งเครื่องยนต์ การติดตั้งฝากระโปรง และการติดตั้งล้อ มักจะทำโดยสถานีงานแยกต่างหาก สถานีเหล่านี้ทำงานพร้อมกัน โดยแต่ละสถานีทำงานกับรถยนต์คนละคัน เมื่อรถยนต์คันหนึ่งทำงานเสร็จแล้ว ก็จะเคลื่อนไปยังสถานีถัดไป การเปลี่ยนแปลงของเวลาที่ใช้ในการทำงานแต่ละอย่างสามารถแก้ไขได้โดยการ "บัฟเฟอร์" (การจอดรถหนึ่งคันหรือมากกว่านั้นไว้ในพื้นที่ระหว่างสถานี) และ/หรือโดยการ "หยุดชั่วคราว" (การหยุดสถานีต้นทางชั่วคราว) จนกว่าสถานีถัดไปจะว่าง
สมมติว่าการประกอบรถยนต์หนึ่งคันต้องใช้สามขั้นตอน ซึ่งใช้เวลา 20, 10 และ 15 นาที ตามลำดับ ถ้าหากโรงงานใช้สถานีเดียวในการทำงานทั้งสามขั้นตอน จะผลิตรถยนต์ได้หนึ่งคันทุกๆ 45 นาที แต่หากใช้สายการผลิตที่มีสามสถานี โรงงานจะผลิตรถยนต์คันแรกได้ใน 45 นาที และคันใหม่ทุกๆ 20 นาที
ดังตัวอย่างนี้แสดงให้เห็น การประมวลผลแบบไปป์ไลน์ไม่ได้ลดความหน่วง (latency)ซึ่งก็คือเวลาทั้งหมดที่รายการหนึ่งจะผ่านระบบทั้งหมด อย่างไรก็ตาม มันช่วยเพิ่มปริมาณงานของระบบ(throughput ) ซึ่งก็คืออัตราการประมวลผลรายการใหม่หลังจากรายการแรกเสร็จสิ้น
ในการคำนวณ

ในด้านการคำนวณท่อส่งข้อมูลหรือท่อส่งข้อมูล[ 1 ]คือชุดของ องค์ประกอบการประมวลผล ข้อมูลที่เชื่อมต่อกันเป็นอนุกรม โดยที่เอาต์พุตขององค์ประกอบหนึ่งจะเป็นอินพุตขององค์ประกอบถัดไป องค์ประกอบของท่อส่งข้อมูลมักจะถูกประมวลผลแบบขนานหรือแบบแบ่งเวลา มักจะมีการแทรก พื้นที่จัดเก็บบัฟเฟอร์ จำนวนหนึ่ง ระหว่างองค์ประกอบต่างๆ
ท่อส่งข้อมูลที่เกี่ยวข้องกับคอมพิวเตอร์ ได้แก่:
- ไปป์ไลน์คำสั่งเช่นไปป์ไลน์ RISC แบบคลาสสิกซึ่งใช้ในหน่วยประมวลผลกลาง (CPU) และไมโครโปรเซสเซอร์ อื่นๆ เพื่อให้สามารถประมวลผลคำสั่งหลายคำสั่งพร้อมกันได้ในวงจร เดียวกัน โดยปกติวงจรจะถูกแบ่งออกเป็นหลายขั้นตอน และแต่ละขั้นตอนจะประมวลผลส่วนเฉพาะของคำสั่งหนึ่งคำสั่งในแต่ละครั้ง โดยส่งผลลัพธ์บางส่วนไปยังขั้นตอนถัดไป ตัวอย่างของขั้นตอน ได้แก่ การถอดรหัสคำสั่ง การคำนวณทางคณิตศาสตร์/ตรรกะ และการดึงข้อมูลจากรีจิสเตอร์ เทคโนโลยีเหล่านี้เกี่ยวข้องกับการประมวลผลแบบซูเปอร์สเกลาร์การส่งต่อตัวถูกดำเนินการ การประมวลผลแบบคาดการณ์ ล่วงหน้า และ การประมวลผล แบบไม่เรียงลำดับ
- ไปป์ไลน์กราฟิกส์พบได้ในหน่วยประมวลผลกราฟิก (GPU) ส่วนใหญ่ ซึ่งประกอบด้วยหน่วยคำนวณทางคณิตศาสตร์ หลายหน่วย หรือCPU ที่สมบูรณ์ ซึ่งทำหน้าที่ในการดำเนินการต่างๆ ของการเรนเดอร์ภาพทั่วไป ( เช่น การฉายภาพแบบเปอร์สเปคทีฟการตัดขอบภาพการ คำนวณ สีและแสงการเรนเดอร์ภาพ เป็นต้น)
- ไปป์ไลน์ซอฟต์แวร์คือลำดับของกระบวนการ ประมวลผล (คำสั่ง การเรียกใช้โปรแกรม งาน เธรด ขั้นตอนการทำงาน ฯลฯ) ที่ทำงานแบบขนานกัน โดยกระแสเอาต์พุตของกระบวนการหนึ่งจะถูกส่งต่อไปยังกระแสอินพุตของกระบวนการถัดไปโดยอัตโนมัติ ไปป์ไลน์การเรียกใช้ระบบของUnixเป็นตัวอย่างคลาสสิกของแนวคิดนี้
- HTTP pipeliningคือเทคนิคการส่ง คำขอ HTTP หลายรายการผ่าน การเชื่อมต่อ TCPเดียวกันโดยไม่ต้องรอให้คำขอรายการก่อนหน้าเสร็จสิ้นก่อนจึงจะส่งคำขอรายการใหม่ได้
หากไปป์ไลน์ประกอบด้วย ขั้นตอน ที่สามารถทำซ้ำได้โดยไม่เปลี่ยนแปลงผลลัพธ์ไปจากครั้งแรก ซึ่งเป็นข้อดีในแง่ของความน่าเชื่อถือและการบำรุงรักษา
ข้อควรพิจารณาในการออกแบบ
การปรับสมดุลขั้นตอนต่างๆ
เนื่องจากอัตราการผลิตโดยรวมของกระบวนการผลิตไม่สามารถดีไปกว่าอัตราการผลิตของส่วนประกอบที่ช้าที่สุดได้ นักออกแบบจึงควรพยายามแบ่งงานและทรัพยากรระหว่างขั้นตอนต่างๆ เพื่อให้ทุกขั้นตอนใช้เวลาในการทำงานให้เสร็จสิ้นเท่ากัน ในตัวอย่างการประกอบรถยนต์ข้างต้น หากงานทั้งสามใช้เวลา 15 นาทีต่อชิ้น แทนที่จะเป็น 20, 10 และ 15 นาที ความล่าช้าก็จะยังคงเป็น 45 นาที แต่รถยนต์ใหม่หนึ่งคันจะเสร็จสมบูรณ์ทุกๆ 15 นาที แทนที่จะเป็น 20 นาที
การบัฟเฟอร์
ภายใต้สถานการณ์ที่เหมาะสม หากองค์ประกอบการประมวลผลทั้งหมดซิงโครไนซ์กันและใช้เวลาในการประมวลผลเท่ากัน แต่ละรายการจะสามารถรับได้โดยแต่ละองค์ประกอบทันทีที่ปล่อยออกมาจากองค์ประกอบก่อนหน้า ในรอบการทำงานของนาฬิกา เพียงรอบเดียว ด้วยวิธีนี้ รายการต่างๆ จะไหลผ่านไปป์ไลน์ด้วยความเร็วคงที่ เหมือนคลื่นในช่องน้ำ ใน "ไปป์ไลน์แบบคลื่น" ดังกล่าว[ 2 ]ไม่จำเป็นต้องมีการซิงโครไนซ์หรือบัฟเฟอร์ระหว่างขั้นตอนต่างๆ นอกเหนือจากพื้นที่จัดเก็บที่จำเป็นสำหรับรายการข้อมูล
โดยทั่วไปแล้ว การบัฟเฟอร์ระหว่างขั้นตอนต่างๆ ในไปป์ไลน์นั้นจำเป็นเมื่อเวลาในการประมวลผลไม่สม่ำเสมอ หรือเมื่ออาจมีการสร้างหรือทำลายรายการต่างๆ ในระหว่างไปป์ไลน์ ตัวอย่างเช่น ในไปป์ไลน์กราฟิกที่ประมวลผลรูปสามเหลี่ยมที่จะแสดงผลบนหน้าจอ องค์ประกอบที่ตรวจสอบการมองเห็นของแต่ละรูปสามเหลี่ยมอาจทิ้งรูปสามเหลี่ยมนั้นไปหากมองไม่เห็น หรืออาจส่งออกชิ้นส่วนรูปสามเหลี่ยมสองชิ้นขึ้นไปขององค์ประกอบนั้นหากถูกซ่อนไว้บางส่วน การบัฟเฟอร์ยังจำเป็นเพื่อรองรับความไม่สม่ำเสมอในอัตราที่แอปพลิเคชันป้อนรายการไปยังขั้นตอนแรกและใช้ผลลัพธ์จากขั้นตอนสุดท้ายด้วย
บัฟเฟอร์ระหว่างสองขั้นตอนอาจเป็นเพียงรีจิสเตอร์ฮาร์ดแวร์ที่มีตรรกะการซิงโครไนซ์และการส่งสัญญาณที่เหมาะสมระหว่างสองขั้นตอน เมื่อขั้นตอน A บันทึกรายการข้อมูลลงในรีจิสเตอร์แล้ว จะส่งสัญญาณ "มีข้อมูลพร้อมใช้งาน" ไปยังขั้นตอน B เมื่อขั้นตอน B ใช้ข้อมูลนั้นแล้ว จะตอบกลับด้วยสัญญาณ "ได้รับข้อมูลแล้ว" ไปยังขั้นตอน A ขั้นตอน A จะหยุดรอสัญญาณนี้ก่อนที่จะบันทึกรายการข้อมูลถัดไปลงในรีจิสเตอร์ ขั้นตอน B จะหยุดรอสัญญาณ "มีข้อมูลพร้อมใช้งาน" หากพร้อมที่จะประมวลผลรายการถัดไป แต่ขั้นตอน A ยังไม่ได้ให้ข้อมูลนั้นมา
หากเวลาในการประมวลผลขององค์ประกอบใด ๆ มีความแปรปรวน กระบวนการทั้งหมดอาจต้องหยุดชะงักบ่อยครั้ง เพื่อรอให้องค์ประกอบนั้นและองค์ประกอบก่อนหน้าทั้งหมดประมวลผลรายการในบัฟเฟอร์อินพุตเสร็จสิ้น ความถี่ของการหยุดชะงักของกระบวนการ นี้ สามารถลดลงได้โดยการจัดพื้นที่สำหรับรายการมากกว่าหนึ่งรายการในบัฟเฟอร์อินพุตของขั้นตอนนั้น บัฟเฟอร์หลายรายการดังกล่าวโดยทั่วไปจะถูกนำไปใช้ในรูปแบบคิวแบบเข้าก่อนออกก่อน (FIFO ) ขั้นตอนต้นน้ำอาจยังคงต้องหยุดทำงานเมื่อคิวเต็ม แต่ความถี่ของเหตุการณ์เหล่านั้นจะลดลงเมื่อมีช่องบัฟเฟอร์มากขึ้นทฤษฎีคิวสามารถบอกจำนวนช่องบัฟเฟอร์ที่ต้องการได้ ขึ้นอยู่กับความแปรปรวนของเวลาในการประมวลผลและประสิทธิภาพที่ต้องการ
ท่อส่งแบบไม่เชิงเส้น
หากขั้นตอนใดใช้เวลานานกว่าขั้นตอนอื่น ๆ มาก (หรืออาจใช้เวลานานกว่า) และไม่สามารถเร่งความเร็วได้ นักออกแบบสามารถจัดเตรียมองค์ประกอบการประมวลผลสองตัวขึ้นไปเพื่อดำเนินการงานนั้นพร้อมกัน โดยใช้บัฟเฟอร์อินพุตเดียวและบัฟเฟอร์เอาต์พุตเดียว เมื่อแต่ละองค์ประกอบประมวลผลรายการข้อมูลปัจจุบันเสร็จแล้ว ก็จะส่งข้อมูลนั้นไปยังบัฟเฟอร์เอาต์พุตส่วนกลาง และรับรายการข้อมูลถัดไปจากบัฟเฟอร์อินพุตส่วนกลาง แนวคิดของไปป์ไลน์แบบ "ไม่เป็นเชิงเส้น" หรือ "ไดนามิก" นี้ ตัวอย่างเช่น ร้านค้าหรือธนาคารที่มีพนักงานเก็บเงินสองคนขึ้นไปให้บริการลูกค้าจากคิวรอเดียวกัน
ความสัมพันธ์ระหว่างรายการต่างๆ
ในบางแอปพลิเคชัน การประมวลผลรายการ Y โดยขั้นตอน A อาจขึ้นอยู่กับผลลัพธ์หรือผลกระทบของการประมวลผลรายการ X ก่อนหน้าโดยขั้นตอน B ที่อยู่ถัดไปในกระบวนการทำงาน ในกรณีเช่นนั้น ขั้นตอน A จะไม่สามารถประมวลผลรายการ Y ได้อย่างถูกต้องจนกว่ารายการ X จะผ่านขั้นตอน B ไปแล้ว
สถานการณ์นี้เกิดขึ้นบ่อยมากในไปป์ไลน์คำสั่ง ตัวอย่างเช่น สมมติว่า Y เป็นคำสั่งทางคณิตศาสตร์ที่อ่านค่าจากรีจิสเตอร์ที่ควรจะถูกแก้ไขโดยคำสั่ง X ก่อนหน้านี้ ให้ A เป็นขั้นตอนที่ดึงตัวถูกดำเนินการของ คำสั่ง และ B เป็นขั้นตอนที่เขียนผลลัพธ์ลงในรีจิสเตอร์ที่ระบุ หากขั้นตอน A พยายามประมวลผลคำสั่ง Y ก่อนที่คำสั่ง X จะไปถึงขั้นตอน B รีจิสเตอร์อาจยังมีค่าเก่าอยู่ และผลลัพธ์ของ Y ก็จะไม่ถูกต้อง
เพื่อจัดการกับความขัดแย้งดังกล่าวอย่างถูกต้อง ระบบท่อส่งข้อมูลจะต้องมีวงจรหรือตรรกะเพิ่มเติมที่สามารถตรวจจับความขัดแย้งและดำเนินการที่เหมาะสมได้ กลยุทธ์ในการดำเนินการดังกล่าว ได้แก่:
- การหยุดชะงัก:ทุกขั้นตอนที่ได้รับผลกระทบ เช่น ขั้นตอน A จะหยุดชั่วคราว จนกว่าจะแก้ไขปัญหาที่เกี่ยวข้องได้ นั่นคือ จนกว่าจะมีข้อมูลที่จำเป็นและ/หรือบรรลุสถานะที่ต้องการแล้ว
- การจัดเรียงลำดับรายการใหม่:แทนที่จะหยุดชะงัก ขั้นตอน A อาจวางรายการ Y ไว้ข้างๆ แล้วมองหารายการ Z ที่ตามมาในกระแสข้อมูลขาเข้าซึ่งไม่มีการพึ่งพาใดๆ กับรายการก่อนหน้า ในไปป์ไลน์คำสั่ง เทคนิคนี้เรียกว่าการประมวลผลแบบไม่เรียงลำดับ (out-of-order execution )
- การคาดเดาและการย้อนกลับ:ตัวอย่างสำคัญอย่างหนึ่งของการพึ่งพาซึ่งกันและกันระหว่างรายการคือการจัดการ คำสั่ง การกระโดดแบบมีเงื่อนไข X โดยไปป์ไลน์คำสั่ง ขั้นตอนแรก A ของไปป์ไลน์ ซึ่งดึงคำสั่ง Y ถัดไปที่จะถูกประมวลผล ไม่สามารถทำงานได้จนกว่า X จะดึงตัวถูกดำเนินการและกำหนดได้ว่าควรกระโดดหรือไม่ ซึ่งอาจใช้เวลาหลายรอบสัญญาณนาฬิกา เนื่องจากตัวถูกดำเนินการของ X อาจขึ้นอยู่กับคำสั่งก่อนหน้าซึ่งดึงข้อมูลจากหน่วยความจำหลัก
- แทนที่จะหยุดรอให้คำสั่ง X เสร็จสิ้น ขั้นตอน A อาจคาดเดาว่าการกระโดดไปยังคำสั่งถัดไปจะเกิดขึ้นหรือไม่ และดึงคำสั่ง Y ถัดไปโดยอิงจากการคาดเดานั้น หากการคาดเดานั้นผิดพลาดในภายหลัง (ซึ่งหวังว่าจะเกิดขึ้นได้ยาก) ระบบจะต้องย้อนกลับและดำเนินการต่อด้วยตัวเลือกที่ถูกต้อง กล่าวคือ การเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับสถานะของเครื่องโดยขั้นตอน A และขั้นตอนต่อๆ ไปโดยอิงจากการคาดเดานั้นจะต้องถูกยกเลิก คำสั่งที่อยู่ถัดจาก X ในไปป์ไลน์จะต้องถูกล้างออก และขั้นตอน A จะต้องเริ่มต้นใหม่ด้วยตัวชี้คำสั่ง ที่ถูกต้อง กลยุทธ์ การคาดเดาการกระโดดนี้เป็นกรณีพิเศษของการประมวลผลแบบคาดการณ์ล่วงหน้า
การใช้งานซอฟต์แวร์ทั่วไป
เพื่อให้การใช้งานไปป์ไลน์ข้อมูลมีประสิทธิภาพ จำเป็นต้องมี กลยุทธ์ การจัดตารางเวลา CPU เพื่อกระจายงานไปยังคอร์ CPU ที่ว่างอยู่ และการใช้โครงสร้างข้อมูลที่ขั้นตอนต่างๆ ของไปป์ไลน์จะดำเนินการ ตัวอย่างเช่น ระบบปฏิบัติการ ที่พัฒนามา จาก UNIXอาจใช้ไปป์ไลน์คำสั่งเชื่อมต่อ IO มาตรฐานของกระบวนการต่างๆ โดยใช้ไปป์ที่ระบบปฏิบัติการสร้างขึ้น ระบบปฏิบัติการบางระบบอาจมี ไวยากรณ์ คล้าย UNIXเพื่อเรียงลำดับการทำงานของโปรแกรมหลายๆ โปรแกรมในไปป์ไลน์ แต่จะใช้งานในรูปแบบการประมวลผลแบบอนุกรมธรรมดา แทนที่จะเป็นการประมวลผลแบบไปป์ไลน์อย่างแท้จริง กล่าวคือ ต้องรอจนกว่าแต่ละโปรแกรมจะเสร็จสิ้นก่อนที่จะเริ่มโปรแกรมถัดไป
แนวทางระดับล่างอาจอาศัยเธรดที่ระบบปฏิบัติการจัดเตรียมไว้เพื่อกำหนดตารางงานในแต่ละขั้นตอน: ทั้ง การใช้งาน แบบพูลเธรดหรือแบบหนึ่งเธรดต่อขั้นตอนก็เป็นไปได้และมีอยู่จริง[ 3 ]
ยังมี กลยุทธ์อื่นๆ ที่อาศัยการทำงานแบบมัลติทาสกิ้งแบบร่วมมือกันซึ่งไม่จำเป็นต้องใช้เธรดการทำงานหลายเธรดและคอร์ CPU เพิ่มเติม เช่น การใช้ตัวจัดตารางเวลาแบบราวด์โรบินร่วมกับเฟรมเวิร์กที่ใช้โครูทีน ในบริบทนี้ แต่ละขั้นตอนอาจถูกสร้างขึ้นด้วยโครูทีนของตนเอง และส่งการควบคุมกลับไปยังตัวจัดตารางเวลาหลังจากเสร็จสิ้นภารกิจในรอบนั้น วิธีการนี้อาจต้องมีการควบคุมขั้นตอนของกระบวนการอย่างระมัดระวังเพื่อหลีกเลี่ยงการใช้เวลาเกินความจำเป็น
ต้นทุนและข้อเสีย
โดยทั่วไปแล้ว ระบบแบบไปป์ไลน์ต้องการทรัพยากร (ส่วนประกอบวงจร หน่วยประมวลผล หน่วยความจำคอมพิวเตอร์ ฯลฯ) มากกว่าระบบที่ประมวลผลทีละชุด เนื่องจากขั้นตอนต่างๆ ไม่สามารถใช้ทรัพยากรเหล่านั้นร่วมกันได้ และเนื่องจากอาจจำเป็นต้องมีการบัฟเฟอร์และตรรกะการซิงโครไนซ์เพิ่มเติมระหว่างส่วนประกอบต่างๆ
นอกจากนี้ การถ่ายโอนรายการระหว่างหน่วยประมวลผลที่แยกจากกันอาจทำให้เกิดความล่าช้ามากขึ้น โดยเฉพาะอย่างยิ่งสำหรับไปป์ไลน์ที่ยาว
ต้นทุนความซับซ้อนเพิ่มเติมของการประมวลผลแบบไปป์ไลน์อาจสูงมาก หากมีการพึ่งพาซึ่งกันและกันระหว่างการประมวลผลรายการต่างๆ โดยเฉพาะอย่างยิ่งหากใช้กลยุทธ์การเดาและย้อนกลับในการจัดการ อันที่จริง ต้นทุนในการนำกลยุทธ์นั้นไปใช้กับชุดคำสั่งที่ซับซ้อนได้กระตุ้นให้เกิดข้อเสนอที่รุนแรงบางอย่างเพื่อลดความซับซ้อนของสถาปัตยกรรมคอมพิวเตอร์เช่นRISCและVLIW นอกจากนี้ คอมไพเลอร์ยังต้องรับภาระในการจัดเรียงคำสั่งเครื่องใหม่เพื่อปรับปรุงประสิทธิภาพของไปป์ไลน์คำสั่งด้วย
เทคโนโลยีใหม่
ในช่วงไม่กี่ปีที่ผ่านมา ความต้องการใช้งานแอปพลิเคชันและฮาร์ดแวร์พื้นฐานมีมากขึ้นอย่างเห็นได้ชัด ตัวอย่างเช่น การสร้างไปป์ไลน์ด้วยแอปพลิเคชันแบบโหนดเดียวที่ประมวลผลข้อมูลทีละแถวนั้นไม่สามารถทำได้อีกต่อไปแล้ว เนื่องจากปริมาณและความหลากหลายของข้อมูลขนาดใหญ่อย่างไรก็ตาม ด้วยการเกิดขึ้นของเครื่องมือวิเคราะห์ข้อมูล เช่นHadoopหรือล่าสุดคือApache Sparkทำให้สามารถกระจายชุดข้อมูลขนาดใหญ่ไปยังโหนดประมวลผลหลายโหนดได้ ส่งผลให้แอปพลิเคชันมีประสิทธิภาพสูงขึ้นหลายร้อยเท่าเมื่อเทียบกับที่เคยคิดไว้ก่อนหน้านี้ ผลของสิ่งนี้ในปัจจุบันคือ แม้แต่พีซีระดับกลางที่ใช้การประมวลผลแบบกระจายในลักษณะนี้ก็สามารถจัดการการสร้างและเรียกใช้ไปป์ไลน์ข้อมูลขนาดใหญ่ได้[ 4 ]
ดูเพิ่มเติม
บรรณานุกรม
- Perez Garcia, Pablo (2018). Pipeline DSL: DSL สำหรับสร้างไปป์ไลน์ CI/CD สำหรับโครงการของคุณ . Addison-Wesley. ISBN 978-0-134-69147-3.
- สำหรับการอภิปรายมาตรฐานเกี่ยวกับการประมวลผลแบบไปป์ไลน์ในระบบประมวลผลแบบขนาน โปรดดูQuinn, Michael J. (2004). Parallel Programming in C with MPI and openMP . Dubuque, Iowa: McGraw-Hill Professional. ISBN 0072822562.
- Pogonyi, Roland (กุมภาพันธ์ 2021). "Data Pipeline คืออะไร?" . สืบค้นเมื่อ11 มีนาคม 2021 .