มันเป็นวลีสองวลีที่อธิบายสิ่งเดียวกันจากมุมมองที่ต่างกัน (เล็กน้อยมาก) การเขียนโปรแกรมแบบขนานอธิบายสถานการณ์จากมุมมองของฮาร์ดแวร์ - มีโปรเซสเซอร์อย่างน้อยสองตัว (อาจเป็นภายในแพ็คเกจทางกายภาพเดียว) ที่ทำงานกับปัญหาแบบขนาน การเขียนโปรแกรมพร้อมกันกำลังอธิบายสิ่งต่าง ๆ เพิ่มเติมจากมุมมองของซอฟต์แวร์ - การกระทำสองอย่างหรือมากกว่านั้นอาจเกิดขึ้นในเวลาเดียวกัน (พร้อมกัน)
ปัญหาที่นี่คือคนพยายามใช้สองวลีเพื่อแยกความแตกต่างที่ชัดเจนเมื่อไม่มีจริง ๆ ความจริงก็คือเส้นแบ่งที่พวกเขาพยายามวาดนั้นคลุมเครือและคลุมเครือมานานหลายสิบปีและมีความชัดเจนมากขึ้นเรื่อย ๆ เมื่อเวลาผ่านไป
สิ่งที่พวกเขากำลังพยายามที่จะหารือคือข้อเท็จจริงที่ว่ากาลครั้งหนึ่งคอมพิวเตอร์ส่วนใหญ่มี CPU เพียงตัวเดียว เมื่อคุณดำเนินการหลายกระบวนการ (หรือเธรด) บน CPU เดี่ยวนั้น CPU จะดำเนินการคำสั่งเดียวจากเธรดเหล่านั้นทีละตัวเท่านั้น การปรากฏตัวของการเกิดพร้อมกันนั้นเป็นภาพลวงตา - การสลับ CPU ระหว่างการดำเนินการคำสั่งจากเธรดที่แตกต่างกันอย่างรวดเร็วพอที่จะทำให้มนุษย์รับรู้ (ซึ่งมีอะไรน้อยกว่า 100 มิลลิวินาทีหรือทันทีทันใด)
ความแตกต่างที่เห็นได้ชัดคือคอมพิวเตอร์ที่มี CPU หลายตัวหรือ CPU ที่มีหลายคอร์ดังนั้นเครื่องกำลังประมวลผลคำสั่งจากหลายเธรดและ / หรือกระบวนการในเวลาเดียวกัน โค้ดที่รันไม่สามารถ / ไม่มีผลกระทบใด ๆ กับโค้ดที่รันในอีกอัน
ทีนี้ปัญหา: ความแตกต่างที่ชัดเจนเช่นนี้แทบไม่เคยเกิดขึ้นเลย นักออกแบบคอมพิวเตอร์ค่อนข้างฉลาดจริง ๆ ดังนั้นพวกเขาจึงสังเกตเห็นเมื่อนานมาแล้วว่า (เช่น) เมื่อคุณต้องการอ่านข้อมูลบางอย่างจากอุปกรณ์ I / O เช่นดิสก์มันใช้เวลานาน (ในแง่ของรอบ CPU) เสร็จสิ้น. แทนที่จะปล่อยให้ CPU ว่างขณะที่เกิดขึ้นพวกเขาหาวิธีต่างๆในการปล่อยหนึ่งกระบวนการ / เธรดทำการร้องขอ I / O และให้โค้ดจากกระบวนการ / เธรดอื่นดำเนินการบน CPU ในขณะที่คำขอ I / O เสร็จสมบูรณ์
ดังนั้นก่อนซีพียูแบบมัลติคอร์จะกลายเป็นบรรทัดฐานเรามีการดำเนินการจากหลายเธรดที่เกิดขึ้นพร้อมกัน
นั่นเป็นเพียงส่วนเล็ก ๆ ของภูเขาน้ำแข็ง ทศวรรษที่ผ่านมาคอมพิวเตอร์เริ่มให้ความเท่าเทียมในระดับอื่นเช่นกัน อีกครั้งในฐานะที่เป็นคนฉลาดหลักแหลมนักออกแบบคอมพิวเตอร์สังเกตว่าในหลายกรณีพวกเขามีคำแนะนำที่ไม่ส่งผลกระทบต่อกันดังนั้นจึงเป็นไปได้ที่จะดำเนินการมากกว่าหนึ่งคำสั่งจากสตรีมเดียวกันในเวลาเดียวกัน ตัวอย่างแรก ๆ ที่กลายเป็นที่รู้จักกันดีก็คือข้อมูลการควบคุม 6600 นี่เป็นคอมพิวเตอร์ที่เร็วที่สุดในโลกเมื่อมีการเปิดตัวเมื่อปี 2507 และมีสถาปัตยกรรมพื้นฐานแบบเดิมที่ยังคงใช้อยู่ในปัจจุบัน มันติดตามทรัพยากรที่ใช้โดยแต่ละคำสั่งและมีชุดของหน่วยการเรียกใช้งานที่ดำเนินการคำสั่งทันทีที่ทรัพยากรที่พึ่งพานั้นพร้อมใช้งานซึ่งคล้ายกับการออกแบบโปรเซสเซอร์ Intel / AMD ล่าสุด
แต่ (เหมือนโฆษณาเคยพูด) รอ - นั่นไม่ใช่ทั้งหมด ยังมีองค์ประกอบการออกแบบอื่นเพื่อเพิ่มความสับสนต่อไป ได้รับชื่อค่อนข้างน้อย (เช่น "Hyperthreading", "SMT", "CMP") แต่พวกเขาทั้งหมดอ้างถึงแนวคิดพื้นฐานเดียวกัน: CPU ที่สามารถรันหลายเธรดพร้อมกันโดยใช้การรวมกันของทรัพยากรบางอย่างที่ ไม่ขึ้นอยู่กับแต่ละเธรดและทรัพยากรบางอย่างที่แบ่งใช้ระหว่างเธรด ในกรณีทั่วไปนี้จะรวมกับความเท่าเทียมในระดับคำสั่งที่อธิบายไว้ข้างต้น ในการทำเช่นนั้นเรามีชุดรีจิสเตอร์สถาปัตยกรรมสองชุดขึ้นไป จากนั้นเรามีชุดของหน่วยดำเนินการที่สามารถดำเนินการคำสั่งได้ทันทีที่ทรัพยากรที่จำเป็นมีอยู่
แน่นอนว่าเราไปถึงระบบที่ทันสมัยที่มีหลายคอร์ นี่คือสิ่งที่ชัดเจนใช่มั้ย เรามี N (บางที่ระหว่าง 2 ถึง 256 หรือมากกว่านั้นในขณะนี้) แกนที่แยกต่างหากซึ่งสามารถดำเนินการคำสั่งได้ในเวลาเดียวกันดังนั้นเราจึงมีกรณีที่ชัดเจนของการขนานขนานจริง - ดำเนินการคำสั่งในกระบวนการเดียว / เธรด ' ไม่ส่งผลกระทบต่อคำสั่งในการดำเนินการในอีก
เรียงกันของ แม้ที่นี่เรามีทรัพยากรที่เป็นอิสระ (ลงทะเบียนหน่วยดำเนินการแคชอย่างน้อยหนึ่งระดับ) และทรัพยากรที่ใช้ร่วมกันบางอย่าง (โดยทั่วไปจะเป็นแคชระดับต่ำสุดและหน่วยควบคุมหน่วยความจำและแบนด์วิดท์ต่อหน่วยความจำอย่างแน่นอน)
เพื่อสรุป: สถานการณ์ง่าย ๆ ที่ผู้คนต้องการเปรียบเทียบระหว่างทรัพยากรที่ใช้ร่วมกันและทรัพยากรที่เป็นอิสระแทบไม่เคยเกิดขึ้นในชีวิตจริง ด้วยทรัพยากรที่ใช้ร่วมกันทั้งหมดเราจะจบลงด้วยบางสิ่งบางอย่างเช่น MS-DOS ที่ซึ่งเราสามารถเรียกใช้เพียงหนึ่งโปรแกรมในแต่ละครั้งและเราต้องหยุดการทำงานหนึ่งโปรแกรมก่อนที่เราจะสามารถเรียกใช้โปรแกรมอื่น ๆ ได้เลย ด้วยทรัพยากรที่เป็นอิสระอย่างสมบูรณ์เรามีคอมพิวเตอร์ N เครื่องที่ใช้ MS-DOS (ไม่มีแม้แต่เครือข่ายในการเชื่อมต่อ) โดยไม่มีความสามารถในการแชร์สิ่งใด ๆ ระหว่างพวกเขาเลย (เพราะถ้าเราสามารถแบ่งปันไฟล์ได้ด้วยนั่นก็คือทรัพยากรที่ใช้ร่วมกัน การละเมิดหลักฐานขั้นพื้นฐานของการไม่แบ่งปันสิ่งใด)
ทุกกรณีที่น่าสนใจเกี่ยวข้องกับการรวมกันของทรัพยากรอิสระและทรัพยากรที่ใช้ร่วมกัน คอมพิวเตอร์ทันสมัยทุกเครื่อง (และเครื่องอื่น ๆ ที่ทันสมัย) มีความสามารถอย่างน้อยในการทำงานอิสระอย่างน้อยสองสามอย่างพร้อมกันและสิ่งอื่น ๆ ที่ซับซ้อนกว่า MS-DOS ได้ใช้ประโยชน์จากสิ่งนั้นอย่างน้อย ระดับหนึ่ง
การแบ่งที่ดีสะอาดระหว่าง "พร้อมกัน" และ "ขนาน" ที่คนชอบวาดไม่ได้มีอยู่และแทบไม่เคยมีเลย สิ่งที่คนชอบจัดว่า "พร้อมกัน" มักจะยังคงเกี่ยวข้องอย่างน้อยหนึ่งและมักจะดำเนินการแบบคู่ขนานที่แตกต่างกันมากขึ้น สิ่งที่พวกเขาต้องการจัดเป็น "ขนาน" มักจะเกี่ยวข้องกับการแบ่งปันทรัพยากรและ (ตัวอย่าง) กระบวนการหนึ่งที่ปิดกั้นการดำเนินการของผู้อื่นในขณะที่ใช้ทรัพยากรที่ใช้ร่วมกันระหว่างทั้งสอง
ผู้คนพยายามวาดความแตกต่างที่ชัดเจนระหว่าง "ขนาน" และ "พร้อมกัน" กำลังใช้ชีวิตอยู่ในจินตนาการของคอมพิวเตอร์ที่ไม่เคยมีอยู่จริง