ความสัมพันธ์ระหว่างกระบวนการเคอร์เนลเธรดกระบวนการที่มีน้ำหนักเบาและเธรดผู้ใช้ใน Unix คืออะไร [ปิด]


12

Unix Internal โดย Vahalia มีตัวเลขแสดงความสัมพันธ์ระหว่างกระบวนการเคอร์เนลเธรดกระบวนการน้ำหนักเบาและเธรดผู้ใช้ หนังสือเล่มนี้ให้ความสนใจมากที่สุดกับ SVR4.2 และยังสำรวจ 4.4BSD, Solaris 2.x, Mach และ Digital UNIX โดยละเอียด โปรดทราบว่าฉันไม่ได้ถามเกี่ยวกับ Linux

  1. สำหรับแต่ละกระบวนการมีกระบวนการที่มีน้ำหนักเบาอย่างน้อยหนึ่งกระบวนการอ้างอิงหรือไม่? รูปที่ 3.4 ดูเหมือนจะบอกว่าใช่

    ทำไมรูปที่ 3.5 (a) แสดงกระบวนการโดยตรงที่ด้านบนของ CPU โดยไม่มีกระบวนการที่มีน้ำหนักเบาในระหว่างนั้น

  2. สำหรับกระบวนการที่มีน้ำหนักเบาแต่ละครั้งจะมีเคอร์เนลเธรดเดียวที่อ้างอิงกระบวนการที่มีน้ำหนักเบาหรือไม่ รูปที่ 3.4 ดูเหมือนจะบอกว่าใช่

    ทำไมรูปที่ 3.5 (b) แสดงกระบวนการที่มีน้ำหนักเบาโดยตรงบนกระบวนการโดยที่ไม่มีเคอร์เนลเธรด

  3. เคอร์เนลเธรดเป็นเอนทิตีเดียวที่สามารถกำหนดเวลาได้หรือไม่?

  4. กระบวนการที่มีน้ำหนักเบาถูกกำหนดเวลาโดยอ้อมผ่านการกำหนดตารางเวลาเธรดเคอร์เนลพื้นฐานหรือไม่?

  5. กระบวนการที่กำหนดไว้ทางอ้อมผ่านการกำหนดเวลากระบวนการน้ำหนักเบาพื้นฐานหรือไม่

รูปที่ 3-4  กระบวนการที่มีน้ำหนักเบา

รูปที่ 3-5  การใช้งานเธรดผู้ใช้


ปรับปรุง:

ฉันถามคำถามที่คล้ายกันสำหรับ Linux กระบวนการน้ำหนักเบาติดอยู่กับเคอร์เนลเธรดใน Linux หรือไม่ ฉันเดาว่าอาจเป็นเพราะแนวคิดระบบปฏิบัติการหนังสือแนะนำแนวคิดโดยปริยายโดยใช้ Unix และ Unix และ Linux อาจแตกต่างกันดังนั้นฉันจึงอ่านเกี่ยวกับเคอร์เนล Unix

ฉันขอบคุณคำตอบปัจจุบัน แต่ฉันหวังว่าจะเปิดโพสต์ใหม่เพื่อให้ฉันสามารถยอมรับคำตอบอื่น ๆ ได้


ทำไมคำถามดังกล่าวถึงถูกทำเครื่องหมายว่าเป็นกระดานด้วย เป็นคำถามที่ดีเกี่ยวกับแนวคิดของ Linux เอกสารมักจะมีรายละเอียดไม่เพียงพอคำอธิบายจะเป็นคำตอบที่ดี
炸鱼薯条德里克

ผู้ดำเนินรายการ Re: มันไม่ใช่คำถามที่บริสุทธิ์ แต่เป็นธรรมชาติของคำถาม ฉันขอความสัมพันธ์ระหว่างแนวคิดที่เกี่ยวข้องและสับสนหลายอย่าง ฉันเดาว่าคนที่ไม่เข้าใจอาจคิดว่าการนับคำถามมีความสำคัญ
ทิม

คำตอบ:


12

โปรดดู: การทำความเข้าใจกับเคอร์เนล 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 เท่า

เธรดระดับเคอร์เนลมักถูกนำไปใช้ในเคอร์เนลโดยใช้หลายงาน ในกรณีนี้เคอร์เนลกำหนดเวลาแต่ละเธรดภายในระยะเวลาของแต่ละกระบวนการ ที่นี่เนื่องจากนาฬิกาติ๊กจะกำหนดเวลาการสลับงานจึงมีโอกาสน้อยกว่าที่จะหมูครั้งที่ออกจากเธรดอื่นภายในภารกิจเธรดระดับเคอร์เนลได้รับการสนับสนุนและจัดการโดยตรงจากระบบปฏิบัติการ ความสัมพันธ์ระหว่างเธรดระดับผู้ใช้และเธรดระดับเคอร์เนลไม่ได้แยกจากกันโดยสิ้นเชิงในความเป็นจริงมีการโต้ตอบระหว่างสองระดับนี้ โดยทั่วไปเธรดระดับผู้ใช้สามารถใช้งานได้โดยใช้หนึ่งในสี่โมเดล: โมเดลแบบหนึ่งต่อหนึ่ง, แบบหนึ่งต่อหนึ่ง, แบบหลายต่อหลายและสองระดับ โมเดลทั้งหมดเหล่านี้แม็พเธรดระดับผู้ใช้กับเธรดระดับเคอร์เนลและทำให้เกิดการโต้ตอบในองศาที่ต่างกันระหว่างทั้งสองระดับ

