“ เธรด” คืออะไร (จริง ๆ )?


237

ฉันได้รับการพยายามที่จะค้นหาความหมายที่ดีและได้รับความเข้าใจในสิ่งที่ด้ายจริงๆ

ดูเหมือนว่าฉันจะต้องขาดอะไรบางอย่างที่เห็นได้ชัด แต่ทุกครั้งที่ฉันอ่านว่าเธรดคืออะไรมันเป็นคำจำกัดความแบบวงกลม la "a เธรดคือเธรดของการดำเนินการ" หรือ "วิธีการแบ่งงานที่กำลังดำเนินอยู่" เอ่อ ฮะ?

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

แตกต่างจากกระบวนการซึ่งเป็นสิ่งที่จริง ๆ - มันคือการรวมกลุ่มของทรัพยากร ฯลฯ

เป็นตัวอย่างของคำนิยามที่ไม่ได้ช่วยอะไรฉันมากนัก . .

จากWikipedia :

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

ดังนั้นฉันถูกไหม ไม่ถูกต้อง? เธรดคืออะไรจริง ๆ

แก้ไข:เห็นได้ชัดว่าด้ายยังจะได้รับการเรียกกองของตัวเองเพื่อให้เป็นส่วนหนึ่งของคอนกรีตสิ่ง


6
"กระบวนการ" ไม่น้อยกว่าคำที่เป็นนามธรรม
ฮอบส์

ที่เก็บข้อมูลโลคัลเธรดเป็นเพียงสแตกการเรียกสำหรับเธรดหรือไม่?
committedandroider

1
การทำซ้ำที่เป็นไปได้ของ"การดำเนินการเรียกใช้" และ "ขยายเธรด"
VahidHoseini

3
คำตอบด้านล่างคือ ... นามธรรม ในแง่ที่ง่ายขึ้น (และการคัดรายละเอียดบางอย่าง): กาลครั้งหนึ่งโปรแกรมคอมพิวเตอร์สามารถทำสิ่งเดียวได้ในครั้งเดียว แล้วมันก็ทำ A หลังจากนั้น B แล้วก็ C แล้วก็ ... ในระบบที่ทันสมัยสิ่งนี้ไม่เหมาะ ตัวอย่างเช่นคุณต้องการท่องเว็บต่อไปในขณะที่ดาวน์โหลดไฟล์ ดังนั้นโปรแกรมจึงมี 'กระทู้' หนึ่งรายการหรือมากกว่า แต่ละหัวข้อ 'เท่านั้นที่สามารถทำสิ่งหนึ่งในครั้งเดียว แต่หัวข้อที่แตกต่างกันสามารถทำสิ่งพร้อมกัน เธรด 1 สามารถทำ A จากนั้น B จากนั้น C เธรด 2 สามารถทำ X, Y แล้ว Z. B ไม่สามารถเริ่มได้จนกว่า A จะเสร็จสิ้น แต่ A และ X สามารถเกิดขึ้นได้ในครั้งเดียว
Mohan

@Mohan นั้นยอดเยี่ยม แต่แตกต่างจากกระบวนการอย่างไร?
eric

คำตอบ:


153

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

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

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


10
+1 เธรดไม่ได้เป็น "คอนกรีต" มากกว่าชุดค่าการลงทะเบียน
Greg Hewgill

6
"ชุดของค่า" คืออะไร พวกเขาคืออะไร พวกเขาจะกำหนดกระทู้อย่างไร
richard

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

4
ขอบคุณเบ็น มีประโยชน์มาก
richard

2
สวัสดีขอบคุณ @BenVoigt คำอธิบายเล็ก ๆ น้อย ๆ ที่ noobs อย่างฉันอาจสะดุด: "การลงทะเบียนโปรเซสเซอร์" มีความหมายอย่างไร? "ตัวชี้คำสั่ง" และ "ตัวชี้แบบสแต็ค" มีความหมายอย่างไร
BKSpurgeon

215

เธรดคือบริบทการดำเนินการซึ่งเป็นข้อมูลทั้งหมดที่ CPU ต้องการเพื่อประมวลผลคำสั่ง

สมมติว่าคุณกำลังอ่านหนังสือและคุณต้องการหยุดพักตอนนี้ แต่คุณต้องการกลับมาอ่านต่อจากจุดที่คุณหยุด วิธีหนึ่งในการบรรลุเป้าหมายนั้นคือการจดหมายเลขหน้าหมายเลขบรรทัดและหมายเลขคำลง บริบทการดำเนินการของคุณสำหรับการอ่านหนังสือคือตัวเลขทั้งสามนี้

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

