การทำความเข้าใจว่า Bash
จัดการข้อมูลผ่าน Pipes ใน Linux อย่างไร
เมื่อใช้เครื่องมือบรรทัดคำสั่งใน Linux หนึ่งในฟีเจอร์ที่ทรงพลังที่สุดที่คุณสามารถใช้ได้คือความสามารถในการเชื่อมต่อคำสั่งผ่าน pipes สิ่งนี้ช่วยให้คุณส่งผลลัพธ์ของคำสั่งหนึ่งไปยังอีกคำสั่งอย่างตรงไปตรงมาในฐานะข้อมูลนำเข้า อย่างไรก็ตาม คุณเคยสงสัยไหมว่ากระบวนการนี้ทำงานอย่างไร? bash
จัดการการไหลของข้อมูลระหว่างคำสั่งเหล่านี้อย่างไร? มาลงลึกในรายละเอียดของการจัดการ pipe ใน Linux กันเถอะ
พื้นฐานของ Pipes ใน Bash
โดยง่ายที่สุด pipe ช่วยให้ข้อมูลไหลระหว่างสองกระบวนการ สิ่งนี้จะทำได้โดยทั่วไปโดยใช้ตัวดำเนินการ pipe (|
). ยกตัวอย่างเช่น คำสั่ง:
cat file.txt | tail -20
ในคำสั่งนี้:
cat file.txt
อ่านเนื้อหาของfile.txt
และส่งไปยัง stdout (การส่งออกตามมาตรฐาน) ของมันtail -20
รับผลลัพธ์นี้และประมวลผลเพื่อแสดงผลบรรทัดสุดท้าย 20 บรรทัด
แล้วการเชื่อมต่อระหว่างคำสั่งสองคำสั่งนี้ถูกจัดระเบียบและดำเนินการโดยระบบปฏิบัติการ Linux อย่างไร?
Bash
จัดการ Pipes อย่างไร?
“เวทมนตร์” ของการจัดการ pipe เกิดขึ้นระดับระบบปฏิบัติการและเกี่ยวข้องกับหลายขั้นตอนที่สำคัญ:
1. การเริ่มกระบวนการ
เมื่อคุณเรียกใช้คำสั่งที่มี pipes ใน bash โปรแกรมทั้งสอง (cat
และ tail
ในตัวอย่างของเรา) จะถูกเริ่มพร้อมกันเกือบจะทันที ทั้งสองจะเริ่มการดำเนินการและเตรียมซึ่งกันและกันเพื่อประมวลผลข้อมูลนำเข้าและส่งออกที่เกี่ยวข้องของพวกเขา ตัวอย่างเช่น:
tail
จะตีความอาร์กิวเมนต์-20
cat
จะเปิดและอ่านfile.txt
2. การส่งข้อมูล
หลังจากการเริ่มต้น การส่งข้อมูลจริงจะเริ่มขึ้น ที่นี่คือวิธีการทำงาน:
- Buffering: ข้อมูลจาก
cat
ถูกส่งไปยังบัฟเฟอร์ที่ระบบปฏิบัติการจัดเตรียมไว้ บัฟเฟอร์นี้จะเก็บข้อมูลชั่วคราวระหว่างผู้ผลิต (cat
) และผู้บริโภค (tail
) - การร้องขอข้อมูลนำเข้า: ในจุดหนึ่ง
tail
จะร้องขอข้อมูลนำจากระบบปฏิบัติการ โดยบอกว่าพร้อมที่จะประมวลผลข้อมูลแล้ว - การดึงข้อมูล: บัฟเฟอร์จะถูกเติมอย่างค่อยเป็นค่อยไปเมื่อ
cat
เขียนข้อมูลลงไป เมื่อมีข้อมูลพร้อมใช้งานtail
จะดึงข้อมูลที่จำเป็นออกจากบัฟเฟอร์ - การจัดการเวลา: หาก
cat
สร้างข้อมูลเร็วกว่าที่tail
จะใช้งานได้ บัฟเฟอร์จะขยายเพื่อรองรับข้อมูลที่เข้ามา
3. การเสร็จสิ้นการประมวลผล
เมื่อ cat
เสร็จสิ้นการส่งออกข้อมูล มันจะปิดการเชื่อมต่อไปยัง stdout ของมัน ระบบปฏิบัติการจะส่งสัญญาณไปยัง tail
ด้วยสัญญาณ End Of File (EOF) จากนั้น tail
จะประมวลผลข้อมูลที่เหลืออยู่ในบัฟเฟอร์จนกระทั่งว่างเปล่า
4. การจัดการเวลาในการประมวลผล
ในระบบที่มีโปรเซสเซอร์หลายตัว กระบวนการเหล่านี้อาจไม่เพียงแต่แบ่งเวลาบนคอร์เดียวกัน แต่ยังอาจทำงานพร้อมกันบนคอร์ที่ต่างกัน ระบบปฏิบัติการจัดการสิ่งนี้โดยการให้กระบวนการแตกต่างกัน “การแบ่งเวลาทำงาน” เพื่อดำเนินการ ซึ่งเพิ่มประสิทธิภาพการทำงาน ดังนี้:
- รอข้อมูล: หลายโปรแกรมใช้เวลาอย่างมากในการรอข้อมูล (เช่น
tail
รอให้cat
เติมบัฟเฟอร์) - การนอนหลับของกระบวนการ: กระบวนการอาจเข้าสู่สถานะนอนหลับเพื่อให้สามารถใช้ CPU ได้อย่างมีประสิทธิภาพมากขึ้นในขณะที่รอให้การดำเนินการ I/O เสร็จสิ้น
บทบาทของ Buffering ในการจัดการทรัพยากร
สิ่งสำคัญคือบัฟเฟอร์มีบทบาทสำคัญในการจัดการข้อมูลอย่างมีประสิทธิภาพ นี่คือเหตุผล:
- เพิ่มอัตราผลผลิต: บัฟเฟอร์ช่วยให้สามารถถ่ายโอนข้อมูลหลายครั้งโดยไม่ต้องมีการโต้ตอบกับดิสก์หรือเครือข่ายอย่างต่อเนื่อง ซึ่งอาจเป็นการดำเนินการที่ช้ากว่า
- การดำเนินการที่ถูกผูกมัดด้วย I/O: โปรแกรมหลายตัวถูกผูกมัดด้วย I/O ซึ่งหมายความว่าพวกเขาใช้เวลามากขึ้นในการรอข้อมูลมากกว่าการประมวลผลมัน สำหรับตัวอย่าง ความเร็วในการอ่านจากดิสก์มักจะเป็นคอขวดทั่วไป
การสังเกตพฤติกรรมของระบบ
คุณอาจสงสัยว่าจะสังเกตเห็นกระบวนการเหล่านี้ในขณะทำงานได้อย่างไร ใน Linux การใช้เครื่องมืออย่าง top
สามารถให้ข้อมูลเชิงลึกเกี่ยวกับกระบวนการที่กำลังทำงานและการใช้งาน CPU ของพวกเขา โดยทั่วไปแล้ว คุณจะเห็นแอปพลิเคชันหลายตัวใช้งาน CPU น้อยมากขณะรอข้อมูล ซึ่งสะท้อนให้เห็นถึงลักษณะของกระบวนการที่ถูกผูกมัดด้วย I/O
สรุป
การทำความเข้าใจว่า bash
จัดการฟังก์ชันการทำงานของ pipe ช่วยเพิ่มความเข้าใจในด้านการจัดการกระบวนการและประสิทธิภาพใน Linux การทำงานร่วมกันของบัฟเฟอร์ การเริ่มต้นกระบวนการ และการจัดการเวลาของ CPU อย่างมีประสิทธิภาพช่วยให้ผู้ใช้สามารถเชื่อมโยงคำสั่งได้อย่างมีประสิทธิภาพ เพิ่มประสบการณ์การใช้บรรทัดคำสั่ง
ตอนนี้คุณมีความรู้เหล่านี้ คุณสามารถใช้ pipes อย่างมีประสิทธิภาพมากขึ้นในสคริปต์และการดำเนินการในบรรทัดคำสั่งของคุณ ซึ่งช่วยให้การทำงานในระบบ Linux ของคุณมีความไหลลื่นมากขึ้น