ซีพียูที่ทันสมัยทั้งหมดมีความสามารถในการขัดจังหวะคำสั่งเครื่องที่ดำเนินการอยู่ในปัจจุบัน พวกเขาบันทึกสถานะเพียงพอ (โดยปกติ แต่ไม่เสมอไปบนสแต็ก) เพื่อให้สามารถดำเนินการต่อได้ในภายหลังราวกับว่าไม่มีอะไรเกิดขึ้น (คำสั่งที่ถูกขัดจังหวะจะเริ่มใหม่จากศูนย์) จากนั้นพวกเขาก็เริ่มดำเนินการตัวจัดการขัดจังหวะซึ่งเป็นเพียงรหัสเครื่องมากขึ้น แต่วางไว้ในตำแหน่งพิเศษเพื่อให้ CPU รู้ว่ามันอยู่ที่ไหนล่วงหน้า ตัวจัดการขัดจังหวะมักเป็นส่วนหนึ่งของเคอร์เนลของระบบปฏิบัติการ: ส่วนประกอบที่ทำงานด้วยสิทธิ์ที่ยิ่งใหญ่ที่สุดและรับผิดชอบในการควบคุมการทำงานของส่วนประกอบอื่น ๆ ทั้งหมด 1,2
อินเทอร์รัปต์สามารถซิงโครนัสซึ่งหมายความว่าซีพียูทำงานโดยการตอบสนองโดยตรงกับสิ่งที่คำสั่งที่ดำเนินการในปัจจุบันหรืออะซิงโครนัสซึ่งหมายความว่าเกิดขึ้นในเวลาที่ไม่แน่นอนเนื่องจากเหตุการณ์ภายนอกเช่นข้อมูลที่มาถึงเครือข่าย ท่าเรือ. บางคนจองคำว่า "ขัดจังหวะ" สำหรับการขัดจังหวะแบบอะซิงโครนัสและเรียกการขัดจังหวะแบบซิงโครนัส "กับดัก", "ความผิดพลาด" หรือ "ยกเว้น" แทน แต่คำเหล่านั้นทั้งหมดมีความหมายอื่น ๆ
ขณะนี้ระบบปฏิบัติการที่ทันสมัยส่วนใหญ่มีแนวคิดเกี่ยวกับกระบวนการต่างๆ โดยพื้นฐานแล้วนี่คือกลไกที่คอมพิวเตอร์สามารถรันโปรแกรมได้มากกว่าหนึ่งโปรแกรมในเวลาเดียวกัน แต่มันก็เป็นแง่มุมที่สำคัญของระบบปฏิบัติการที่กำหนดค่าการป้องกันหน่วยความจำซึ่งเป็นคุณสมบัติส่วนใหญ่ (แต่อนิจจา ยังไม่หมด ) ซีพียูที่ทันสมัย มันไปพร้อมกับหน่วยความจำเสมือนซึ่งเป็นความสามารถในการเปลี่ยนการแมประหว่างที่อยู่หน่วยความจำและสถานที่จริงใน RAM การป้องกันหน่วยความจำช่วยให้ระบบปฏิบัติการให้แต่ละกระบวนการของ RAM ส่วนตัวที่สามารถเข้าถึงได้เท่านั้น นอกจากนี้ยังช่วยให้ระบบปฏิบัติการ (ทำหน้าที่ในนามของกระบวนการบางอย่าง) เพื่อกำหนดขอบเขตของ RAM เป็นแบบอ่านอย่างเดียว, ปฏิบัติการได้, ใช้ร่วมกันระหว่างกลุ่มของกระบวนการที่ให้ความร่วมมือเป็นต้นนอกจากนี้ยังจะมีหน่วยความจำที่เข้าถึงได้โดย เมล็ด 3
ตราบใดที่แต่ละกระบวนการเข้าถึงหน่วยความจำเฉพาะในวิธีที่ CPU ได้รับการกำหนดค่าให้อนุญาตการป้องกันหน่วยความจำก็จะมองไม่เห็น เมื่อกระบวนการแตกกฎ CPU จะสร้างการขัดจังหวะแบบซิงโครนัสขอให้เคอร์เนลเรียงลำดับสิ่งต่าง ๆ มันเกิดขึ้นเป็นประจำว่ากระบวนการไม่ได้ผิดกฎจริงๆเพียงเคอร์เนลต้องทำงานบางอย่างก่อนที่กระบวนการจะได้รับอนุญาตให้ดำเนินการต่อ ตัวอย่างเช่นหากหน้าของหน่วยความจำของกระบวนการต้อง "ขับไล่" ไปยังไฟล์ swap เพื่อเพิ่มพื้นที่ว่างใน RAM สำหรับอย่างอื่นเคอร์เนลจะทำเครื่องหมายหน้านั้นไม่สามารถเข้าถึงได้ ครั้งต่อไปที่กระบวนการพยายามใช้ CPU จะสร้างการป้องกันหน่วยความจำขัดจังหวะ เคอร์เนลจะดึงหน้าจากการสลับวางกลับไปที่เดิมทำเครื่องหมายสามารถเข้าถึงได้อีกครั้งและดำเนินการต่อ
แต่สมมติว่ากระบวนการทำผิดกฎจริงๆ มันพยายามเข้าถึงหน้าเว็บที่ไม่เคยมี RAM ใดถูกแมปไว้หรือพยายามเรียกใช้หน้าที่ถูกทำเครื่องหมายว่าไม่มีรหัสเครื่องหรืออะไรก็ตาม ตระกูลของระบบปฏิบัติการที่รู้จักกันทั่วไปว่า "Unix" ทุกคนใช้สัญญาณเพื่อจัดการกับสถานการณ์นี้ 4สัญญาณคล้ายกับการขัดจังหวะ แต่ถูกสร้างขึ้นโดยเคอร์เนลและสอดแทรกโดยกระบวนการแทนที่จะสร้างโดยฮาร์ดแวร์และสอดแทรกโดยเคอร์เนล กระบวนการสามารถกำหนดตัวจัดการสัญญาณในรหัสของตัวเองและบอกเคอร์เนลว่าพวกเขาอยู่ที่ไหน ตัวจัดการสัญญาณเหล่านั้นจะดำเนินการขัดจังหวะการไหลปกติของการควบคุมเมื่อจำเป็น สัญญาณทั้งหมดมีจำนวนและชื่อสองชื่อหนึ่งชื่อเป็นอักษรย่อและอีกชื่อหนึ่งเป็นวลีลับน้อยกว่าเล็กน้อย สัญญาณที่สร้างขึ้นเมื่อกระบวนการแบ่งกฎการป้องกันหน่วยความจำคือ (ตามการประชุม) หมายเลข 11 และชื่อของมันคือSIGSEGV
และ "การแบ่งกลุ่มผิด" 5,6
ความแตกต่างที่สำคัญระหว่างสัญญาณและการขัดจังหวะคือว่ามีพฤติกรรมเริ่มต้นสำหรับทุกสัญญาณ หากระบบปฏิบัติการล้มเหลวในการกำหนดตัวจัดการสำหรับการขัดจังหวะทั้งหมดนั่นคือข้อผิดพลาดในระบบปฏิบัติการและคอมพิวเตอร์ทั้งหมดจะทำงานล้มเหลวเมื่อ CPU พยายามเรียกใช้ตัวจัดการที่หายไป แต่กระบวนการไม่มีภาระผูกพันในการกำหนดตัวจัดการสัญญาณสำหรับสัญญาณทั้งหมด หากเคอร์เนลสร้างสัญญาณสำหรับกระบวนการและสัญญาณนั้นถูกทิ้งไว้ที่พฤติกรรมเริ่มต้นเคอร์เนลจะดำเนินการต่อไปและทำทุกอย่างที่เป็นค่าเริ่มต้นและไม่รบกวนกระบวนการ พฤติกรรมเริ่มต้นของสัญญาณส่วนใหญ่เป็น "ไม่ทำอะไรเลย" หรือ "ยุติกระบวนการนี้และอาจสร้างคอร์ดัมพ์" SIGSEGV
เป็นหนึ่งในหลัง
ดังนั้นในการสรุปเรามีกระบวนการที่ทำลายกฎการป้องกันหน่วยความจำ CPU ระงับกระบวนการและสร้างการขัดจังหวะแบบซิงโครนัส เคอร์เนลที่สอดแทรกและสร้างSIGSEGV
สัญญาณสำหรับกระบวนการ สมมติว่ากระบวนการไม่ได้ตั้งค่าตัวจัดการสัญญาณสำหรับSIGSEGV
ดังนั้นเคอร์เนลดำเนินพฤติกรรมเริ่มต้นซึ่งจะยุติกระบวนการ สิ่งนี้มีเอฟเฟกต์เหมือนกับการ_exit
เรียกของระบบ: เปิดไฟล์ถูกปิด, หน่วยความจำถูกจัดสรรคืน, ฯลฯ
จนถึงจุดนี้ไม่มีอะไรพิมพ์ข้อความใด ๆ ที่มนุษย์สามารถมองเห็นได้และเชลล์ (หรือโดยทั่วไปกระบวนการหลักของกระบวนการที่เพิ่งถูกยกเลิก) ไม่ได้มีส่วนเกี่ยวข้องเลย SIGSEGV
ไปที่กระบวนการที่ทำลายกฎไม่ใช่หลัก อย่างไรก็ตามขั้นตอนต่อไปในลำดับนั้นคือการแจ้งให้ทราบถึงกระบวนการแม่ว่าลูกของมันถูกยกเลิก นี้สามารถเกิดขึ้นในรูปแบบที่แตกต่างกันหลายแห่งที่ง่ายที่สุดคือเมื่อผู้ปกครองแล้วรอสำหรับการแจ้งเตือนนี้ใช้หนึ่งในwait
สายระบบ ( wait
, waitpid
, wait4
ฯลฯ ) ในกรณีนั้นเคอร์เนลจะทำให้การเรียกของระบบนั้นกลับมาและจัดหากระบวนการหลักด้วยหมายเลขรหัสที่เรียกว่าสถานะการออก. 7สถานะการออกแจ้งให้ผู้ปกครองทราบว่าเหตุใดกระบวนการลูกจึงถูกยกเลิก ในกรณีนี้มันจะได้เรียนรู้ว่าเด็กถูกยกเลิกเนื่องจากพฤติกรรมเริ่มต้นของSIGSEGV
สัญญาณ
กระบวนการหลักอาจรายงานเหตุการณ์ต่อมนุษย์โดยการพิมพ์ข้อความ โปรแกรมเชลล์ทำสิ่งนี้เกือบทุกครั้ง คุณcrsh
ไม่ได้ใส่รหัสในการทำเช่นนั้น แต่มันเกิดขึ้นแล้วเพราะรูทีนไลบรารี่ C system
เรียกใช้เชลล์ที่มีคุณสมบัติครบถ้วน/bin/sh
, "ภายใต้ประทุน" crsh
เป็นปู่ย่าตายายในสถานการณ์นี้ การแจ้งเตือนกระบวนการหลักจะถูกสอดแทรกด้วย/bin/sh
ซึ่งจะพิมพ์ข้อความตามปกติ แล้ว/bin/sh
ตัวเองออกเพราะมันมีอะไรมากกว่าที่จะทำและการดำเนินงานห้องสมุด C ของsystem
ได้รับว่าการแจ้งเตือนทางออก คุณสามารถเห็นการแจ้งเตือนการออกในรหัสของคุณโดยตรวจสอบค่าส่งคืนของsystem
; แต่มันจะไม่บอกคุณว่ากระบวนการหลานจะตายใน segfault เพราะมันถูกใช้โดยกระบวนการเชลล์ระดับกลาง
เชิงอรรถ
ระบบปฏิบัติการบางระบบไม่ใช้ไดรเวอร์อุปกรณ์เป็นส่วนหนึ่งของเคอร์เนล แต่ทั้งหมดไสขัดขวางยังคงต้องเป็นส่วนหนึ่งของเมล็ดและเพื่อไม่รหัสที่กำหนดค่าการป้องกันหน่วยความจำเพราะฮาร์ดแวร์ไม่ยอมให้อะไรแต่เคอร์เนลที่จะทำสิ่งเหล่านี้
อาจจะมีโปรแกรมที่เรียกว่า "ไฮเปอร์ไวเซอร์" หรือ "ผู้จัดการเครื่องเสมือน" ที่แม้มีสิทธิพิเศษมากกว่าเคอร์เนล แต่สำหรับวัตถุประสงค์ของคำตอบนี้ก็ถือได้ว่าเป็นส่วนหนึ่งของฮาร์ดแวร์
เคอร์เนลเป็นโปรแกรมแต่มันไม่ใช่กระบวนการ มันเหมือนห้องสมุดมากขึ้น กระบวนการทั้งหมดดำเนินการบางส่วนของรหัสเคอร์เนลเป็นครั้งคราวนอกเหนือจากรหัสของตัวเอง อาจจะมีจำนวนของ "หัวข้อเคอร์เนล" ที่เพียงรันโค้ดเคอร์เนล แต่พวกเขาไม่ได้กังวลเราได้ที่นี่
ระบบปฏิบัติการเพียงระบบเดียวที่คุณต้องจัดการอีกต่อไปซึ่งไม่สามารถนำมาใช้กับ Unix ได้คือ Windows มันไม่ได้ใช้สัญญาณในสถานการณ์นี้ (อันที่จริงก็ไม่ได้มีสัญญาณ; หน้าต่าง<signal.h>
อินเตอร์เฟซที่จะแกล้งอย่างสมบูรณ์โดยห้องสมุด C.) จะใช้สิ่งที่เรียกว่า " การจัดการข้อยกเว้นที่มีโครงสร้าง " แทน
บางละเมิดหน่วยความจำป้องกันการสร้างSIGBUS
(ข้อผิดพลาด "รถเมล์") SIGSEGV
แทน เส้นแบ่งระหว่างทั้งสองถูกขีดเส้นใต้และแตกต่างกันไปตามระบบ หากคุณเคยเขียนโปรแกรมที่กำหนดจัดการสำหรับมันอาจจะเป็นความคิดที่ดีที่จะกำหนดจัดการเดียวกันSIGSEGV
SIGBUS
"ความผิดพลาดในการแบ่งกลุ่ม" เป็นชื่อของการขัดจังหวะที่สร้างขึ้นสำหรับการละเมิดของหน่วยความจำป้องกันโดยหนึ่งในคอมพิวเตอร์ที่วิ่งไปที่เดิม UnixอาจจะPDP-11 " การแบ่งกลุ่ม " เป็นการป้องกันหน่วยความจำชนิดหนึ่งแต่ทุกวันนี้คำว่า "การแบ่งเซ็กเมนต์ผิด " หมายถึงการละเมิดการป้องกันหน่วยความจำประเภทใด ๆ โดยทั่วไป
วิธีอื่นทั้งหมดที่กระบวนการผู้ปกครองอาจได้รับแจ้งของเด็กที่มีการยกเลิกท้ายด้วยการเรียกผู้ปกครองwait
และรับสถานะทางออก เป็นเพียงสิ่งอื่นที่เกิดขึ้นก่อน
crsh
เป็นความคิดที่ดีสำหรับการทดลองประเภทนี้ ขอขอบคุณที่แจ้งให้เราทุกคนทราบเกี่ยวกับเรื่องนี้และแนวคิดที่อยู่เบื้องหลัง