เธรดทำงานในลักษณะเดียวกัน ซีพียูกำลังให้ภาพลวงตาแก่คุณว่ากำลังทำการคำนวณหลายอย่างในเวลาเดียวกัน มันทำได้โดยใช้เวลาในการคำนวณแต่ละครั้ง สามารถทำได้เนื่องจากมีบริบทการดำเนินการสำหรับการคำนวณแต่ละครั้ง เหมือนกับที่คุณแชร์หนังสือกับเพื่อนของคุณงานหลายอย่างสามารถแชร์ซีพียูได้

ในระดับเทคนิคเพิ่มเติมบริบทการดำเนินการ (ดังนั้นเธรด) ประกอบด้วยค่าของการลงทะเบียนของ CPU

สุดท้าย: เธรดแตกต่างจากกระบวนการ เธรดเป็นบริบทของการดำเนินการในขณะที่กระบวนการเป็นทรัพยากรที่เกี่ยวข้องกับการคำนวณ กระบวนการสามารถมีหนึ่งหรือหลายเธรด

การชี้แจง: ทรัพยากรที่เกี่ยวข้องกับกระบวนการรวมหน้าหน่วยความจำ (เธรดทั้งหมดในกระบวนการมีมุมมองเดียวกันของหน่วยความจำ) ตัวอธิบายไฟล์ (เช่นซ็อกเก็ตเปิด) และข้อมูลรับรองความปลอดภัย (เช่น ID ของผู้ใช้ที่เริ่มต้น กระบวนการ).


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

@pwnall ขอบคุณมากสำหรับการแยกแยะแนวคิดที่ยากลำบากสำหรับคนอื่น ๆ เช่นฉัน! มัลติเธรดเกี่ยวข้องกับการประมวลผลหลายตัว (หรือเรียกใช้กระบวนการแบบขนานบน CPU หลายตัวในกรณีที่ฉันใช้คำผิด)
aerijman

51

ในการกำหนดเธรดอย่างเป็นทางการเราต้องเข้าใจขอบเขตของการทำงานของเธรดก่อน

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

ด้ายเป็นลำดับของคำสั่งดังกล่าวภายในโปรแกรมที่สามารถดำเนินการเป็นอิสระจากรหัสอื่น ๆ ที่ รูปแสดงแนวคิด: ป้อนคำอธิบายรูปภาพที่นี่

เธรดอยู่ภายในพื้นที่แอดเดรสกระบวนการเดียวกันดังนั้นข้อมูลส่วนใหญ่ที่มีอยู่ในคำอธิบายหน่วยความจำของกระบวนการสามารถแชร์ข้ามเธรดได้

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

การสนับสนุนระบบปฏิบัติการอย่างชัดเจนจำเป็นต้องมีการเรียกใช้โปรแกรมแบบมัลติเธรด โชคดีที่ระบบปฏิบัติการที่ทันสมัยส่วนใหญ่รองรับเธรดเช่น Linux (ผ่าน NPTL), ตัวแปร BSD, Mac OS X, Windows, Solaris, AIX, HP-UX เป็นต้นระบบปฏิบัติการอาจใช้กลไกที่แตกต่างกันในการรองรับการทำงานแบบมัลติเธรด

ที่นี่ชัดเจนแนวคิดจะแสดง

ที่นี่คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อ นั่นก็เป็นแหล่งข้อมูลของฉันด้วย

ให้ฉันเพิ่มประโยคที่มาจากIntroduction to Embedded SystemโดยEdward LeeและSeshia :

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


45

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

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

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

ฉันเดาว่าสิ่งสำคัญที่ต้องเข้าใจคือ:

  • ทั้งกระบวนการและเธรดสามารถ "รันในเวลาเดียวกัน"
  • กระบวนการไม่แชร์หน่วยความจำ (โดยค่าเริ่มต้น) แต่เธรดแชร์หน่วยความจำทั้งหมดกับเธรดอื่นในกระบวนการเดียวกัน
  • แต่ละเธรดในกระบวนการมีสแต็กของตัวเองและตัวชี้คำสั่งของมันเอง

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

