โปรดดู: การทำความเข้าใจกับเคอร์เนล Linuxรุ่นที่ 3 โดย Daniel P. Bovet, Marco Cesati
- สำนักพิมพ์: O'Reilly
- ผับวันที่: พฤศจิกายน 2548
- ไอ: 0-596-00565-2
- หน้า: 942
ในบทนำของพวกเขา Daniel P. Bovet และ Marco Cesati กล่าวว่า:
ในทางเทคนิคแล้ว Linux เป็นเคอร์เนล Unix ที่แท้จริงแม้ว่าจะไม่ใช่ระบบปฏิบัติการแบบเต็มของ Unix เพราะมันไม่ได้รวมแอปพลิเคชันทั้งหมดเช่นโปรแกรมอรรถประโยชน์ระบบแฟ้มระบบหน้าต่างและเดสก์ท็อปกราฟิกคำสั่งผู้ดูแลระบบโปรแกรมแก้ไขข้อความคอมไพเลอร์และอื่น ๆ บน. สิ่งที่คุณอ่านในหนังสือเล่มนี้และเห็นในเคอร์เนล Linux อาจช่วยให้คุณเข้าใจตัวแปร Unix อื่น ๆ ได้
ในย่อหน้าถัดไปฉันจะพยายามพูดถึงมุมมองของคุณตามความเข้าใจของฉันต่อข้อเท็จจริงที่ปรากฏใน "การทำความเข้าใจเคอร์เนลลินุกซ์" ซึ่งมีขนาดใหญ่มากคล้ายกับที่อยู่ในยูนิกซ์
กระบวนการหมายถึงอะไร :
กระบวนการเป็นเหมือนมนุษย์พวกมันถูกสร้างขึ้นพวกมันมีชีวิตที่มีความหมายมากขึ้นหรือน้อยลงพวกมันเลือกที่จะสร้างกระบวนการลูกหนึ่งกระบวนการขึ้นไปและในที่สุดพวกมันก็ตาย กระบวนการมีห้าส่วนพื้นฐาน: รหัส ("ข้อความ"), ข้อมูล (VM), สแต็ค, ไฟล์ I / O และตารางสัญญาณ
วัตถุประสงค์ของกระบวนการในเคอร์เนลคือทำหน้าที่เป็นเอนทิตีที่จัดสรรทรัพยากรระบบ (เวลา CPU, หน่วยความจำและอื่น ๆ ) เมื่อกระบวนการถูกสร้างขึ้นมันเกือบจะเหมือนกับกระบวนการหลัก มันได้รับสำเนา (ตรรกะ) ของพื้นที่ที่อยู่ของผู้ปกครองและรันรหัสเดียวกันกับผู้ปกครองเริ่มต้นที่คำสั่งต่อไปหลังจากการเรียกระบบการสร้างกระบวนการ แม้ว่าผู้ปกครองและเด็กอาจแชร์เพจที่มีรหัสโปรแกรม (ข้อความ) แต่ก็มีสำเนาข้อมูลแยกต่างหาก (สแต็คและกอง) เพื่อให้การเปลี่ยนแปลงโดยเด็กไปยังตำแหน่งหน่วยความจำจะไม่ปรากฏแก่ผู้ปกครอง (และในทางกลับกัน) .
กระบวนการทำงานอย่างไร
โปรแกรมการดำเนินการต้องการมากกว่าแค่รหัสเลขฐานสองที่บอกคอมพิวเตอร์ว่าจะต้องทำอย่างไร โปรแกรมต้องการหน่วยความจำและทรัพยากรระบบปฏิบัติการต่าง ๆ เพื่อที่จะทำงาน “ กระบวนการ” คือสิ่งที่เราเรียกโปรแกรมที่โหลดลงในหน่วยความจำพร้อมกับทรัพยากรทั้งหมดที่จำเป็นในการทำงาน เธรดคือหน่วยของการดำเนินการภายในกระบวนการ กระบวนการสามารถมีได้ทุกที่ตั้งแต่เธรดเดียวไปจนถึงหลายเธรด เมื่อกระบวนการเริ่มต้นหน่วยความจำและทรัพยากรจะถูกกำหนด แต่ละเธรดในกระบวนการแชร์หน่วยความจำและทรัพยากรนั้น ในกระบวนการแบบเธรดเดียวกระบวนการประกอบด้วยหนึ่งเธรด กระบวนการและเธรดเป็นแบบเดียวกันและมีสิ่งเดียวที่เกิดขึ้น ในกระบวนการมัลติเธรดกระบวนการมีมากกว่าหนึ่งเธรดและกระบวนการดำเนินการหลายสิ่งพร้อมกัน
กลไกของระบบการประมวลผลแบบหลายรวมถึงกระบวนการที่มีน้ำหนักเบาและหนา:
ในกระบวนการเฮฟวี่เวทกระบวนการหลายกระบวนการทำงานร่วมกันในแบบคู่ขนาน กระบวนการเฮฟวี่เวทแต่ละกระบวนการในแบบคู่ขนานมีพื้นที่ที่อยู่หน่วยความจำของตนเอง การสื่อสารระหว่างกระบวนการช้าเนื่องจากกระบวนการมีที่อยู่หน่วยความจำแตกต่างกัน การสลับบริบทระหว่างกระบวนการมีราคาแพงกว่า กระบวนการไม่แชร์หน่วยความจำกับกระบวนการอื่น การสื่อสารระหว่างกระบวนการเหล่านี้จะเกี่ยวข้องกับกลไกการสื่อสารเพิ่มเติมเช่นซ็อกเก็ตหรือท่อ
ในกระบวนการที่มีน้ำหนักเบาหรือที่เรียกว่าเธรด หัวข้อที่ใช้ในการแบ่งปันและแบ่งภาระงาน เธรดใช้หน่วยความจำของกระบวนการที่เป็นของ การสื่อสารระหว่างเธรดสามารถเร็วกว่าการสื่อสารระหว่างกระบวนการเนื่องจากเธรดของกระบวนการเดียวกันใช้หน่วยความจำร่วมกับกระบวนการที่เป็นของ ดังนั้นการสื่อสารระหว่างเธรดจึงง่ายและมีประสิทธิภาพ การสลับบริบทระหว่างเธรดของกระบวนการเดียวกันนั้นมีราคาไม่แพง เธรดใช้หน่วยความจำร่วมกับเธรดอื่นของกระบวนการเดียวกัน
เธรดมีสองประเภท: เธรดระดับผู้ใช้และเธรดระดับเคอร์เนล เธรดระดับผู้ใช้หลีกเลี่ยงเคอร์เนลและจัดการงานด้วยตนเอง เธรดระดับผู้ใช้มีปัญหาที่เธรดเดี่ยวสามารถผูกขาดเสี้ยวเวลาดังนั้นจึงทำให้เธรดอื่นอยู่ในภารกิจ เธรดระดับผู้ใช้มักได้รับการสนับสนุนเหนือเคอร์เนลในพื้นที่ของผู้ใช้และจัดการโดยไม่มีการสนับสนุนเคอร์เนล เคอร์เนลไม่รู้อะไรเกี่ยวกับเธรดระดับผู้ใช้และจัดการพวกเขาราวกับว่ามันเป็นกระบวนการแบบเธรดเดียว ดังนั้นเธรดระดับผู้ใช้จึงเร็วมากมันทำงานได้เร็วกว่าเธรดเคอร์เนล 100 เท่า
เธรดระดับเคอร์เนลมักถูกนำไปใช้ในเคอร์เนลโดยใช้หลายงาน ในกรณีนี้เคอร์เนลกำหนดเวลาแต่ละเธรดภายในระยะเวลาของแต่ละกระบวนการ ที่นี่เนื่องจากนาฬิกาติ๊กจะกำหนดเวลาการสลับงานจึงมีโอกาสน้อยกว่าที่จะหมูครั้งที่ออกจากเธรดอื่นภายในภารกิจเธรดระดับเคอร์เนลได้รับการสนับสนุนและจัดการโดยตรงจากระบบปฏิบัติการ ความสัมพันธ์ระหว่างเธรดระดับผู้ใช้และเธรดระดับเคอร์เนลไม่ได้แยกจากกันโดยสิ้นเชิงในความเป็นจริงมีการโต้ตอบระหว่างสองระดับนี้ โดยทั่วไปเธรดระดับผู้ใช้สามารถใช้งานได้โดยใช้หนึ่งในสี่โมเดล: โมเดลแบบหนึ่งต่อหนึ่ง, แบบหนึ่งต่อหนึ่ง, แบบหลายต่อหลายและสองระดับ โมเดลทั้งหมดเหล่านี้แม็พเธรดระดับผู้ใช้กับเธรดระดับเคอร์เนลและทำให้เกิดการโต้ตอบในองศาที่ต่างกันระหว่างทั้งสองระดับ
เธรดกับกระบวนการ
- โปรแกรมเริ่มต้นเป็นไฟล์ข้อความของรหัสโปรแกรม
- โปรแกรมรวบรวมหรือแปลความหมายเป็นรูปแบบไบนารี
- โปรแกรมถูกโหลดเข้าสู่หน่วยความจำ
- โปรแกรมกลายเป็นกระบวนการทำงานหนึ่งกระบวนการขึ้นไป
- โดยทั่วไปกระบวนการจะเป็นอิสระจากกัน
- ในขณะที่เธรดมีอยู่เป็นชุดย่อยของกระบวนการ
- เธรดสามารถสื่อสารระหว่างกันได้ง่ายกว่ากระบวนการ
- แต่เธรดมีความเสี่ยงต่อปัญหาที่เกิดจากเธรดอื่นในกระบวนการเดียวกัน
อ้างอิง:
ทำความเข้าใจกับ Linux Kernel, รุ่นที่ 3
ขึ้น1 2 3 4 5
...............................................
ทีนี้มาทำให้คำเหล่านี้ง่ายขึ้น ( ย่อหน้านี้มาจากมุมมองของฉัน ) เคอร์เนลเป็นส่วนต่อประสานระหว่างซอฟต์แวร์และฮาร์ดแวร์ กล่าวอีกนัยหนึ่งเคอร์เนลทำหน้าที่เหมือนสมอง มันจัดการความสัมพันธ์ระหว่างสารพันธุกรรม (เช่นรหัสและซอฟต์แวร์อนุพันธ์) และระบบร่างกาย (เช่นฮาร์ดแวร์หรือกล้ามเนื้อ)
สมองนี้ (เช่นเคอร์เนล) ส่งสัญญาณไปยังกระบวนการที่ทำตาม กระบวนการเหล่านี้บางอย่างเป็นเหมือนกล้ามเนื้อ (เช่นเธรด) กล้ามเนื้อแต่ละอันมีหน้าที่และงานของตัวเอง แต่พวกมันทำงานร่วมกันเพื่อให้งานเสร็จสิ้น การสื่อสารระหว่างเธรดเหล่านี้ (เช่นกล้ามเนื้อ) นั้นมีประสิทธิภาพและเรียบง่ายดังนั้นพวกเขาจึงสามารถทำงานได้อย่างราบรื่นรวดเร็วและมีประสิทธิภาพ หัวข้อบางส่วน (เช่นกล้ามเนื้อ) อยู่ภายใต้การควบคุมของผู้ใช้ (เช่นกล้ามเนื้อในมือและขาของเรา) คนอื่น ๆ อยู่ภายใต้การควบคุมของสมอง (เช่นกล้ามเนื้อในท้องของเรา, ตา, หัวใจซึ่งเราไม่ได้ควบคุม)
เธรดพื้นที่ผู้ใช้หลีกเลี่ยงเคอร์เนลและจัดการงานเอง บ่อยครั้งที่สิ่งนี้เรียกว่า "มัลติทาสกิ้งแบบร่วมมือ" และแน่นอนว่ามันเหมือนแขนขาของเราทั้งบนและล่างมันอยู่ภายใต้การควบคุมของเราเองและมันทำงานร่วมกันเพื่อให้ได้งาน (เช่นแบบฝึกหัดหรือ ... ) และไม่ต้องการคำสั่งโดยตรง สมอง. ในอีกด้านหนึ่ง Kernel-Space threads ถูกควบคุมอย่างสมบูรณ์โดยเคอร์เนลและตัวกำหนดตารางเวลา
...............................................
ในการตอบคำถามของคุณ:
กระบวนการถูกนำไปใช้เสมอโดยยึดตามกระบวนการน้ำหนักเบาหนึ่งกระบวนการหรือมากกว่าหรือไม่? รูปที่ 3.4 ดูเหมือนจะบอกว่าใช่ เหตุใดรูปที่ 3.5 (a) แสดงกระบวนการโดยตรงที่ด้านบนของ CPU
ใช่มีกระบวนการน้ำหนักเบาที่เรียกว่าเธรดและกระบวนการเฮฟวี่เวท
กระบวนการเฮฟวี่เวท (คุณสามารถเรียกมันว่ากระบวนการเธรดสัญญาณ) ต้องการตัวประมวลผลเพื่อทำงานเพิ่มเติมเพื่อสั่งการประมวลผลนั่นคือเหตุผลที่รูปที่ 3.5 (a) แสดงกระบวนการโดยตรงที่ด้านบนของ CPU
กระบวนการน้ำหนักเบาถูกนำไปใช้เสมอโดยอ้างอิงจากเคอร์เนลเธรดหรือไม่ รูปที่ 3.4 ดูเหมือนจะบอกว่าใช่ ทำไมรูปที่ 3.5 (b) แสดงกระบวนการน้ำหนักเบาโดยตรงที่ด้านบนของกระบวนการ
ไม่กระบวนการน้ำหนักเบาแบ่งออกเป็นสองประเภท: กระบวนการระดับผู้ใช้และระดับเคอร์เนลตามที่กล่าวไว้ข้างต้น กระบวนการระดับผู้ใช้อาศัยไลบรารีของตัวเองเพื่อประมวลผลงาน เคอร์เนลเองกำหนดการกระบวนการระดับเคอร์เนล เธรดระดับผู้ใช้สามารถนำไปใช้โดยใช้หนึ่งในสี่โมเดล: หลายต่อหนึ่ง, หนึ่งต่อหนึ่ง, หลายต่อหลายและสองระดับ ทั้งหมดโมเดลเหล่านี้แม็พเธรดระดับผู้ใช้กับเธรดระดับเคอร์เนล
เคอร์เนลเธรดเป็นเอนทิตีเดียวที่สามารถกำหนดเวลาได้หรือไม่?
ไม่เธรดระดับเคอร์เนลถูกสร้างโดยเคอร์เนลเอง แตกต่างจากเธรดระดับผู้ใช้เนื่องจากเธรดระดับเคอร์เนลไม่มีพื้นที่ที่ จำกัด พวกเขาอาศัยอยู่ในพื้นที่เคอร์เนลเพียงอย่างเดียวไม่เคยเปลี่ยนเป็นอาณาจักรของผู้ใช้ - ที่ดิน อย่างไรก็ตามมันเป็นเอนทิตีที่สามารถกำหนดตารางเวลาได้อย่างสมบูรณ์เช่นเดียวกับกระบวนการปกติ (หมายเหตุ: เป็นไปได้ที่จะปิดการใช้งานอินเตอร์รัปต์เกือบทั้งหมดสำหรับการดำเนินการเคอร์เนลที่สำคัญ) วัตถุประสงค์ของเธรดเคอร์เนลของตัวเองส่วนใหญ่จะทำหน้าที่บำรุงรักษาในระบบ เคอร์เนลเท่านั้นที่สามารถเริ่มหรือหยุดเธรดเคอร์เนล ในอีกด้านหนึ่งกระบวนการระดับผู้ใช้สามารถกำหนดเวลาเองโดยขึ้นอยู่กับว่าเป็นไลบรารีของตัวเองและในเวลาเดียวกันก็สามารถกำหนดเวลาได้โดยเคอร์เนลตามรุ่นสองระดับและหลายต่อหลายคน (ดังที่ได้กล่าวไว้ข้างต้น)
กระบวนการที่มีน้ำหนักเบาถูกกำหนดไว้ทางอ้อมผ่านการกำหนดเวลาเคอร์เนลเธรดพื้นฐานหรือไม่?
เคอร์เนลเธรดถูกควบคุมโดยตัวจัดกำหนดการเคอร์เนลเอง การสนับสนุนเธรดที่ระดับผู้ใช้หมายความว่ามีไลบรารีระดับผู้ใช้ที่เชื่อมโยงกับแอปพลิเคชันและไลบรารีนี้ (ไม่ใช่ CPU) ให้การจัดการทั้งหมดในการสนับสนุนรันไทม์สำหรับเธรด มันจะสนับสนุนโครงสร้างข้อมูลที่จำเป็นในการใช้เธรดนามธรรมและจัดเตรียมการซิงโครไนซ์กำหนดเวลาและกลไกอื่น ๆ ที่จำเป็นสำหรับการตัดสินใจการจัดการทรัพยากรสำหรับเธรดเหล่านี้ ตอนนี้กระบวนการเธรดระดับผู้ใช้บางส่วนสามารถถูกแม็พเข้ากับเธรดระดับเคอร์เนลพื้นฐานและสิ่งนี้รวมถึงการแม็พแบบหนึ่งต่อหนึ่งแบบตัวต่อตัวและแบบกลุ่มต่อกลุ่ม
กระบวนการที่กำหนดไว้ทางอ้อมผ่านการกำหนดเวลากระบวนการน้ำหนักเบาพื้นฐานหรือไม่
มันขึ้นอยู่กับว่ามันเป็นกระบวนการเฮฟวี่เวทหรือน้ำหนักเบา Heavy เป็นกระบวนการที่กำหนดโดยเคอร์เนลเอง กระบวนการไฟสามารถจัดการได้ในระดับเคอร์เนลและในระดับผู้ใช้