การเขียนโปรแกรมแบบมัลติคอร์/พร้อมกันและ .NET/Java

ฉันมักจะได้ยินเกี่ยวกับภาษาอื่นที่ได้รับการส่งเสริมว่าเหมาะสำหรับการเขียนโปรแกรมแบบมัลติคอร์/พร้อมกันมากกว่า เช่น Clojure, Scala, Erlang ฯลฯ แต่ฉันสับสนเล็กน้อยว่าทำไมฉันต้องกังวลเกี่ยวกับหลายคอร์ Java/.NET VM ไม่ควรจัดการสิ่งนั้นโดยอัตโนมัติ และถ้าไม่ มีเหตุผลอะไรอยู่เบื้องหลัง

เป็นเพราะภาษาที่กล่าวถึงเหล่านี้ใช้งานได้จริงและมีข้อได้เปรียบเหนือภาษาที่ไม่มีประโยชน์ใช่หรือไม่?


person Eugene    schedule 16.08.2011    source แหล่งที่มา


คำตอบ (4)


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

บางคนชอบภาษาสไตล์การใช้งานเช่น Scala, Erlang และ F# มากกว่าที่ไม่สามารถใช้งานได้สำหรับการเขียนโปรแกรมแบบมัลติเธรด ภาษาที่ใช้งานได้มีแนวโน้มที่จะไม่เปลี่ยนรูปแบบอย่างตื้นเขินโดยค่าเริ่มต้น ดังนั้นในทางทฤษฎีจึงใช้งานได้ง่ายกว่าในสถานการณ์แบบมัลติเธรด

นี่เป็นบทความที่ดีมากในเรื่องนี้

person JaredPar    schedule 16.08.2011

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

การทำพร้อมกันเมื่อใช้ "สิ่งของ" ที่ไม่เปลี่ยนรูปนั้นง่ายกว่าเมื่อใช้ "สิ่งของ" ที่ไม่แน่นอน

แต่อย่างไรก็ตาม: คุณต้องกังวลเกี่ยวกับการทำงานพร้อมกัน เพราะเราจะใช้ CPU ที่มีคอร์เพิ่มมากขึ้นเรื่อยๆ และนาฬิกาไม่เร็วขึ้นและเร็วขึ้น Java / C# ไม่ได้ทำให้โปรแกรมของคุณทำงานพร้อมกันโดยอัตโนมัติ คุณยังคงต้องทำงานหนักด้วยตัวเอง

person SyntaxT3rr0r    schedule 16.08.2011

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

อย่างไรก็ตาม มีไลบรารีวิธีใช้มากมายที่สามารถช่วยเหลือคุณบนแพลตฟอร์มต่างๆ ได้ ตัวอย่างเช่น ไลบรารี Task Parallel ใน .NET อนุญาตให้คุณทำสิ่งนี้ได้ เช่น:

Parallel.ForEach(files, file => 
{
   Process(file);
});

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

person Anders Forsgren    schedule 16.08.2011

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

ปัญหาปัจจุบันในการเขียนโปรแกรมคือทุกคนคุ้นเคยกับการทำสิ่งต่าง ๆ ตามลำดับ แต่ฮาร์ดแวร์กำลังย้ายมัลติคอร์ จะต้องมีการปรับเปลี่ยนกระบวนทัศน์อย่างสมบูรณ์ในวิธีที่เราใช้เขียนโค้ดและคิดเกี่ยวกับโค้ด ขณะนี้ การเขียนโค้ดสำหรับ multi-core ใน Java หรือ C# เป็นเพียงการเขียนโค้ดตามลำดับด้วยแฮ็กเพื่อทำให้สามารถขนานได้ การเขียนโปรแกรมเชิงฟังก์ชันจะกลายเป็นการเปลี่ยนกระบวนทัศน์ที่จำเป็นหรือไม่? ฉันไม่รู้.

person toto2    schedule 16.08.2011