@committedandroider: โทรได้ดี ฉันแก้ไขคำตอบของฉันเพื่อบอกว่ากระบวนการไม่แชร์หน่วยความจำ (โดยค่าเริ่มต้น) แต่เธรดแชร์หน่วยความจำทั้งหมด
Joey Adams

36

ฉันจะใช้ข้อความจำนวนมากจากแนวคิดระบบปฏิบัติการหนังสือโดย ABRAHAM SILBERSCHATZ, PETER BAER GALVIN และ GREG GAGNE พร้อมกับความเข้าใจในสิ่งต่าง ๆ ของฉันเอง

กระบวนการ

แอปพลิเคชันใด ๆ ที่อยู่ในคอมพิวเตอร์ในรูปแบบข้อความ (หรือรหัส)

เราเน้นว่าโปรแกรมด้วยตัวเองไม่ใช่กระบวนการ โปรแกรมเป็นเอนทิตีแฝงเช่นไฟล์ที่มีรายการคำสั่งที่เก็บไว้ในดิสก์ (มักเรียกว่าไฟล์เรียกทำงาน)

เมื่อเราเริ่มต้นแอปพลิเคชันเราจะสร้างตัวอย่างของการดำเนินการ อินสแตนซ์ของการดำเนินการนี้เรียกว่ากระบวนการ แก้ไข: (ตามการตีความของฉันคล้ายกับคลาสและตัวอย่างของคลาสอินสแตนซ์ของคลาสเป็นกระบวนการ)

ตัวอย่างของกระบวนการคือของ Google Chrome เมื่อเราเริ่ม Google Chrome กระบวนการ 3 อย่างจะเกิดขึ้น:

• กระบวนการของเบราว์เซอร์มีหน้าที่ในการจัดการส่วนต่อประสานผู้ใช้รวมถึงดิสก์และเครือข่าย I / O กระบวนการเบราว์เซอร์ใหม่จะถูกสร้างขึ้นเมื่อ Chrome เริ่มต้นขึ้น กระบวนการเบราว์เซอร์เดียวเท่านั้นที่ถูกสร้างขึ้น

• กระบวนการRendererมีตรรกะสำหรับการแสดงผลหน้าเว็บ ดังนั้นจึงมีตรรกะในการจัดการ HTML, Javascript, รูปภาพและอื่น ๆ ตามกฎทั่วไปกระบวนการสร้างภาพใหม่จะถูกสร้างขึ้นสำหรับแต่ละเว็บไซต์ที่เปิดในแท็บใหม่ดังนั้นกระบวนการของโหมดแสดงภาพหลายภาพอาจใช้งานได้ในเวลาเดียวกัน

• กระบวนการปลั๊กอินถูกสร้างขึ้นสำหรับปลั๊กอินแต่ละประเภท (เช่นแฟลชหรือ QuickTime) ที่ใช้งานอยู่ กระบวนการปลั๊กอินมีรหัสสำหรับปลั๊กอินรวมถึงรหัสเพิ่มเติมที่ทำให้ปลั๊กอินสามารถสื่อสารกับกระบวนการตัวแสดงผลที่เกี่ยวข้องและกระบวนการของเบราว์เซอร์

เกลียว

เพื่อตอบคำถามนี้ฉันคิดว่าคุณควรรู้ก่อนว่าโปรเซสเซอร์คืออะไร ตัวประมวลผลคือชิ้นส่วนของฮาร์ดแวร์ที่ใช้คำนวณจริง แก้ไข: (การคำนวณเช่นการเพิ่มตัวเลขสองตัวเรียงลำดับอาร์เรย์โดยทั่วไปเรียกใช้โค้ดที่เขียน)

ตอนนี้ย้ายไปที่คำจำกัดความของเธรด

ด้ายเป็นหน่วยพื้นฐานของการใช้งาน CPU ; ประกอบด้วย ID เธรดตัวนับโปรแกรมชุดการลงทะเบียนและสแต็ก

แก้ไข: นิยามของเธรดจากเว็บไซต์ของ intel:

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

ดังนั้นหากกระบวนการ Renderer จากแอปพลิเคชัน Chrome เรียงลำดับหมายเลขการเรียงจะเกิดขึ้นในเธรด / เธรดของการดำเนินการ (ไวยากรณ์เกี่ยวกับหัวข้อดูเหมือนสับสนกับฉัน)

การตีความสิ่งต่าง ๆ ของฉัน

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