ป้อนคำอธิบายรูปภาพที่นี่

เธรดกับกระบวนการ

  1. โปรแกรมเริ่มต้นเป็นไฟล์ข้อความของรหัสโปรแกรม
  2. โปรแกรมรวบรวมหรือแปลความหมายเป็นรูปแบบไบนารี
  3. โปรแกรมถูกโหลดเข้าสู่หน่วยความจำ
  4. โปรแกรมกลายเป็นกระบวนการทำงานหนึ่งกระบวนการขึ้นไป
  5. โดยทั่วไปกระบวนการจะเป็นอิสระจากกัน
  6. ในขณะที่เธรดมีอยู่เป็นชุดย่อยของกระบวนการ
  7. เธรดสามารถสื่อสารระหว่างกันได้ง่ายกว่ากระบวนการ
  8. แต่เธรดมีความเสี่ยงต่อปัญหาที่เกิดจากเธรดอื่นในกระบวนการเดียวกัน

อ้างอิง:

ทำความเข้าใจกับ Linux Kernel, รุ่นที่ 3

ขึ้น1 2 3 4 5

...............................................

ทีนี้มาทำให้คำเหล่านี้ง่ายขึ้น ( ย่อหน้านี้มาจากมุมมองของฉัน ) เคอร์เนลเป็นส่วนต่อประสานระหว่างซอฟต์แวร์และฮาร์ดแวร์ กล่าวอีกนัยหนึ่งเคอร์เนลทำหน้าที่เหมือนสมอง มันจัดการความสัมพันธ์ระหว่างสารพันธุกรรม (เช่นรหัสและซอฟต์แวร์อนุพันธ์) และระบบร่างกาย (เช่นฮาร์ดแวร์หรือกล้ามเนื้อ)

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

เธรดพื้นที่ผู้ใช้หลีกเลี่ยงเคอร์เนลและจัดการงานเอง บ่อยครั้งที่สิ่งนี้เรียกว่า "มัลติทาสกิ้งแบบร่วมมือ" และแน่นอนว่ามันเหมือนแขนขาของเราทั้งบนและล่างมันอยู่ภายใต้การควบคุมของเราเองและมันทำงานร่วมกันเพื่อให้ได้งาน (เช่นแบบฝึกหัดหรือ ... ) และไม่ต้องการคำสั่งโดยตรง สมอง. ในอีกด้านหนึ่ง Kernel-Space threads ถูกควบคุมอย่างสมบูรณ์โดยเคอร์เนลและตัวกำหนดตารางเวลา

...............................................

