ความแตกต่างระหว่างการเรียกของระบบช้าและการเรียกของระบบอย่างรวดเร็ว


13

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

คำตอบ:


20

ในความเป็นจริงมีการไล่ระดับสีสามระดับในการเรียกใช้ระบบ

  1. บางสายระบบกลับมาทันที “ ทันที” หมายความว่าสิ่งเดียวที่พวกเขาต้องการคือเวลาประมวลผลเพียงเล็กน้อย ไม่มีข้อ จำกัด เรื่องระยะเวลาที่สามารถรับได้ (ยกเว้นในระบบเรียลไทม์ ) แต่การโทรเหล่านี้จะกลับมาทันทีที่กำหนดไว้นานพอ
    สายเหล่านี้มักจะถูกเรียกว่าไม่ปิดกั้น ตัวอย่างของการโทรไม่ปิดกั้นการโทรที่เพิ่งอ่านบิตของสถานะของระบบหรือทำให้เปลี่ยนแปลงง่ายสถานะของระบบเช่นgetpid, gettimeofday, หรือgetuid setuidการเรียกระบบบางอย่างอาจเป็นการปิดกั้นหรือไม่ปิดกั้นขึ้นอยู่กับสถานการณ์ เช่นreadไม่เคยบล็อกหากไฟล์ที่เป็นท่อหรือชนิดอื่น ๆ ที่สนับสนุนไม่ปิดกั้นอ่านและO_NONBLOCKธงเป็นชุด
  2. การเรียกระบบบางครั้งอาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์ แต่ไม่สิ้นสุดตลอดไป sleepเป็นตัวอย่าง
  3. การเรียกระบบบางอย่างจะไม่ส่งคืนจนกว่าจะมีเหตุการณ์ภายนอกเกิดขึ้น สายเหล่านี้บอกว่าจะปิดกั้น ยกตัวอย่างเช่นการเรียกร้องให้อธิบายไฟล์ปิดกั้นคือการปิดกั้นและเพื่อให้เป็นreadwait

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

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


ขอบคุณมาก! แต่ถ้าไฟล์เป็นไพพ์การอ่านไฟล์จะไม่ถูกบล็อกหรือไม่? ดูที่www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

มันหมายถึง "การอ่าน / เขียนช้า (เช่นบน
ไพพ์

@KayKay: สำหรับไปป์คุณสามารถมีได้ทั้งสองขึ้นอยู่กับสถานะของO_NONBLOCKธง หากมีการตั้งค่าสถานะ syscall สามารถดำเนินการให้เสร็จสมบูรณ์โดยไม่รอสิ่งอื่นดังนั้นจึงไม่มีการปิดกั้นและเคอร์เนลสามารถถือว่าเป็น syscall ที่รวดเร็ว
Gilles 'หยุดความชั่วร้าย'

คุณหมายถึงมันขึ้นอยู่กับการตั้งค่าสถานะ O_NONBLOCK!
KayKay

3

การเรียกใช้ระบบช้าเป็นสิ่งที่คล้ายกับ TCP socket read () - หากคุณไม่ได้ตั้ง O_ASYNC (หรืออะไรก็ตาม) ไว้ก็สามารถรอได้

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

การอ่านดิสก์อยู่ในหมวดหมู่ของการเรียกระบบช้า หากกระบวนการทำการอ่าน () ในไฟล์ดิสก์จริงตัวอธิบายไฟล์เคอร์เนลอาจต้องอ่านในบล็อกดิสก์หนึ่งบล็อกหรือมากกว่าเพื่อตอบสนองการอ่าน ทั้งนี้ขึ้นอยู่กับโครงสร้างบนดิสก์ของระบบไฟล์พื้นฐานซึ่งอาจหมายถึงการอ่าน on-disk-inode เพื่อรับหมายเลขบล็อกดิสก์ของ "การบล็อกทางอ้อม" การอ่านบล็อกทางอ้อมเพื่อรับบล็อกข้อมูลแล้วอ่านบล็อกข้อมูลเอง . ค่อนข้างเสียเวลาอย่างน้อยก็ในแง่ของรอบการใช้งาน CPU ต่อการเข้าถึงดิสก์วันนี้อาจแย่กว่าสมัยก่อน ๆ

ฉันไม่ได้เห็นสิ่งนี้มานาน แต่รหัสไดรเวอร์อุปกรณ์ไดรฟ์ Unix "ครึ่งล่าง" จะบล็อกสัญญาณ / ขัดจังหวะเพื่อให้ง่ายต่อการรักษาความสมบูรณ์ของระบบไฟล์บนดิสก์ ในบางครั้งไดรเวอร์ buggy หรือดิสก์ที่ล้มเหลวจะไม่ส่งดิสก์บล็อกที่กระบวนการร้องขอและกระบวนการจะล้มลงอย่างถาวร แม้แต่การฆ่า -9 ก็ไม่ได้ทำอะไรเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.