แก้ไข: ข้อมูลอื่น ๆ ที่ฉันพบว่ามีประโยชน์เพื่อให้บริบทเพิ่มเติม

คอมพิวเตอร์ยุคใหม่ทุกเครื่องมีหัวข้อมากกว่าหนึ่งหัวข้อ จำนวนเธรดในคอมพิวเตอร์ขึ้นอยู่กับจำนวนของคอร์ในคอมพิวเตอร์

คอมพิวเตอร์พร้อมกัน :

จาก Wikipedia:

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

ดังนั้นฉันสามารถเขียนโปรแกรมที่คำนวณผลรวมของตัวเลข 4 ตัว:

(1 + 3) + (4 + 5)

ในโปรแกรมที่จะคำนวณผลรวมนี้ (ซึ่งจะเป็นหนึ่งกระบวนการที่ทำงานบนเธรดของการดำเนินการ) ฉันสามารถแยกกระบวนการอื่นซึ่งสามารถเรียกใช้บนเธรดอื่นเพื่อคำนวณ (4 + 5) และส่งคืนผลลัพธ์ไปยังกระบวนการดั้งเดิมในขณะที่ กระบวนการดั้งเดิมคำนวณผลรวมของ (1 + 3)


5
นั่นคือคำตอบที่แท้จริง
Suhail Mumtaz Awan

1
ช่วยได้มาก นี่คือลักษณะของคำอธิบาย
Dinesh Kumar

คุณค่าที่ยิ่งใหญ่ของคำตอบนี้ให้หนังสืออ้างอิงซึ่งคุณสามารถค้นหารายละเอียดเพิ่มเติมได้ถ้าจำเป็น ขอบคุณ @chatuur!
desa

7

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

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf


1
อะไรที่ทำให้ "สิ่งที่จับต้องได้"? เป็นเพียงข้อมูลที่จัดเก็บใน TLS และ call stack หรือไม่?
richard

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

สอนฉัน . . ดังนั้นคำตอบคืออะไร?
richard

@ ริชาร์ดไม่ต้องการรับการอภิปรายเกี่ยวกับความหมายเพียงแค่เขียนคำตอบของฉันเพื่อพยายามอธิบายแนวคิดเกี่ยวกับ OP
วงโคจร

@richard TLS คืออะไร
committedandroider

6

เธรดไม่ได้เป็นอะไรมากไปกว่าบริบทของหน่วยความจำ (หรือวิธีที่ Tanenbaum นำมาไว้ได้ดีกว่าจัดกลุ่มทรัพยากร) ด้วยกฎการดำเนินการ มันเป็นโครงสร้างซอฟต์แวร์ ซีพียูไม่รู้ว่าเธรดคืออะไร (มีข้อยกเว้นบางอย่างที่นี่, โพรเซสเซอร์บางตัวมีเธรดฮาร์ดแวร์), เพียงแค่ประมวลผลคำสั่ง

เคอร์เนลแนะนำแนวคิดเธรดและกระบวนการเพื่อจัดการหน่วยความจำและคำสั่งตามลำดับอย่างมีความหมาย


5

สิ่งนี้นำมาจากคำตอบของ Yahoo:

เธรดเป็นการสร้างโค้ดที่ไม่ได้รับผลกระทบจากสถาปัตยกรรมของแอปพลิเคชัน กระบวนการเดียวบ่อยครั้งอาจมีหลายเธรด เธรดสามารถสื่อสารกันโดยตรงได้เนื่องจากพวกเขาแชร์ตัวแปรเดียวกัน

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

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

โปรเซสเซอร์ของ Intel กล่าวกันว่ามี "hyper-threading" (AMD ก็มีเช่นกัน) และมีไว้เพื่อให้สามารถทำงานหลาย ๆ "thread" หรือมัลติทาสก์ได้ดีกว่ามาก

ฉันไม่แน่ใจเกี่ยวกับวิธีการจัดการเธรด ฉันจำได้ว่าได้ยินเกี่ยวกับตัวประมวลผลที่กลับไปกลับมาระหว่างกัน แต่ฉันไม่แน่ใจ 100% เกี่ยวกับสิ่งนี้และหวังว่าคนอื่นจะสามารถตอบได้


