ความแตกต่างระหว่างการเกิดพร้อมกันและการขนานคืออะไร?
ตัวอย่างชื่นชม
ความแตกต่างระหว่างการเกิดพร้อมกันและการขนานคืออะไร?
ตัวอย่างชื่นชม
คำตอบ:
การเกิดขึ้นพร้อมกันคือเมื่องานสองงานขึ้นไปสามารถเริ่มทำงานและทำงานในช่วงเวลาที่ทับซ้อน ไม่ได้แปลว่าทั้งคู่จะทำงานในทันที ตัวอย่างเช่นการทำงานหลายหน้าที่บนเครื่องที่มีแกนเดียว
Parallelismคือเมื่องานรันอย่างแท้จริงในเวลาเดียวกันเช่นบนตัวประมวลผลแบบมัลติคอร์
คู่มือการเขียนโปรแกรมแบบมัลติเธรดของ Quoting Sun :
การเกิดขึ้นพร้อมกัน: เงื่อนไขที่มีอยู่เมื่อเธรดอย่างน้อยสองเธรดกำลังดำเนินการอยู่ รูปแบบการขนานทั่วไปที่มากขึ้นซึ่งสามารถรวมการแบ่งเวลาเป็นรูปแบบของการขนานเสมือนจริง
Parallelism: เงื่อนไขที่เกิดขึ้นเมื่อเธรดอย่างน้อยสองเธรดกำลังดำเนินการพร้อมกัน
มีความสับสนเกิดขึ้นเนื่องจากความหมายในพจนานุกรมของคำทั้งสองนี้ใกล้เคียงกัน:
แต่วิธีที่ใช้ในวิทยาการคอมพิวเตอร์และการเขียนโปรแกรมนั้นแตกต่างกันมาก นี่คือการตีความของฉัน:
ดังนั้นฉันหมายถึงอะไรโดยนิยามข้างต้น?
ฉันจะชี้แจงด้วยการเปรียบเทียบโลกแห่งความจริง สมมติว่าคุณต้องทำภารกิจสำคัญ 2 อย่างในหนึ่งวัน:
ตอนนี้ปัญหาคือภารกิจที่ 1 ต้องการให้คุณไปที่ที่ทำการราชการที่ทำให้คุณต้องรอ 4 ชั่วโมงติดต่อกันเพื่อรับหนังสือเดินทาง ในขณะเดียวกันที่สำนักงานของคุณต้องการ task-2 และเป็นงานที่สำคัญ ทั้งสองจะต้องเสร็จในวันที่กำหนด
โดยปกติแล้วคุณจะขับรถไปที่สำนักงานพาสปอร์ต 2 ชั่วโมงรอเข้าแถว 4 ชั่วโมงทำงานให้เสร็จขับรถกลับไปสองชั่วโมงกลับบ้านกลับบ้านตื่นตัวอีก 5 ชั่วโมงและทำการนำเสนอให้เสร็จ
แต่คุณฉลาด คุณวางแผนล่วงหน้า คุณพกแล็ปท็อปติดตัวไปด้วยและในระหว่างที่รอสายคุณจะเริ่มทำงานนำเสนอ วิธีนี้เมื่อคุณกลับถึงบ้านคุณต้องทำงานเพิ่ม 1 ชั่วโมงแทนที่จะเป็น 5
ในกรณีนี้คุณทำงานทั้งสองอย่างเป็นชิ้น ๆ คุณขัดจังหวะภารกิจหนังสือเดินทางขณะรอสายและทำงานนำเสนอ เมื่อหมายเลขของคุณถูกเรียกคุณขัดจังหวะงานนำเสนอและเปลี่ยนเป็นงานหนังสือเดินทาง การประหยัดเวลานั้นเป็นไปได้เนื่องจากการขัดจังหวะของทั้งสองงาน
พร้อมกัน IMO, สามารถเข้าใจได้เป็นคุณสมบัติ "แยก" ในกรด ธุรกรรมฐานข้อมูลสองรายการจะถูกแยกออกหากการทำธุรกรรมย่อยสามารถทำได้ในแต่ละวิธีและ interleaved ใด ๆ และผลลัพธ์สุดท้ายจะเหมือนกับว่างานสองงานได้ทำตามลำดับ โปรดจำไว้ว่าทั้งหนังสือเดินทางและนำเสนองานคุณเป็นเพชฌฆาต แต่เพียงผู้เดียว
ตอนนี้เนื่องจากคุณเป็นคนที่ฉลาดมากคุณเห็นได้ชัดว่าสูงขึ้นและคุณมีผู้ช่วย ดังนั้นก่อนที่คุณจะออกเดินทางเพื่อเริ่มงานหนังสือเดินทางคุณโทรหาเขาและบอกให้เขาเตรียมร่างงานนำเสนอครั้งแรก คุณใช้เวลาตลอดทั้งวันและทำหนังสือเดินทางเสร็จแล้วกลับมาดูอีเมลของคุณและคุณจะพบร่างเอกสารนำเสนอ เขาทำงานได้ค่อนข้างดีและด้วยการแก้ไขในอีก 2 ชั่วโมงคุณก็จบเรื่อง
ตั้งแต่นี้ผู้ช่วยของคุณก็ฉลาดเหมือนคุณเขาสามารถทำงานได้อย่างอิสระโดยไม่จำเป็นต้องขอคำชี้แจงจากคุณตลอดเวลา ดังนั้นเนื่องจาก independentability ของงานที่พวกเขาได้ดำเนินการในเวลาเดียวกันโดยทั้งสองเพชฌฆาตที่แตกต่างกัน
ยังอยู่กับฉัน เอาล่ะ ...
จำงานพาสปอร์ตของคุณที่คุณต้องรอในบรรทัด? เพราะมันเป็นของคุณหนังสือเดินทางผู้ช่วยของคุณไม่สามารถรอในบรรทัดสำหรับคุณ ดังนั้นงานพาสปอร์ตจะมีการขัดจังหวะ (คุณสามารถหยุดมันได้ในขณะที่รออยู่ในสายและกลับมาทำงานต่อเมื่อมีการโทรไปยังหมายเลขของคุณ) แต่ไม่มีความเป็นอิสระ (ผู้ช่วยของคุณไม่สามารถรอแทน)
สมมติว่าหน่วยงานของรัฐมีการตรวจสอบความปลอดภัยเพื่อเข้าสู่สถานที่ ที่นี่คุณต้องลบอุปกรณ์อิเล็กทรอนิกส์ทั้งหมดและส่งไปยังเจ้าหน้าที่และพวกเขาจะส่งคืนอุปกรณ์ของคุณหลังจากที่คุณทำงานเสร็จแล้วเท่านั้น
ในการนี้กรณีงานหนังสือเดินทางจะไม่independentableมิได้Interruptible แม้ว่าคุณจะรอสายคุณไม่สามารถทำงานอย่างอื่นเพราะคุณไม่มีอุปกรณ์ที่จำเป็น
ในทำนองเดียวกันการพูดการนำเสนอนั้นเป็นคณิตศาสตร์อย่างสูงในธรรมชาติที่คุณต้องการสมาธิ 100% เป็นเวลาอย่างน้อย 5 ชั่วโมง คุณไม่สามารถทำได้ในขณะที่รองานพาสปอร์ตแม้ว่าคุณจะมีแล็ปท็อปของคุณ
ในกรณีนี้งานนำเสนอเป็นindependentable (คุณหรือผู้ช่วยของคุณสามารถวางไว้ใน 5 ชั่วโมงของความพยายามที่มุ่งเน้น) แต่ไม่Interruptible
ตอนนี้บอกว่านอกเหนือจากการมอบหมายผู้ช่วยของคุณให้กับงานนำเสนอแล้วคุณยังพกแล็ปท็อปติดตัวไปด้วยเพื่อทำหนังสือเดินทาง ในขณะที่รอแถวคุณจะเห็นว่าผู้ช่วยของคุณสร้างสไลด์ 10 แผ่นแรกในเด็คที่แชร์ คุณส่งความคิดเห็นเกี่ยวกับงานของเขาด้วยการแก้ไขบางอย่าง ต่อมาเมื่อคุณกลับถึงบ้านแทนที่จะใช้เวลา 2 ชั่วโมงในการสรุปร่างคุณต้องใช้เวลา 15 นาที
สิ่งนี้เป็นไปได้เพราะงานนำเสนอมีความเป็นอิสระ (คุณสามารถทำอย่างใดอย่างหนึ่ง) และการขัดจังหวะ (คุณสามารถหยุดมันและกลับมาทำงานต่อได้ในภายหลัง) ดังนั้นคุณจึงทำงานทั้งสองอย่างพร้อมกันและดำเนินงานการนำเสนอแบบขนาน
สมมติว่านอกเหนือไปจากระบบราชการมากเกินไปหน่วยงานของรัฐก็เสียหาย ดังนั้นคุณสามารถแสดงบัตรประจำตัวของคุณใส่มันเริ่มรอสายเพื่อให้หมายเลขของคุณถูกเรียกสินบนผู้พิทักษ์และคนอื่นที่จะดำรงตำแหน่งของคุณในบรรทัดแอบออกมาก่อนที่จะเรียกหมายเลขของคุณและรอต่อไป ด้วยตัวคุณเอง
ในกรณีนี้คุณสามารถดำเนินการทั้งหนังสือเดินทางและงานนำเสนอพร้อมกันและขนาน คุณสามารถย่องออกมาและตำแหน่งของคุณจะถูกควบคุมโดยผู้ช่วยของคุณ คุณทั้งคู่สามารถทำงานนำเสนอ ฯลฯ
ในโลกแห่งการคำนวณนี่คือตัวอย่างสถานการณ์โดยทั่วไปของแต่ละกรณี:
หากคุณเห็นว่าทำไม Rob Pike ถึงพูดพร้อมกันดีกว่าคุณต้องเข้าใจว่าเหตุผลนั้นคือ คุณมีงานที่ยาวมากซึ่งมีช่วงเวลารอคอยหลายช่วงเวลาที่คุณรอการดำเนินการจากภายนอกเช่นการอ่านไฟล์ดาวน์โหลดเครือข่าย ในการบรรยายของเขาสิ่งที่เขาพูดคือ“ แยกงานที่ต่อเนื่องกันนาน ๆ นี้ออกมาเพื่อที่คุณจะได้ทำสิ่งที่มีประโยชน์ระหว่างรอ” นั่นคือเหตุผลที่เขาพูดถึงองค์กรต่าง ๆ ด้วยโกเฟอร์ต่าง ๆ
ตอนนี้จุดแข็งของ Go มาจากการทำให้ช่องโหว่นี้ง่ายขึ้นด้วยgo
คำหลักและแชแนล นอกจากนี้ยังมีการสนับสนุนที่ดีเยี่ยมในรันไทม์เพื่อกำหนดตารางเวลาของ goroutines เหล่านี้
แต่โดยพื้นฐานแล้วการเห็นพ้องด้วยกันนั้นดีกว่า
แอปเปิ้ลดีกว่าส้มหรือไม่?
ฉันชอบคำพูดของ Rob Pike: การเห็นพ้องด้วยกันไม่ใช่การขนานกัน (ดีกว่า!) (สไลด์) (คุย)
ร็อบมักจะพูดถึง Go และมักจะตอบคำถามของ Concurrency vs Parallelism ในคำอธิบายด้วยภาพและเข้าใจง่าย! นี่คือบทสรุปสั้น ๆ :
ภารกิจ:มาเขียนคู่มือภาษาที่ล้าสมัยกันเถอะ! ทีละครั้ง!
การเกิดขึ้นพร้อมกัน:มีการแยกย่อยของงานหลายอย่างพร้อมกัน! ตัวอย่างหนึ่ง:
Parallelism:การกำหนดค่าก่อนหน้านี้เกิดขึ้นพร้อมกันหากมี gophers อย่างน้อย 2 ตัวทำงานในเวลาเดียวกันหรือไม่
หากต้องการเพิ่มสิ่งที่ผู้อื่นพูด:
เห็นพ้องด้วยเหมือนมีนักเล่นปาหี่ ไม่ว่ามันจะดูเหมือนว่านักเล่นปาหี่นั้นจะจับ / ขว้างลูกหนึ่งครั้งต่อมือ ความเท่าเทียมคือการมีนักเล่นปาหี่หลายคน
สมมติว่าคุณมีโปรแกรมที่มีสองเธรด โปรแกรมสามารถทำงานได้สองวิธี:
Concurrency Concurrency + parallelism
(Single-Core CPU) (Multi-Core CPU)
___ ___ ___
|th1| |th1|th2|
| | | |___|
|___|___ | |___
|th2| |___|th2|
___|___| ___|___|
|th1| |th1|
|___|___ | |___
|th2| | |th2|
ในทั้งสองกรณีเรามีความพร้อมกันจากข้อเท็จจริงที่ว่าเรามีมากกว่าหนึ่งเธรดที่กำลังทำงานอยู่
ถ้าเรารันโปรแกรมนี้บนคอมพิวเตอร์ที่มีซีพียูแกนเดียวระบบปฏิบัติการจะสลับไปมาระหว่างสองเธรดทำให้เธรดหนึ่งรันพร้อมกัน
หากเรารันโปรแกรมนี้บนคอมพิวเตอร์ที่มีซีพียูแบบมัลติคอร์เราก็จะสามารถรันเธรดทั้งสองแบบขนานกัน - ขนานกันในเวลาเดียวกัน
การทำงานพร้อมกัน:หากมีปัญหาสองข้อหรือมากกว่านั้นได้รับการแก้ไขโดยหน่วยประมวลผลเดียว
Parallelism:หากปัญหาหนึ่งได้รับการแก้ไขโดยโปรเซสเซอร์หลายตัว
ฉันจะพยายามอธิบายด้วยตัวอย่างที่น่าสนใจและเข้าใจง่าย :)
สมมติว่าองค์กรจัดการแข่งขันหมากรุกซึ่งมีผู้เล่น 10 คน ( มีทักษะการเล่นหมากรุกเท่ากัน ) จะท้าทายผู้เล่นหมากรุกระดับมืออาชีพ และเนื่องจากหมากรุกเป็นเกม 1: 1 ดังนั้นผู้จัดงานจึงต้องดำเนินการ 10 เกมอย่างมีประสิทธิภาพเพื่อให้พวกเขาสามารถจบกิจกรรมทั้งหมดได้โดยเร็วที่สุด
หวังว่าสถานการณ์ต่อไปนี้จะอธิบายวิธีดำเนินการ 10 เกมเหล่านี้ได้อย่างง่ายดาย:
1) SERIAL - ให้บอกว่ามืออาชีพเล่นกับแต่ละคนทีละคนนั่นคือเริ่มต้นและจบเกมด้วยคนเดียวแล้วเริ่มเกมถัดไปกับคนต่อไปเรื่อย ๆ ในคำอื่น ๆ พวกเขาตัดสินใจที่จะดำเนินเกมตามลำดับ ดังนั้นหากเกมหนึ่งใช้เวลา 10 นาทีเพื่อให้เสร็จแล้ว 10 เกมจะใช้เวลา 100 นาทีนอกจากนี้สมมติว่าการเปลี่ยนจากเกมหนึ่งเป็นเกมอื่นใช้เวลา 6 วินาทีจากนั้น 10 เกมก็จะเป็น 54 วินาที (ประมาณ 1 นาที)
ดังนั้นกิจกรรมทั้งหมดจะเสร็จสมบูรณ์ประมาณ 101 นาที ( แนวทางที่เลวร้ายที่สุด )
2) CONCURRENT - สมมติว่ามืออาชีพเล่นเทิร์นของเขาและย้ายไปยังผู้เล่นถัดไปดังนั้นผู้เล่นทั้ง 10 คนกำลังเล่นพร้อมกัน แต่ผู้เล่นมืออาชีพไม่ได้อยู่กับคนสองคนในเวลาเดียวเขาเล่นเทิร์นของเขาและย้ายไปยังบุคคลต่อไป ทีนี้สมมติว่าผู้เล่นมืออาชีพใช้เวลา 6 วินาทีในการเล่นเทิร์นของเขาและเวลาการเปลี่ยนแปลงของผู้เล่นมืออาชีพ b / w ผู้เล่นสองคนคือ 6 วินาทีดังนั้นเวลาการเปลี่ยนภาพทั้งหมดเพื่อกลับไปยังผู้เล่นคนแรกคือ 1 นาที (10x6 วินาที) ดังนั้นตามเวลาที่เขากลับไปเป็นคนแรกด้วยซึ่งเหตุการณ์เริ่มต้นแล้ว 2 นาทีได้ผ่านไปแล้ว (10xtime_per_turn_by_champion + 10xtransition_time = 2 นาที)
สมมติว่าผู้เล่นทุกคนใช้เวลา 45 วินาทีในการเลี้ยวจนจบโดยอิงจาก 10 นาทีต่อเกมจากการแข่งขัน SERIAL หมายเลข ของรอบก่อนที่เกมจะจบ 600 / (45 + 6) = 11 รอบ (โดยประมาณ)
ดังนั้นเหตุการณ์ทั้งหมดจะเสร็จสิ้นในประมาณ 11xtime_per_turn_by_player _ & _ Champion + 11xtransition_time_across_10_players = 11x51 + 11x60sec = 561 + 660 = 1221sec = 20.35mins (โดยประมาณ)
ดูการปรับปรุงจาก 101 นาทีถึง 20.35 นาที ( แนวทางที่ดีกว่า )
3) PARALLEL - ให้ผู้จัดงานได้รับเงินพิเศษจึงตัดสินใจเชิญผู้เล่นมืออาชีพสองคน (ทั้งสองคนมีความสามารถเท่ากัน) และแบ่งผู้เล่น 10 คน (ผู้ท้าทาย) ในกลุ่มละ 5 คนและมอบหมายให้พวกเขาสองคนเช่น กลุ่มละ ตอนนี้เหตุการณ์กำลังดำเนินไปพร้อม ๆ กันในสองชุดนี้คือผู้เล่นอย่างน้อยสองคน (หนึ่งในแต่ละกลุ่ม) กำลังเล่นกับผู้เล่นมืออาชีพสองคนในกลุ่มของตน
อย่างไรก็ตามภายในกลุ่มผู้เล่นมืออาชีพที่มีผู้เล่นหนึ่งคนต่อครั้ง (เช่นเรียงตามลำดับ) ดังนั้นโดยไม่มีการคำนวณใด ๆ คุณสามารถอนุมานได้ว่าเหตุการณ์ทั้งหมดจะเสร็จสมบูรณ์โดยประมาณใน 101/2 = 50.5mins
ดูการปรับปรุงจาก 101 นาทีถึง 50.5 นาที ( แนวทางที่ดี )
4) CONCURRENT + PARALLEL - ในสถานการณ์สมมติข้างต้นสมมติว่าผู้เล่นแชมเปี้ยนสองคนจะเล่นพร้อมกัน (อ่านจุดที่ 2) กับผู้เล่น 5 คนในกลุ่มของตนดังนั้นตอนนี้เกมในกลุ่มต่าง ๆ กำลังวิ่งขนานกัน แต่ภายในกลุ่มที่พวกเขากำลังวิ่งพร้อมกัน
ดังนั้นเกมในกลุ่มหนึ่งจะเสร็จสมบูรณ์โดยประมาณใน 11xtime_per_turn_by_player _ & _ Champion + 11xtransition_time_across_5_players = 11x51 + 11x30 = 600 + 330 = 930sec = 15.5mins (โดยประมาณ)
ดังนั้นเหตุการณ์ทั้งหมด (เกี่ยวข้องกับกลุ่มการวิ่งแบบขนานสองกลุ่ม) จะเสร็จสมบูรณ์ในเวลาประมาณ 15.5 นาที
ดูการปรับปรุงจาก 101 นาทีถึง 15.5 นาที ( แนวทางที่ดีที่สุด )
หมายเหตุ:ในสถานการณ์ข้างต้นหากคุณแทนที่ผู้เล่น 10 คนด้วยงานที่คล้ายกัน 10 รายการและผู้เล่นมืออาชีพสองคนที่มีแกนประมวลผลสองตัวจากนั้นอีกครั้งลำดับต่อไปนี้จะยังคงเป็นจริง:
SERIAL> PARALLEL> CONCURRENT> CONCURRENT + PARALLEL
(หมายเหตุ: คำสั่งซื้อนี้อาจมีการเปลี่ยนแปลงสำหรับสถานการณ์อื่น ๆ เนื่องจากการสั่งซื้อนี้ขึ้นอยู่กับการพึ่งพาระหว่างงานการสื่อสารต้องการงาน b / w และงานการเปลี่ยนแปลงค่าโสหุ้ย b / w)
ตัวอย่างง่ายๆ:
พร้อมกันคือ: "สองคิวที่เข้าถึงเครื่อง ATM หนึ่งเครื่อง"
Parallel คือ: "สองคิวและ ATM สองเครื่อง"
ลองนึกภาพการเรียนรู้ภาษาการเขียนโปรแกรมใหม่โดยดูวิดีโอการสอน คุณต้องหยุดวิดีโอชั่วคราวนำสิ่งที่พูดในรหัสไปใช้แล้วดูต่อ นั่นคือการทำงานพร้อมกัน
ตอนนี้คุณเป็นโปรแกรมเมอร์มืออาชีพแล้ว และคุณเพลิดเพลินไปกับการฟังเพลงสงบขณะเข้ารหัส นั่นคือความเท่าเทียม
ดังที่ Andrew Gerrand กล่าวในบล็อกของ GoLang
การเกิดขึ้นพร้อมกันนั้นเกี่ยวกับการจัดการกับสิ่งต่าง ๆ มากมายในคราวเดียว ความเท่าเทียมเป็นเรื่องเกี่ยวกับการทำสิ่งต่าง ๆ มากมายในครั้งเดียว
สนุก.
พวกเขาแก้ปัญหาต่าง ๆ การทำงานพร้อมกันแก้ปัญหาการขาดแคลนทรัพยากร CPU และงานมากมาย ดังนั้นคุณจึงสร้างเธรดหรือเส้นทางอิสระของการดำเนินการผ่านรหัสเพื่อแบ่งปันเวลาในทรัพยากรที่หายาก จนกระทั่งเมื่อไม่นานมานี้การเห็นพ้องด้วยได้ครอบงำการอภิปรายเนื่องจากความพร้อมใช้งานของ CPU
Parallelism แก้ปัญหาในการค้นหางานที่เพียงพอและงานที่เหมาะสม (งานที่สามารถแยกออกจากกันได้อย่างถูกต้อง) และแจกจ่ายให้กับทรัพยากร CPU ที่มีอยู่มากมาย การขนานกันอยู่เสมอแน่นอน แต่มันมาถึงแถวหน้าเพราะโปรเซสเซอร์แบบ multi-core ราคาถูกมาก
concurency: การดำเนินการหลายขั้นตอนพร้อมศักยภาพในการแบ่งปันทรัพยากร
เช่นสองเธรดที่แย่งชิงพอร์ต I / O
อัมพาต: แยกปัญหาในหลายชิ้นที่คล้ายกัน
เช่นการแยกไฟล์ขนาดใหญ่โดยการรันสองกระบวนการในทุก ๆ ครึ่งของไฟล์
การดำเนินการโปรแกรมพร้อมกันมี 2 ประเภท: การเขียนโปรแกรมพร้อมกันที่ไม่ขนานและการเขียนโปรแกรมพร้อมกันขนาน (หรือที่เรียกว่าขนาน)
ความแตกต่างที่สำคัญคือในสายตามนุษย์กระทู้ที่เกิดขึ้นพร้อมกันที่ไม่ขนานกันดูเหมือนจะทำงานพร้อมกัน แต่ในความเป็นจริงพวกเขาไม่ได้ทำ ในเธรดที่เกิดขึ้นพร้อมกันแบบไม่ขนานจะสลับและสลับกันเพื่อใช้โปรเซสเซอร์ผ่านการแบ่งเวลา ในขณะที่ในแบบคู่ขนานมีตัวประมวลผลหลายตัวดังนั้นเธรดหลายตัวสามารถรันบนตัวประมวลผลที่แตกต่างกันในเวลาเดียวกัน
การอ้างอิง: บทนำสู่การเกิดขึ้นพร้อมกันในภาษาการเขียนโปรแกรม
ขนานคือการดำเนินการพร้อมกันของกระบวนการในหรือmultiple cores per CPU
multiple CPUs (on a single motherboard)
การเกิดขึ้นพร้อมกันคือเมื่อParallelismสามารถทำได้บน a single core/CPU
โดยใช้อัลกอริทึมการจัดกำหนดการที่แบ่งเวลาของ CPU (time-slice) กระบวนการถูกอินเตอร์ลีฟ
หน่วย:
- 1 คอร์หรือหลายคอร์ในซีพียูเดียว(โปรเซสเซอร์ที่ทันสมัยในยุคปัจจุบัน)
- CPU 1 ตัวหรือหลายตัวบนเมนบอร์ด(คิดว่าเซิร์ฟเวอร์ของโรงเรียนเก่า)
- 1 แอปพลิเคชันคือ 1 โปรแกรม(คิดว่าเบราว์เซอร์ Chrome)
- 1 โปรแกรมสามารถมี 1 หรือหลายกระบวนการ(คิดว่าแต่ละแท็บเบราว์เซอร์ Chrome เป็นกระบวนการ)
- 1 กระบวนการสามารถมี 1 หรือหลายเธรดจาก 1 โปรแกรม(แท็บ Chrome ที่เล่นวิดีโอ Youtube ใน 1 เธรด, เธรดอื่นวางไข่สำหรับส่วนความคิดเห็น, อีกโพสต์สำหรับผู้ใช้ข้อมูลเข้าสู่ระบบ)
- ดังนั้น 1 โปรแกรมสามารถมี 1 หรือหลายเธรดของการดำเนินการ
- 1 กระบวนการคือ
thread(s)+allocated memory resources by OS
(heap, register, stack, memory memory)
Concurrency => เมื่องานหลายอย่างถูกดำเนินการในช่วงเวลาที่ทับซ้อนกันด้วยทรัพยากรที่ใช้ร่วมกัน (อาจเป็นการใช้ทรัพยากรให้เกิดประโยชน์สูงสุด)
Parallel => เมื่องานเดี่ยวถูกแบ่งออกเป็นหลายภารกิจย่อยอิสระที่สามารถดำเนินการได้พร้อมกัน
คิดว่าเป็นบริการคิวที่เซิร์ฟเวอร์สามารถให้บริการงานที่ 1 ในคิวเท่านั้น
1 เซิร์ฟเวอร์, 1 คิวงาน (มี 5 งาน) -> ไม่มีการทำงานพร้อมกัน, ไม่ขนานกัน (มีงานเพียงงานเดียวเท่านั้นที่จะเสร็จสิ้น, งานถัดไปในคิวต้องรอจนกว่างานบริการจะเสร็จสิ้นและไม่มีเซิร์ฟเวอร์อื่นที่จะ บริการมัน)
1 เซิร์ฟเวอร์ 2 หรือมากกว่าคิวที่แตกต่างกัน (ที่มี 5 งานต่อคิว) -> การทำงานพร้อมกัน (เนื่องจากเซิร์ฟเวอร์กำลังแบ่งปันเวลากับงานที่ 1 ทั้งหมดในคิวไม่เท่ากันหรือมีน้ำหนัก) ยังไม่มีการขนานกันตั้งแต่ในทันทีมีเพียงหนึ่งเดียวเท่านั้น งานบริการ
2 เซิร์ฟเวอร์ขึ้นไปหนึ่งคิว -> ขนาน (2 งานเสร็จในเวลาเดียวกัน) แต่ไม่มีการทำงานพร้อมกัน (เซิร์ฟเวอร์ไม่แชร์เวลางานที่ 3 ต้องรอจนกว่าเซิร์ฟเวอร์จะเสร็จสมบูรณ์)
2 เซิร์ฟเวอร์ขึ้นไป, 2 หรือมากกว่าคิวที่แตกต่างกัน -> การทำงานพร้อมกันและขนาน
กล่าวอีกนัยหนึ่งการใช้งานพร้อมกันคือการแบ่งปันเวลาเพื่อทำงานให้เสร็จสมบูรณ์อาจต้องใช้เวลาในการทำงานให้เสร็จ แต่อย่างน้อยก็จะเริ่มเร็วขึ้น สิ่งสำคัญคืองานสามารถแบ่งเป็นงานขนาดเล็กซึ่งช่วยให้การแทรกซึม
ความขนานนั้นเกิดขึ้นได้ด้วย CPU, เซิร์ฟเวอร์, ผู้คนและอื่น ๆ ที่ทำงานแบบขนานมากขึ้น
โปรดจำไว้ว่าหากมีการแบ่งปันทรัพยากรความเท่าเทียมกันอย่างแท้จริงนั้นไม่สามารถทำได้ แต่นี่คือสิ่งที่การใช้งานพร้อมกันจะเป็นการใช้งานได้จริงที่ดีที่สุดโดยรับงานใหม่ที่ไม่ต้องการทรัพยากรนั้น
ฉันจะเสนอคำตอบที่ขัดแย้งกับคำตอบยอดนิยมบางส่วนที่นี่ ในความคิดของฉันเห็นพ้องด้วยเป็นคำทั่วไปที่มีความเท่าเทียม การเกิดขึ้นพร้อมกันนำไปใช้กับสถานการณ์ใด ๆ ที่มีงานที่แตกต่างหรือหน่วยของงานทับซ้อนกันในเวลา ความเท่าเทียมใช้กับสถานการณ์ที่หน่วยการทำงานที่แตกต่างกันได้รับการประเมิน / ดำเนินการในเวลาเดียวกัน raison d'etre of parallelism กำลังเร่งซอฟต์แวร์ที่สามารถได้รับประโยชน์จากทรัพยากรการคำนวณทางกายภาพที่หลากหลาย แนวคิดหลักอื่น ๆ ที่เหมาะสมภายใต้ภาวะพร้อมกันคือการโต้ตอบ การติดต่อสื่อสารใช้เมื่อการซ้อนทับของงานสามารถสังเกตได้จากโลกภายนอก สาเหตุของการโต้ตอบคือการสร้างซอฟต์แวร์ที่ตอบสนองต่อโลกแห่งความเป็นจริงเช่นผู้ใช้เครือข่ายเพื่อนอุปกรณ์ต่อพ่วงฮาร์ดแวร์เป็นต้น
ความเท่าเทียมและการโต้ตอบเป็นมิติที่เกิดขึ้นพร้อมกันเกือบทั้งหมด สำหรับนักพัฒนาโครงการบางคนอาจสนใจทั้งสองอย่างหรือไม่ก็ได้ พวกเขามีแนวโน้มที่จะได้รับ conflated ไม่น้อยเพราะสิ่งที่น่ารังเกียจที่เป็นหัวข้อให้ดั้งเดิมที่สะดวกพอสมควรที่จะทำทั้งสองอย่าง
รายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับการขนาน :
ความขนานมีอยู่ในเครื่องชั่งขนาดเล็กมาก (เช่นการขนานระดับการเรียนการสอนในโปรเซสเซอร์) เครื่องชั่งกลาง (เช่นเครื่องมัลติคอร์โปรเซสเซอร์) และเครื่องชั่งขนาดใหญ่ (เช่นคลัสเตอร์การคำนวณประสิทธิภาพสูง) แรงกดดันให้นักพัฒนาซอฟต์แวร์ต้องเปิดเผยความขนานในระดับเธรดมากขึ้นในช่วงไม่กี่ปีที่ผ่านมาเนื่องจากการเติบโตของโปรเซสเซอร์แบบมัลติคอร์ ความเท่าเทียมนั้นเชื่อมโยงอย่างใกล้ชิดกับแนวคิดเรื่องการพึ่งพาอาศัยกัน การพึ่งพาอาศัยกัน จำกัด ขอบเขตของความเท่าเทียมซึ่งสามารถทำได้ ไม่สามารถดำเนินการสองงานในแบบขนานได้หากงานหนึ่งขึ้นอยู่กับงานอื่น (ไม่สนใจการเก็งกำไร)
มีรูปแบบและกรอบการทำงานจำนวนมากที่โปรแกรมเมอร์ใช้เพื่อแสดงความขนาน: ไพพ์ไลน์, พูลงาน, การดำเนินการรวมบนโครงสร้างข้อมูล ("อาร์เรย์ขนาน")
รายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับการโต้ตอบ :
วิธีพื้นฐานและทั่วไปที่สุดในการโต้ตอบคือกับเหตุการณ์ (เช่นวนรอบเหตุการณ์และตัวจัดการ / การเรียกกลับ) สำหรับเหตุการณ์งานง่าย ๆ ที่ยอดเยี่ยม พยายามทำงานที่ซับซ้อนมากขึ้นกับเหตุการณ์ที่เกิดขึ้นเป็นกอง ripping (aka นรกโทรกลับ; ควบคุม aka กลับกัน) เมื่อคุณเบื่อกับเหตุการณ์ต่าง ๆ คุณสามารถลองสิ่งแปลกใหม่เช่นเครื่องกำเนิดไฟฟ้า Coroutines (aka Async / Await) หรือเธรดที่ทำงานร่วมกัน
สำหรับความรักของซอฟต์แวร์ที่เชื่อถือได้โปรดอย่าใช้เธรดถ้าสิ่งที่คุณต้องการคือการโต้ตอบ
Curmudgeonliness
ฉันไม่ชอบ "การเห็นพ้องด้วยกันของ Rob Pike ไม่ใช่การขนานกันมันดีกว่า" คำขวัญ การเกิดขึ้นพร้อมกันนั้นไม่ดีหรือแย่ไปกว่าการขนานกัน การเห็นพ้องด้วยรวมถึงการโต้ตอบที่ไม่สามารถเปรียบเทียบได้ในทางที่ดีขึ้น / แย่ลงด้วยความเท่าเทียม มันเหมือนกับว่า "การควบคุมการไหลดีกว่าข้อมูล"
ในอิเล็กทรอนิคส์อนุกรมและขนานแสดงประเภทของโทโพโลยีสถิตการพิจารณาพฤติกรรมที่แท้จริงของวงจร เมื่อไม่มีการเกิดขึ้นพร้อมกันขนานจะกำหนดขึ้น
เพื่อที่จะอธิบายแบบไดนามิกปรากฏการณ์ที่เกี่ยวกับเวลาเราใช้คำตามลำดับและพร้อมกัน ตัวอย่างเช่นผลลัพธ์บางอย่างอาจได้รับผ่านลำดับงานบางอย่าง(เช่นสูตรอาหาร) เมื่อเรากำลังพูดคุยกับใครบางคนเรากำลังผลิตคำลำดับ อย่างไรก็ตามในความเป็นจริงกระบวนการอื่น ๆ เกิดขึ้นในช่วงเวลาเดียวกันดังนั้นจึงสอดคล้องกับผลลัพธ์ที่แท้จริงของการกระทำบางอย่าง หากผู้คนจำนวนมากกำลังพูดคุยกันในเวลาเดียวกันการเจรจาพร้อมกันอาจรบกวนลำดับของเรา แต่ผลลัพธ์ของการแทรกแซงนี้ไม่เป็นที่ทราบล่วงหน้า การเกิดพร้อมกันแนะนำการกำหนดไม่ได้
ตัวละครอนุกรม / ขนานและลำดับ / พร้อมกันเป็นฉาก ตัวอย่างนี้อยู่ในการสื่อสารแบบดิจิตอล ในอะแดปเตอร์อนุกรมข้อความดิจิตอลจะถูกกระจายชั่วคราว (เช่นเรียงตามลำดับ ) กระจายไปตามสายการสื่อสารเดียวกัน (เช่นสายเดียว) ในอะแดปเตอร์แบบขนานสิ่งนี้จะถูกแบ่งออกเช่นกันบนสายการสื่อสารแบบขนาน (เช่นสายจำนวนมาก) จากนั้นสร้างขึ้นใหม่ที่ปลายสาย
ให้เราวาดภาพเกมกับเด็ก ๆ 9 คน หากเราทิ้งพวกเขาเป็นลูกโซ่ให้ส่งข้อความในตอนแรกและรับมันในตอนท้ายเราจะมีการสื่อสารแบบอนุกรม คำเพิ่มเติมเขียนข้อความประกอบด้วยลำดับของการสื่อสารที่เป็นหนึ่งเดียวกัน
I like ice-cream so much. > X > X > X > X > X > X > X > X > X > ....
นี่คือขั้นตอนตามลำดับทำซ้ำบนโครงสร้างพื้นฐานแบบอนุกรม
ตอนนี้ให้เรานึกภาพเพื่อแบ่งเด็ก ๆ เป็นกลุ่มที่ 3 เราแบ่งวลีออกเป็นสามส่วนให้เด็กคนแรกของบรรทัดที่อยู่ทางซ้ายของเราลูกคนที่สองถึงเส้นกึ่งกลาง ฯลฯ
I like ice-cream so much. > I like > X > X > X > .... > ....
> ice-cream > X > X > X > ....
> so much > X > X > X > ....
นี่เป็นกระบวนการต่อเนื่องที่ทำซ้ำบนโครงสร้างพื้นฐานแบบขนาน (ยังคงเป็นอนุกรมบางส่วนแม้ว่า)
ในทั้งสองกรณีสมมติว่ามีการสื่อสารที่สมบูรณ์แบบระหว่างเด็กผลลัพธ์จะถูกกำหนดล่วงหน้า
หากมีบุคคลอื่นที่พูดคุยกับลูกคนแรกในเวลาเดียวกับคุณแล้วเราจะมีกระบวนการที่เกิดขึ้นพร้อมกัน เราไม่ทราบว่าจะพิจารณาโครงสร้างพื้นฐานของกระบวนการใดดังนั้นผลลัพธ์สุดท้ายจะไม่ได้รับการพิจารณาล่วงหน้า
การเกิดขึ้นพร้อมกันเป็นรูปแบบทั่วไปของการขนาน ตัวอย่างเช่นโปรแกรมแบบขนานสามารถเรียกว่าทำงานพร้อมกันได้ แต่การย้อนกลับไม่เป็นความจริง
สามารถดำเนินการพร้อมกันได้ในโปรเซสเซอร์เดียว (หลายเธรดจัดการโดยตัวกำหนดตารางเวลาหรือเธรดพูล)
ไม่สามารถทำการประมวลผลแบบขนานบนโปรเซสเซอร์เดี่ยว แต่ใช้โปรเซสเซอร์หลายตัวได้ (หนึ่งกระบวนการต่อโปรเซสเซอร์)
การคำนวณแบบกระจายยังเป็นหัวข้อที่เกี่ยวข้องและสามารถเรียกว่าการคำนวณแบบพร้อมกัน แต่การย้อนกลับไม่เป็นความจริงเช่นการขนาน
สำหรับรายละเอียดอ่านบทความวิจัย แนวคิดการเขียนโปรแกรมพร้อมกัน
ฉันชอบการแสดงกราฟิกนี้จากคำตอบอื่น - ฉันคิดว่ามันตอบคำถามได้ดีกว่าคำตอบข้างต้นมากมาย
Parallelism vs Concurrency เมื่อเธรดสองเธรดรันพร้อมกันเธรดทั้งสองจะรันพร้อมกัน ตัวอย่างเช่นถ้าเรามีสองเธรด A และ B ดังนั้นการประมวลผลแบบขนานจะมีลักษณะดังนี้:
CPU 1: A ------------------------->
CPU 2: B ------------------------->
เมื่อสองเธรดกำลังทำงานพร้อมกันการดำเนินการของพวกเขาซ้อนทับกัน การทับซ้อนกันสามารถเกิดขึ้นได้สองวิธี: เธรดกำลังทำงานในเวลาเดียวกัน (เช่นขนาน, ด้านบน), หรือการประมวลผลกำลังถูกอินเตอร์ลีฟบนโปรเซสเซอร์เช่น:
CPU 1: A -----------> B ----------> A -----------> B -------- ->
ดังนั้นเพื่อจุดประสงค์ของเราการขนานกันสามารถถือเป็นกรณีพิเศษของการเกิดพร้อมกัน
ที่มา: คำตอบอื่นที่นี่
หวังว่าจะช่วย
ฉันชอบคำตอบของ Paul Butcher สำหรับคำถามนี้ (เขาเป็นนักเขียนของSeven Concurrency Models ในเจ็ดสัปดาห์ ):
แม้ว่าพวกเขาจะสับสนบ่อยครั้งการขนานและการเกิดพร้อมกันเป็นสิ่งที่แตกต่างกัน พร้อมกันคือเป็นลักษณะของปัญหาโดเมนความต้องการรหัสด์ของคุณที่จะจัดการกับหลายพร้อมกัน (หรือใกล้พร้อมกัน) กิจกรรม ในทางตรงกันข้าม Parallelism เป็นส่วนหนึ่งของโดเมนโซลูชัน - คุณต้องการให้โปรแกรมของคุณทำงานได้เร็วขึ้นโดยการประมวลผลส่วนต่าง ๆ ของปัญหาแบบขนานวิธีการบางอย่างสามารถนำไปใช้กับการเกิดพร้อมกัน, เพื่อการขนานและบางอย่างเพื่อทั้งสอง ทำความเข้าใจกับสิ่งที่คุณเผชิญและเลือกเครื่องมือที่เหมาะสมสำหรับงาน
การทำงานพร้อมกันสามารถเกี่ยวข้องกับงานที่รันพร้อมกันหรือไม่ (สามารถทำงานได้ในโปรเซสเซอร์ / คอร์แยกกัน แต่สามารถรันได้ใน "เห็บ") สิ่งที่สำคัญคือการเห็นพ้องด้วยเสมอหมายถึงการทำงานชิ้นหนึ่งที่ยิ่งใหญ่กว่าการทำชิ้นส่วนของงานที่มากขึ้นอย่างใดอย่างหนึ่งโดยพื้นฐานแล้วมันเป็นส่วนหนึ่งของการคำนวณ คุณต้องฉลาดเกี่ยวกับสิ่งที่คุณสามารถทำได้พร้อมกันและสิ่งที่ไม่ควรทำและวิธีการซิงโครไนซ์
ความเท่าเทียมหมายถึงคุณกำลังทำบางสิ่งพร้อมกัน พวกเขาไม่จำเป็นต้องเป็นส่วนหนึ่งของการแก้ปัญหาเดียว ตัวอย่างเช่นเธรดของคุณสามารถแก้ปัญหาเดียวได้ แน่นอนว่าสิ่งที่ใช้ในการซิงโครไนซ์ยังมี แต่ในมุมมองที่ต่างกัน
"Concurrency" คือเมื่อมีหลายสิ่งที่กำลังดำเนินการอยู่
"ความเท่าเทียม" คือเมื่อสิ่งที่มีความคืบหน้าพร้อมกันในเวลาเดียวกัน
ตัวอย่างของการเกิดพร้อมกันโดยไม่มีการขนาน:
SqlDataReader
บนการเชื่อมต่อMARSอย่างไรก็ตามโปรดสังเกตว่าความแตกต่างระหว่างการเกิดพร้อมกันและความเท่าเทียมมักเป็นเรื่องของมุมมอง ตัวอย่างข้างต้นไม่ได้ขนานกันจากมุมมองของ (เอฟเฟ็กต์ที่สังเกตได้) ที่รันโค้ดของคุณ แต่มีความเท่าเทียมในระดับคำสั่งแม้ในแกนเดียว มีชิ้นส่วนของฮาร์ดแวร์ที่ทำสิ่งต่าง ๆ ควบคู่กับ CPU และขัดจังหวะ CPU เมื่อเสร็จสิ้น GPU อาจกำลังวาดไปที่หน้าจอในขณะที่คุณกำลังดำเนินการตามขั้นตอนหน้าต่างหรือตัวจัดการเหตุการณ์ DBMS สามารถข้าม B-Trees สำหรับการสืบค้นถัดไปในขณะที่คุณยังดึงผลลัพธ์ของการสืบค้นก่อนหน้า เบราว์เซอร์อาจกำลังทำรูปแบบหรือระบบเครือข่ายในขณะที่คุณPromise.resolve()
กำลังดำเนินการ ฯลฯ
ดังนั้นคุณไป โลกจะยุ่งเหยิงเหมือนเคย;)
วิธีที่ง่ายที่สุดและสง่างามที่สุดในการทำความเข้าใจทั้งสองในความคิดเห็นของฉันคือ การเกิดขึ้นพร้อมกันช่วยให้การดำเนินการ interleaving และสามารถให้ภาพลวงตาของการขนาน ซึ่งหมายความว่าระบบที่ทำงานพร้อมกันสามารถเรียกใช้วิดีโอ Youtube ของคุณพร้อมกับคุณเขียนเอกสารใน Word ได้ ระบบปฏิบัติการพื้นฐานซึ่งเป็นระบบที่เกิดขึ้นพร้อมกันทำให้งานเหล่านั้นสามารถดำเนินการได้ เนื่องจากคอมพิวเตอร์ดำเนินการตามคำแนะนำอย่างรวดเร็วสิ่งนี้จะทำให้การปรากฏตัวของสองสิ่งพร้อมกัน
ความเท่าเทียมคือเมื่อสิ่งต่าง ๆ เช่นนี้เป็นจริงขนานกันจริง ๆ ในตัวอย่างข้างต้นคุณอาจพบว่ารหัสการประมวลผลวิดีโอถูกประมวลผลบนแกนเดียวและแอปพลิเคชัน Word กำลังทำงานบนอีกแกนหนึ่ง โปรดทราบว่านี่หมายความว่าโปรแกรมที่ทำงานพร้อมกันสามารถอยู่ในแบบขนาน! การจัดโครงสร้างแอปพลิเคชันของคุณด้วยเธรดและกระบวนการช่วยให้โปรแกรมของคุณใช้ประโยชน์จากฮาร์ดแวร์ที่มีอยู่และอาจทำควบคู่กัน
ทำไมไม่มีทุกอย่างขนานกันไปเลย? เหตุผลหนึ่งก็เพราะว่าการเห็นพ้องต้องกันเป็นวิธีการสร้างโปรแกรมและเป็นการตัดสินใจออกแบบเพื่อช่วยให้แยกความกังวลออกจากกันในขณะที่การขนานมักใช้ในชื่อของประสิทธิภาพ อีกประการหนึ่งคือบางสิ่งพื้นฐานไม่สามารถทำแบบขนานได้อย่างสมบูรณ์ ตัวอย่างนี้จะเพิ่มสองสิ่งเข้ากับด้านหลังของคิว - คุณไม่สามารถแทรกทั้งสองอย่างในเวลาเดียวกัน สิ่งที่ต้องทำก่อนและอื่น ๆ ที่อยู่ข้างหลังหรืออื่น ๆ ที่คุณทำให้ยุ่งเหยิงคิว แม้ว่าเราสามารถแทรกการดำเนินการดังกล่าว (และเพื่อให้เราได้รับพร้อมกัน) คุณไม่สามารถขนานกันได้
หวังว่านี่จะช่วยได้!
การเขียนโปรแกรมพร้อมกันเกี่ยวกับการดำเนินการที่ดูเหมือนจะทับซ้อนและเกี่ยวข้องกับความซับซ้อนที่เกิดขึ้นเนื่องจากการควบคุมการไหลที่ไม่ได้กำหนดไว้ล่วงหน้า ค่าใช้จ่ายเชิงปริมาณที่เกี่ยวข้องกับโปรแกรมที่เกิดขึ้นพร้อมกันมักจะมีทั้งปริมาณงานและเวลาแฝง โปรแกรมที่เกิดขึ้นพร้อมกันมักจะถูกผูกไว้กับ IO แต่ไม่เสมอไปเช่นตัวรวบรวมขยะที่เกิดขึ้นพร้อมกันนั้นเป็นแบบ on-CPU ทั้งหมด ตัวอย่างการสอนของโปรแกรมที่ทำงานพร้อมกันคือโปรแกรมรวบรวมข้อมูลเว็บ โปรแกรมนี้เริ่มต้นการร้องขอสำหรับหน้าเว็บและยอมรับคำตอบพร้อมกันเมื่อผลลัพธ์ของการดาวน์โหลดพร้อมใช้งานสะสมชุดของหน้าเว็บที่เคยเข้าชมแล้ว โฟลว์การควบคุมนั้นไม่สามารถกำหนดได้เนื่องจากการตอบสนองนั้นไม่จำเป็นต้องได้รับในลำดับเดียวกันทุกครั้งที่มีการรันโปรแกรม คุณลักษณะนี้สามารถทำให้ยากมากในการดีบักโปรแกรมที่เกิดขึ้นพร้อมกัน แอปพลิเคชั่นบางตัวทำงานพร้อมกันโดยพื้นฐานเช่นเว็บเซิร์ฟเวอร์ต้องจัดการการเชื่อมต่อลูกค้าพร้อมกัน บางทีอาจจะเป็นภาษาที่กำลังจะมาถึง Erlang สำหรับการเขียนโปรแกรมพร้อมกันสูง
การเขียนโปรแกรมแบบขนานเกี่ยวข้องกับการดำเนินการที่มีการทับซ้อนกันเพื่อเป้าหมายเฉพาะในการปรับปรุงปริมาณงาน ความยากลำบากในการเขียนโปรแกรมพร้อมกันจะหลีกเลี่ยงได้โดยการควบคุมการไหลของการกำหนด โดยทั่วไปแล้วโปรแกรมจะวางชุดของภารกิจลูกที่ทำงานในแบบคู่ขนานและภารกิจหลักจะดำเนินต่อเมื่อทุกภารกิจย่อยเสร็จสิ้นแล้ว สิ่งนี้ทำให้โปรแกรมแบบขนานง่ายขึ้นในการดีบัก ส่วนที่ยากของการเขียนโปรแกรมแบบขนานคือการเพิ่มประสิทธิภาพการปฏิบัติงานด้วยความเคารพในประเด็นต่าง ๆ เช่นความละเอียดและการสื่อสาร หลังยังคงเป็นปัญหาในบริบทของมัลติคอร์เนื่องจากมีค่าใช้จ่ายจำนวนมากที่เกี่ยวข้องกับการถ่ายโอนข้อมูลจากแคชหนึ่งไปยังอีก เมทริกซ์หนาแน่นเมทริกซ์ทวีคูณเป็นตัวอย่างการสอนของการเขียนโปรแกรมแบบขนานและสามารถแก้ไขได้อย่างมีประสิทธิภาพโดยใช้ Straasen ' อัลกอริทึมการหารและการพิชิตและการโจมตีปัญหาย่อยในแบบคู่ขนาน Cilk อาจเป็นภาษาที่มีแนวโน้มมากที่สุดสำหรับการเขียนโปรแกรมแบบขนานที่มีประสิทธิภาพสูงบนคอมพิวเตอร์หน่วยความจำที่ใช้ร่วมกัน (รวมถึงมัลติคอร์)
คัดลอกมาจากคำตอบของฉัน: https://stackoverflow.com/a/3982782
Parallelism: การมีหลายเธรดทำหน้าที่คล้ายกันซึ่งเป็นอิสระจากกันในแง่ของข้อมูลและทรัพยากรที่พวกเขาต้องการ เช่นโปรแกรมรวบรวมข้อมูลของ Google สามารถวางไข่ได้หลายพันเธรดและแต่ละเธรดสามารถทำงานได้อย่างอิสระ
การเกิดขึ้นพร้อมกัน: การ เกิดขึ้นพร้อมกันจะปรากฏในรูปภาพเมื่อคุณแบ่งปันข้อมูลซึ่งเป็นทรัพยากรที่ใช้ร่วมกันในกลุ่ม ในระบบการทำธุรกรรมหมายความว่าคุณต้องซิงโครไนซ์ส่วนสำคัญของรหัสโดยใช้เทคนิคบางอย่างเช่นล็อคเซมาฟอร์ ฯลฯ
(ฉันค่อนข้างประหลาดใจเช่นคำถามพื้นฐานไม่ได้รับการแก้ไขอย่างถูกต้องและเรียบร้อยเป็นเวลาหลายปี ... )
ในระยะสั้นทั้งสองเห็นพ้องและความเท่าเทียมเป็นทรัพย์สินของคอมพิวเตอร์
ความแตกต่างนี่คือคำอธิบายจาก Robert Harper :
สิ่งแรกที่ต้องเข้าใจคือความเท่าเทียมมีอะไรจะทำอย่างไรกับการเห็นพ้องด้วย การเกิดขึ้นพร้อมกันนั้นเกี่ยวข้องกับองค์ประกอบของโปรแกรม (หรือส่วนประกอบ) Parallelism มีความเกี่ยวข้องกับประสิทธิภาพแบบอะซิมโทติคของโปรแกรมที่มีพฤติกรรมที่กำหนดไว้ล่วงหน้า การทำงานพร้อมกันคือทั้งหมดที่เกี่ยวกับการจัดการสิ่งที่ไม่สามารถจัดการได้: เหตุการณ์มาถึงด้วยเหตุผลที่อยู่นอกเหนือการควบคุมของเราและเราต้องตอบสนองต่อเหตุการณ์เหล่านั้น ผู้ใช้คลิกเมาส์ตัวจัดการหน้าต่างต้องตอบสนองแม้ว่าจอแสดงผลต้องการความสนใจ สถานการณ์ดังกล่าวเป็นสิ่งที่ควบคุมไม่ได้โดยเนื้อแท้ แต่เราก็จ้างเช่นกันแบบมืออาชีพลัทธิ nondeterminism ในสภาพแวดล้อมที่กำหนดขึ้นโดยการแสร้งทำเป็นว่าส่วนประกอบส่งสัญญาณเหตุการณ์ตามลำดับที่กำหนดเองและเราต้องตอบสนองต่อเหตุการณ์เหล่านั้นเมื่อเกิดขึ้น องค์ประกอบ Nondeterministic เป็นแนวคิดการจัดโครงสร้างโปรแกรมที่มีประสิทธิภาพ ในทางกลับกัน Parallelism นั้นทั้งหมดเกี่ยวกับการพึ่งพาระหว่าง subcomputations ของการคำนวณที่กำหนดขึ้น ผลลัพธ์ไม่ได้มีข้อสงสัย แต่มีหลายวิธีในการบรรลุผลบางอย่างมีประสิทธิภาพมากกว่าวิธีอื่น เราต้องการที่จะใช้ประโยชน์จากโอกาสเหล่านั้นเพื่อประโยชน์ของเรา
พวกเขาสามารถเรียงลำดับของคุณสมบัติมุมฉากในโปรแกรม อ่านโพสต์บล็อกนี้สำหรับภาพประกอบเพิ่มเติม และอันนี้พูดถึงความแตกต่างเล็กน้อยเกี่ยวกับองค์ประกอบในการเขียนโปรแกรมเช่นเธรด
โปรดทราบว่าการทำเธรดหรือมัลติทาสกิ้งเป็นการใช้งานทั้งหมดของการคำนวณเพื่อตอบสนองวัตถุประสงค์ที่เป็นรูปธรรมมากขึ้น พวกเขาสามารถเกี่ยวข้องกับการขนานและการทำงานพร้อมกัน แต่ไม่ได้อยู่ในวิธีที่จำเป็น ดังนั้นจึงเป็นการยากที่จะเริ่มต้นคำอธิบาย
อีกหนึ่งไฮไลท์: (เวลาจริง) "เวลา" ไม่เกี่ยวกับคุณสมบัติที่กล่าวถึงที่นี่ เวลาเป็นเพียงวิธีการดำเนินการวัดเพื่อแสดงความสำคัญของคุณสมบัติ แต่อยู่ไกลจากสาระสำคัญ ลองนึกถึงบทบาทของ "เวลา" ในความซับซ้อนของเวลาซึ่งมีความคล้ายคลึงกันไม่มากก็น้อยการวัดก็มักจะสำคัญกว่าในกรณีนั้น
"พร้อมกัน" กำลังทำสิ่งต่าง ๆ - ในเวลาเดียวกัน พวกเขาอาจเป็นสิ่งที่แตกต่างหรือสิ่งเดียวกัน แม้จะมีคำตอบที่ยอมรับซึ่งขาดอยู่มันก็ไม่เกี่ยวกับ "ดูเหมือนจะเป็นในเวลาเดียวกัน" มันเป็นจริงในเวลาเดียวกัน คุณต้องมีหลายคอร์ของ CPU ไม่ว่าจะใช้หน่วยความจำที่ใช้ร่วมกันภายในโฮสต์เดียวหรือหน่วยความจำแบบกระจายในโฮสต์ที่แตกต่างกันเพื่อเรียกใช้รหัสที่เกิดขึ้นพร้อมกัน ท่อของ 3 งานที่แตกต่างที่ทำงานพร้อมกันในเวลาเดียวกันเป็นตัวอย่าง: Task-level-2 ต้องรอหน่วยที่เสร็จสิ้นโดย task-level-1 และ task-level-3 ต้องรอหน่วยของงานที่เสร็จสมบูรณ์โดย งานระดับ-2 อีกตัวอย่างหนึ่งคือการทำงานพร้อมกันของผู้ผลิต 1 รายพร้อมผู้บริโภค 1 ราย หรือผู้ผลิตหลายรายและผู้บริโภค 1 ราย; ผู้อ่านและนักเขียน; et al.
"Parallel" กำลังทำสิ่งเดียวกันในเวลาเดียวกัน มันเกิดขึ้นพร้อมกัน แต่ยิ่งไปกว่านั้นมันเป็นพฤติกรรมเดียวกันที่เกิดขึ้นในเวลาเดียวกันและส่วนใหญ่มักจะอยู่ในข้อมูลที่แตกต่างกัน พีชคณิตเมทริกซ์สามารถถูกทำให้ขนานกันได้เนื่องจากคุณมีการดำเนินการแบบเดียวกันซ้ำ ๆ : ตัวอย่างเช่นผลรวมคอลัมน์ของเมทริกซ์สามารถคำนวณได้ในเวลาเดียวกันโดยใช้พฤติกรรม (ผลรวม) เดียวกัน แต่อยู่ในคอลัมน์ที่ต่างกัน เป็นกลยุทธ์ทั่วไปในการแบ่งพาร์ติชัน (แยก) คอลัมน์ระหว่างคอร์โปรเซสเซอร์ที่มีอยู่เพื่อให้คุณมีจำนวนงานใกล้เคียงกัน (จำนวนคอลัมน์) ที่จัดการโดยแต่ละคอร์โปรเซสเซอร์ อีกวิธีในการแบ่งงานเป็นแบบ bag-of-task ซึ่งคนงานที่เสร็จงานกลับไปหาผู้จัดการที่แจกงานและทำงานเพิ่มขึ้นแบบไดนามิกจนกว่าทุกอย่างจะเสร็จสิ้น อัลกอริทึมการจองตั๋วเป็นอีกหนึ่ง
ไม่ใช่เพียงแค่โค้ดตัวเลขเท่านั้นที่สามารถทำการขนานกันได้ ไฟล์บ่อยเกินไปสามารถประมวลผลแบบขนาน ในแอปพลิเคชันการประมวลผลภาษาธรรมชาติสำหรับไฟล์เอกสารแต่ละไฟล์นับล้านไฟล์คุณอาจต้องนับจำนวนโทเค็นในเอกสาร นี่คือขนานเนื่องจากคุณกำลังนับโทเค็นซึ่งเป็นลักษณะการทำงานเดียวกันสำหรับทุกไฟล์
กล่าวอีกนัยหนึ่งการขนานกันคือเมื่อมีการใช้พฤติกรรมเดียวกันพร้อมกัน พร้อมกันหมายถึงในเวลาเดียวกัน แต่ไม่จำเป็นต้องมีพฤติกรรมเดียวกัน Parallel เป็นประเภทของภาวะพร้อมกันที่เกิดขึ้นในเวลาเดียวกัน
ตัวอย่างเช่นข้อกำหนดจะมีคำแนะนำอะตอมมิกส่วนที่สำคัญการยกเว้นซึ่งกันและกันการหมุนรอเซมาฟอร์, จอภาพ, อุปสรรค, การส่งข้อความ, แผนที่ลด, หัวใจเต้น, แหวน, อัลกอริทึมการจองตั๋ว, กระทู้, MPI, OpenMP
งานของ Gregory Andrews เป็นหนังสือเรียนยอดนิยม: Multithreaded, Parallel และ Distributed Programming
เยี่ยมมากให้ฉันใช้สถานการณ์เพื่อแสดงสิ่งที่ฉันเข้าใจ สมมติว่ามีเด็ก 3 คนชื่อ: A, B, C. A และ B พูดคุย, C ฟัง สำหรับ A และ B พวกเขาขนานกัน: A: ฉันเป็น A. B: ฉันเป็น B.
แต่สำหรับ C สมองของเขาต้องใช้กระบวนการพร้อมกันในการฟัง A และ B มันอาจจะ: ฉันเป็น IA am B
การทำงานพร้อมกันอย่างง่ายหมายถึงมีการเรียกใช้งานมากกว่าหนึ่งงาน (ไม่จำเป็นต้องขนานกัน) ตัวอย่างเช่นเรามี 3 งานในเวลาใดเวลาหนึ่ง: มากกว่าหนึ่งอาจทำงานอยู่หรือทั้งหมดอาจทำงานพร้อมกัน
ความเท่าเทียมหมายถึงพวกเขากำลังวิ่งขนานกันอย่างแท้จริง ดังนั้นในกรณีนี้ทั้งสามจะต้องทำงานพร้อมกัน
แนวคิดของ "การทำงานพร้อมกัน" ของหอกเป็นการออกแบบและการนำไปปฏิบัติโดยเจตนา การออกแบบโปรแกรมที่ใช้งานได้พร้อมกันอาจจะหรืออาจจะไม่แสดงพฤติกรรม "ความเท่าเทียม" มันขึ้นอยู่กับสภาพแวดล้อมรันไทม์
คุณไม่ต้องการให้มีการขนานกันที่แสดงโดยโปรแกรมที่ไม่ได้ออกแบบมาสำหรับการทำงานพร้อมกัน :-) แต่เท่าที่มันเป็นกำไรสุทธิสำหรับปัจจัยที่เกี่ยวข้อง (การใช้พลังงาน, ประสิทธิภาพ, ฯลฯ ), คุณต้องการการออกแบบพร้อมกันมากที่สุดเพื่อให้ระบบโฮสต์สามารถขนานการดำเนินการเมื่อเป็นไปได้
ภาษาการเขียนโปรแกรม Go ของ Pike แสดงให้เห็นถึงสิ่งนี้ในสุดขีด: ฟังก์ชั่นของเขาคือเธรดทั้งหมดที่สามารถทำงานได้อย่างถูกต้องในเวลาเดียวกันเช่นการเรียกฟังก์ชั่นจะสร้างเธรดที่จะทำงานคู่ขนานกับผู้โทร แอปพลิเคชันที่มีเธรดนับร้อยหรือนับพันนั้นเป็นเรื่องธรรมดาที่สุดในโลกของเขา (ฉันไม่ใช่ผู้เชี่ยวชาญ Go นั่นเป็นเพียงความรับผิดชอบของฉัน)