ในการตอบคำถามของคุณ:

  1. กระบวนการถูกนำไปใช้เสมอโดยยึดตามกระบวนการน้ำหนักเบาหนึ่งกระบวนการหรือมากกว่าหรือไม่? รูปที่ 3.4 ดูเหมือนจะบอกว่าใช่ เหตุใดรูปที่ 3.5 (a) แสดงกระบวนการโดยตรงที่ด้านบนของ CPU

    ใช่มีกระบวนการน้ำหนักเบาที่เรียกว่าเธรดและกระบวนการเฮฟวี่เวท

    กระบวนการเฮฟวี่เวท (คุณสามารถเรียกมันว่ากระบวนการเธรดสัญญาณ) ต้องการตัวประมวลผลเพื่อทำงานเพิ่มเติมเพื่อสั่งการประมวลผลนั่นคือเหตุผลที่รูปที่ 3.5 (a) แสดงกระบวนการโดยตรงที่ด้านบนของ CPU

  2. กระบวนการน้ำหนักเบาถูกนำไปใช้เสมอโดยอ้างอิงจากเคอร์เนลเธรดหรือไม่ รูปที่ 3.4 ดูเหมือนจะบอกว่าใช่ ทำไมรูปที่ 3.5 (b) แสดงกระบวนการน้ำหนักเบาโดยตรงที่ด้านบนของกระบวนการ

    ไม่กระบวนการน้ำหนักเบาแบ่งออกเป็นสองประเภท: กระบวนการระดับผู้ใช้และระดับเคอร์เนลตามที่กล่าวไว้ข้างต้น กระบวนการระดับผู้ใช้อาศัยไลบรารีของตัวเองเพื่อประมวลผลงาน เคอร์เนลเองกำหนดการกระบวนการระดับเคอร์เนล เธรดระดับผู้ใช้สามารถนำไปใช้โดยใช้หนึ่งในสี่โมเดล: หลายต่อหนึ่ง, หนึ่งต่อหนึ่ง, หลายต่อหลายและสองระดับ ทั้งหมดโมเดลเหล่านี้แม็พเธรดระดับผู้ใช้กับเธรดระดับเคอร์เนล

  3. เคอร์เนลเธรดเป็นเอนทิตีเดียวที่สามารถกำหนดเวลาได้หรือไม่?

    ไม่เธรดระดับเคอร์เนลถูกสร้างโดยเคอร์เนลเอง แตกต่างจากเธรดระดับผู้ใช้เนื่องจากเธรดระดับเคอร์เนลไม่มีพื้นที่ที่ จำกัด พวกเขาอาศัยอยู่ในพื้นที่เคอร์เนลเพียงอย่างเดียวไม่เคยเปลี่ยนเป็นอาณาจักรของผู้ใช้ - ที่ดิน อย่างไรก็ตามมันเป็นเอนทิตีที่สามารถกำหนดตารางเวลาได้อย่างสมบูรณ์เช่นเดียวกับกระบวนการปกติ (หมายเหตุ: เป็นไปได้ที่จะปิดการใช้งานอินเตอร์รัปต์เกือบทั้งหมดสำหรับการดำเนินการเคอร์เนลที่สำคัญ) วัตถุประสงค์ของเธรดเคอร์เนลของตัวเองส่วนใหญ่จะทำหน้าที่บำรุงรักษาในระบบ เคอร์เนลเท่านั้นที่สามารถเริ่มหรือหยุดเธรดเคอร์เนล ในอีกด้านหนึ่งกระบวนการระดับผู้ใช้สามารถกำหนดเวลาเองโดยขึ้นอยู่กับว่าเป็นไลบรารีของตัวเองและในเวลาเดียวกันก็สามารถกำหนดเวลาได้โดยเคอร์เนลตามรุ่นสองระดับและหลายต่อหลายคน (ดังที่ได้กล่าวไว้ข้างต้น)

  4. กระบวนการที่มีน้ำหนักเบาถูกกำหนดไว้ทางอ้อมผ่านการกำหนดเวลาเคอร์เนลเธรดพื้นฐานหรือไม่?

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

  5. กระบวนการที่กำหนดไว้ทางอ้อมผ่านการกำหนดเวลากระบวนการน้ำหนักเบาพื้นฐานหรือไม่

    มันขึ้นอยู่กับว่ามันเป็นกระบวนการเฮฟวี่เวทหรือน้ำหนักเบา Heavy เป็นกระบวนการที่กำหนดโดยเคอร์เนลเอง กระบวนการไฟสามารถจัดการได้ในระดับเคอร์เนลและในระดับผู้ใช้


ขอบคุณ (1) unix.stackexchange.com/questions/472354/ … (2) ฉันถามเฉพาะเกี่ยวกับ Unix แทน LInux ถึงแม้ว่าฉันจะขอบคุณคำตอบของคุณโดยเฉพาะอย่างยิ่งมีประโยชน์มากสำหรับ Linux และหวังว่าคุณจะสามารถทิ้งมันไว้ได้
ทิม

1
"วัตถุประสงค์ของเธรดของเคอร์เนลส่วนใหญ่เพื่อทำหน้าที่บำรุงรักษาบนระบบ" - คุณสามารถอธิบายหรือให้ข้อมูลอ้างอิงได้ Goro
iruvar

@ iruva ฉันเชื่อว่า "หน้าที่การบำรุงรักษา" ไม่ใช่คำที่ถูกต้องตัวอย่างเช่นการจัดการพลังงานถูกควบคุมโดยเคอร์เนลเธรดและไม่มีส่วนเกี่ยวข้องกับหน้าที่การบำรุงรักษา จริงๆแล้วการอ้างอิงที่ให้มาพร้อมกับโพสต์นี้มีข้อมูลมากมายเกี่ยวกับเคอร์เนล หากคุณต้องการให้ฉันทำอย่างละเอียดโปรดโพสต์คำถามใหม่เกี่ยวกับเคอร์เนลเธรดและฟังก์ชั่น / ประเภท / วิธีที่พวกเขาสร้าง ... ฯลฯ และฉันยินดีที่จะอธิบาย คำตอบนี้มีความยาวเพียงพอและไม่สามารถรับข้อมูลเพิ่มเติมได้!

@Tim: Unix รุ่นใดที่คุณถามถึง? โดยเฉพาะระบบโบราณที่คุณพูดถึงในหนังสือ มีการรวม BSD สมัยใหม่หรือไม่ Solaris 11 รวมอยู่ด้วยหรือไม่? MacOS X Leopard (UNIX ที่ผ่านการรับรอง) รวมอยู่ด้วยหรือไม่?
user1686

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