โปรเซสเซอร์ Intel จัดการกับหลายเธรดได้อย่างไร ด้วยคอร์เดียวควรมีเธรดเดียวเท่านั้นที่รันได้ในแต่ละครั้ง ฉันเห็นด้วยกับหน่วยประมวลผลจะกลับไปกลับมา คุณไม่สามารถทำได้ดีกว่านี้จริงเหรอ?
committedandroider

เป็นการเพิ่มประสิทธิภาพที่ให้ประสิทธิภาพที่ดีขึ้นสำหรับบางกรณีการใช้งาน คุณสามารถอ่านเกี่ยวกับไฮเปอร์เธรดที่นี่: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner

5

คำตอบนั้นแตกต่างกันอย่างมากในระบบที่ต่างกันและการใช้งานที่แตกต่างกัน แต่ส่วนที่สำคัญที่สุดคือ:

  1. เธรดมีเธรดการดำเนินการที่เป็นอิสระ (เช่นคุณสามารถสลับบริบทออกไปจากนั้นย้อนกลับมาและจะทำงานต่อในตำแหน่งเดิม)
  2. เธรดมีอายุการใช้งาน (สามารถสร้างโดยเธรดอื่นและเธรดอื่นสามารถรอให้เสร็จ)
  3. มันอาจจะมีสัมภาระแนบน้อยกว่า "กระบวนการ"

นอกเหนือจากนั้น: เธรดสามารถนำไปใช้ภายในกระบวนการเดียวโดยรันไทม์ภาษา, เธรดอาจเป็น coroutines, เธรดสามารถนำไปใช้ภายในกระบวนการเดียวโดยเธรดไลบรารีหรือเธรดอาจสร้างเคอร์เนล

ในระบบ Unix ที่ทันสมัยหลายแห่งรวมถึง Linux ที่ฉันคุ้นเคยมากที่สุดทุกอย่างเป็น threads - กระบวนการเป็นเพียงประเภทของเธรดที่แชร์บางสิ่งกับผู้ปกครองค่อนข้างน้อย (เช่นได้รับการแมปหน่วยความจำของตัวเองตารางไฟล์ของตัวเอง และการอนุญาต ฯลฯ ) การอ่านman 2 cloneโดยเฉพาะรายการธงเป็นคำแนะนำที่นี่จริงๆ


บริบทสลับเฉพาะเมื่อตัวประมวลผลเปลี่ยนจากเธรดหนึ่งเป็นเธรดอื่น (ไม่ว่าจะอยู่ในกระบวนการเดียวกันหรืออื่น ๆ )?
committedandroider

-1

ฉันไม่พอใจกับคำตอบเหล่านี้ดังนั้นฉันจะเพิ่มของฉันเองที่นี่ :) เธรดเป็นเคอร์เนลที่เป็นนามธรรมสำหรับการตั้งเวลาทำงานกับโปรเซสเซอร์เธรดคือสิ่งที่เคอร์เนลให้คุณจัดการเวลาโปรเซสเซอร์ และแบ่งปันงานกับผู้อื่น


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

-1

ให้ฉันอธิบายความแตกต่างระหว่างกระบวนการและเธรดก่อน

กระบวนการสามารถมีจำนวนเธรด {1..N} คำอธิบายเล็ก ๆ เกี่ยวกับหน่วยความจำเสมือนและตัวประมวลผลเสมือน

หน่วยความจำเสมือน

ใช้เป็นพื้นที่สว็อปเพื่อให้กระบวนการคิดว่ามันนั่งอยู่บนหน่วยความจำหลักสำหรับการดำเนินการ

โปรเซสเซอร์เสมือน

แนวคิดเดียวกันกับหน่วยความจำเสมือนยกเว้นตัวประมวลผล สำหรับกระบวนการมันจะดูเป็นสิ่งเดียวที่ใช้โปรเซสเซอร์

ระบบปฏิบัติการจะดูแลการจัดสรรหน่วยความจำเสมือนและตัวประมวลผลเสมือนให้กับกระบวนการและดำเนินการสลับระหว่างกระบวนการและการดำเนินการ

เธรดทั้งหมดภายในกระบวนการจะแชร์หน่วยความจำเสมือนเดียวกัน แต่แต่ละเธรดจะมีตัวประมวลผลเสมือนแต่ละตัวที่กำหนดให้กับพวกเขาเพื่อให้สามารถดำเนินการแยกกัน

ดังนั้นการประหยัดหน่วยความจำเช่นเดียวกับการใช้ CPU ให้มีศักยภาพ

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