มัลติเธรดสำคัญอย่างไรในอุตสาหกรรมซอฟต์แวร์ปัจจุบัน [ปิด]


59

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

ฉันได้รับคำถามสองสามข้อเกี่ยวกับมัลติเธรดระหว่างการสัมภาษณ์และฉันมักตอบคำถามเหล่านี้ (ส่วนใหญ่เป็นคำถามง่าย ๆ ) ทำให้ฉันสงสัยว่า Multithreading มีความสำคัญอย่างไรในสถานการณ์ปัจจุบันของอุตสาหกรรม


8
คุณอาจไม่ได้ทำอย่างชัดเจน แต่คุณได้ใช้ประโยชน์จากเบื้องหลังอย่างแน่นอน
Martin York

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

1
ฉันไม่ค่อยได้ใช้มันในการพัฒนาเว็บไซต์ แต่ฉันคิดว่ามันเป็นเรื่องธรรมดามากกว่าที่อื่น ตัวอย่างเช่นฉันเพิ่งเขียนแอพ Android และรู้ว่าคุณต้องใช้มัลติเธรดหากคุณมีกิจกรรมเครือข่าย
jwegner

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

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

คำตอบ:


92

เป็นสิ่งสำคัญอย่างยิ่ง

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

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

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

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

ดังนั้นสิ่งที่สำคัญในขณะนี้และสิ่งที่จะมีความสำคัญมากยิ่งขึ้นในอนาคตไม่ได้multithreadingต่อ se แต่การจัดการกับ asynchrony การทำมัลติเธรดเป็นวิธีเดียวที่จะทำได้ - วิธีที่ซับซ้อนและผิดพลาดเกิดขึ้นได้ง่ายขึ้นและมีแนวโน้มที่จะเกิดข้อผิดพลาดมากขึ้นเนื่องจากชิปรุ่นหน่วยความจำที่อ่อนแอนั้นมีการใช้กันอย่างแพร่หลาย

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


5
+1 สำหรับคำตอบที่ยอดเยี่ยมมันสมควรได้รับเครดิตมากกว่าความพยายามต่ำต้อยของฉันเอง
PéterTörök

2
ข้อมูลจะมีมากขึ้นในแบบอะซิงโครนัส ถ้านั่นไม่ใช่ความจริง . .
surfasb

2
concurrencyสำคัญกว่าasynchronous พฤติกรรม คุณสามารถมี asyncronous โดยไม่ต้องเห็นพ้องด้วย (เช่นหลายหัวข้อบน CPU หลักเดียว) คือไม่ได้ใช้แทนความหมายสำหรับasynchronous concurrency

5
@Jarrod: ฝึกฝน asynchrony เป็นมากขึ้นที่สำคัญมากกว่าแค่การฝึกฝนการทำงานพร้อมกันสำหรับเหตุผลที่แม่นยำที่คุณกล่าวถึง: เห็นพ้องเป็นเพียงชนิดยากโดยเฉพาะอย่างยิ่งของ asynchrony ส่วนที่ยากลำบากของการเกิดพร้อมกันไม่ได้เป็น "สิ่งที่เกิดขึ้นในเวลาเดียวกัน" มุมมองของมันและแน่นอนการเกิดขึ้นพร้อมกันมักจะเป็นเพียงการจำลองการเกิดพร้อมกันเช่นไม่มัลติทาสกิ้งที่ทำงานร่วมกันผ่านการแบ่งเวลา ส่วนที่ยากคือการใช้ทรัพยากรอย่างมีประสิทธิภาพโดยไม่ปิดกั้นแขวนหยุดชะงักและไม่ได้เขียนโปรแกรมภายในที่ยากที่จะให้เหตุผลเกี่ยวกับท้องถิ่น
Eric Lippert

"การเกิดขึ้นพร้อมกันมักเป็นเพียงการจำลองการทำงานพร้อมกัน, เช่น, การทำงานหลายอย่างแบบไม่ร่วมมือผ่านการแบ่งเวลา": ในการทำความเข้าใจของฉันนี้ยังคงเกิดขึ้นพร้อมกัน (จริง) คุณอาจหมายถึงว่ามันไม่ขนานกัน?
Giorgio

46

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


3
+1: สำคัญกว่าที่เคย โปรดจำไว้ว่าในการออกแบบระบบคุณสามารถได้รับประโยชน์จากการทำมัลติเธรดโดยการแบ่งพาร์ติชันของงานเพื่อให้กระบวนการทำงานมากขึ้น
Scott C Wilson

11
โทรศัพท์มือถือบางรุ่นมีโปรเซสเซอร์แบบมัลติคอร์อยู่แล้ว!
Che Jami

3
ฉันขอยืนยันว่ามัลติเธรดมีความสำคัญเนื่องจากระบบการแบ่งปันครั้งแรกถูกสร้างขึ้น การมีโปรเซสเซอร์ / คอร์หลายตัวเพียงเพิ่มมิติใหม่ของประสิทธิภาพในการมีหลายเธรด
jwernerny

บางทีกระทู้ (โดยเฉพาะบนอุปกรณ์พกพา) อาจเป็นความคิดที่ไม่ดี ระบบปฏิบัติการควรจัดการการปรับแต่งการใช้งาน cores ให้เหมาะสมโดยไม่ต้องมีรหัสผู้ใช้ buggy พยายามทำเกลียว มีแอปพลิเคชั่นน้อยมากที่ผู้ใช้ทั่วไปสามารถเข้าถึงความต้องการนั้นหรือจะเป็นประโยชน์ต่อผู้คนมากมาย ข้อยกเว้นเพียงอย่างเดียวคือ (แอปพลิเคชั่นกราฟิกระดับสูง / เครื่องมือสำหรับนักพัฒนา / การสร้างแบบจำลองสภาพอากาศ / เว็บเซิร์ฟเวอร์ (และบริการที่เกี่ยวข้อง)) แอปพลิเคชันเฉพาะทางระดับสูงทั้งหมด
Martin York

1
@ Tux-D คุณอาจมีเกมบนอุปกรณ์พกพาซึ่งใช้ประโยชน์มากกว่าหนึ่งคอร์ มันไม่ใช่สิ่งที่ยอดเยี่ยม
whitequark

28

โดยทั่วไปมัลติเธรดมีความสำคัญอยู่แล้วและจะมีความสำคัญมากกว่านี้ในอีกไม่กี่ปีข้างหน้า (ตามที่PéterTörök) ชี้ให้เห็น - เป็นวิธีที่โปรเซสเซอร์จะปรับขนาดสำหรับอนาคตอันใกล้ (แกนมากกว่า MHz ที่สูงกว่า) .

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


+1 สำหรับหมายเหตุว่าผู้โพสต์นั้นเป็นนักพัฒนาเว็บและเว็บเซิร์ฟเวอร์ส่วนใหญ่นั้นมีหลายเธรดสำหรับคุณ ไม่ใช่ว่ามันไม่จำเป็นในบางกรณี แต่ 99% ของรหัสคอนโทรลเลอร์แบบเธรดหลายครั้งนั้นไม่ได้เป็นการปรับปรุงประสิทธิภาพที่ใหญ่ที่สุดสำหรับการโทร MVC
มูฟาซา

19

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

เธรดเป็นรูปแบบเดียวและรูปแบบการใช้งานสำหรับการใช้งานconcurrentโปรแกรม

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


+1 แม้ว่าฉันยังคิดว่า Erlang มีหลายเธรด ชุมชนเพิ่งนิยามคำว่า "เธรด" ใหม่เพื่อขึ้นอยู่กับสถานะที่แชร์ซึ่งไม่แน่นอนและทำให้แยกความแตกต่างจากมัน
ด่าน

1
Erlang VM ใช้ 1 เธรดต่อ CPU โดยค่าเริ่มต้น แต่ในฐานะนักพัฒนา Erlang คุณไม่สามารถเข้าถึงเธรด OS พื้นฐานได้เฉพาะกระบวนการที่มีน้ำหนักเบาที่ Erlang VM จัดหาให้

10

ฉันได้รับคำถามสองสามข้อเกี่ยวกับมัลติเธรดระหว่างการสัมภาษณ์ ...

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


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

6

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

อย่างน้อยที่สุดการทำความเข้าใจปัญหาที่เกี่ยวข้องกับการเกิดพร้อมกันควรได้รับ

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


4

ดูเหมือนว่าคุณกำลังเขียนโค้ดหลายเธรดอยู่แล้ว

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

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


18
<nitpick> เห็นได้ชัดว่าเขาไม่ได้เขียนโค้ดแบบมัลติเธรดโค้ด (เธรดเดี่ยว) เท่านั้นที่ทำงานในสภาพแวดล้อมแบบมัลติเธรด </nitpick>
PéterTörök

2

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


2

คำตอบสั้น ๆ : มาก

คำตอบอีกต่อไป: คอมพิวเตอร์อิเล็กทรอนิกส์ (ที่ใช้ทรานซิสเตอร์) กำลังเข้าใกล้ขีด จำกัด ทางกายภาพของเทคโนโลยีอย่างรวดเร็ว มันกลายเป็นเรื่องยากและยากขึ้นในการบีบนาฬิกาออกจากแต่ละแกนในขณะที่จัดการการสร้างความร้อนและผลกระทบเชิงควอนตัมของวงจรจุลภาค (เส้นทางของวงจรได้ถูกวางไว้ใกล้กันบนชิปสมัยใหม่ที่มีผลกระทบ "กระโดดแทร็ก" จากวงจรหนึ่งไปยังอีกโดยไม่จำเป็นต้องมีเงื่อนไขที่เหมาะสมสำหรับอาร์คไฟฟ้าแบบดั้งเดิม); ดังนั้นผู้ผลิตชิปแทบทุกรายมุ่งเน้นที่การทำให้นาฬิกาแต่ละตัวสามารถทำงานได้มากขึ้นแทนที่จะใส่ "หน่วยปฏิบัติการ" ลงใน CPU แต่ละตัว จากนั้นแทนที่จะคอมพิวเตอร์ทำเพียงสิ่งเดียวต่อนาฬิกามันสามารถทำ 2 หรือ 4 หรือ 8 ได้ Intel มี "HyperThreading" ซึ่งโดยทั่วไปจะแยก CPU core หนึ่งตัวเป็นสองตัวประมวลผลเชิงตรรกะ (โดยมีข้อ จำกัด บางอย่าง) ผู้ผลิตทุกรายกำลังใส่แกนประมวลผลอย่างน้อยสองแกนลงในชิป CPU หนึ่งตัวและมาตรฐานทองคำปัจจุบันสำหรับซีพียูเดสก์ท็อปคือสี่แกนต่อชิป แปดเป็นไปได้เมื่อมีการใช้ชิป CPU สองตัวมีเซิร์ฟเวอร์เมนบอร์ดที่ออกแบบมาสำหรับโปรเซสเซอร์ "quad quad-core" (16 EUs บวก HT) และซีพียูรุ่นต่อไปน่าจะมีหกหรือแปดตัวต่อชิป

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


1

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

แก้ไข: นี่คือบางสิ่งที่ต้องจำไว้เกี่ยวกับข้อเสียของมัลติเธรด:

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

นอกจากนี้ลิงค์นี้อาจมีประโยชน์ในเรื่องเดียวกัน


2
ดูเหมือนจะไม่ตอบคำถามของ OP: - /
PéterTörök

มันให้มุมมองระดับสูงสุด (ส่วนใหญ่) ของเธรด สิ่งที่ต้องพิจารณาก่อนทำการขุดลงไปในหลายเธรด
c0da

@ c0da Stack Exchange ไม่ใช่กระดานสนทนา: คำตอบควรตอบคำถามโดยตรง คุณสามารถขยายคำตอบเพื่อนำกลับไปยังสิ่งที่ผู้ถามต้องการได้หรือไม่?

1

ทำให้ฉันสงสัยว่า Multithreading มีความสำคัญอย่างไรในสถานการณ์ปัจจุบันของอุตสาหกรรม

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

  1. ประสิทธิภาพหน่วยความจำ (เช่นตำแหน่งของการอ้างอิง)
  2. อัลกอริทึม
  3. multithreading
  4. SIMD
  5. การเพิ่มประสิทธิภาพอื่น ๆ (คำแนะนำการคาดคะเนสาขาคงที่เช่น)

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

ประสิทธิภาพของหน่วยความจำ

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

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

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

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

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

อัลกอริทึม

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

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

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

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

multithreading

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

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

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

SIMD

SIMD นั้นค่อนข้างแปลกใจเนื่องจากการลงทะเบียนนั้นกว้างขึ้นจริง ๆ ด้วยแผนการที่จะขยายให้กว้างขึ้น เดิมเราเห็นการลงทะเบียน MMX 64- บิตตามด้วยการลงทะเบียน XMM 128- บิตที่มีความสามารถในการดำเนินการ SPFP 4 แบบขนาน ตอนนี้เราเห็นการลงทะเบียน YMM 256 บิตที่มีความสามารถ 8 แบบขนาน และมีแผนที่วางไว้สำหรับการลงทะเบียน 512 บิตซึ่งจะอนุญาตให้ 16 แบบขนาน

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

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

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

การเพิ่มประสิทธิภาพอื่น ๆ

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

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

กลับไปที่มัลติเธรดเพื่อประสิทธิภาพ

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

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

มัลติเธรดนอกประสิทธิภาพ

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

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

เมื่อเราไม่เพียงแค่ขนานกับวงวนที่แน่นหนาในการเข้าถึงโครงสร้างข้อมูลขนาดใหญ่มัลติเธรดก็จะอยู่ในหมวดหมู่ "การออกแบบ" ที่ไม่ยอมใครง่ายๆจริงๆ

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


0

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


0

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

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


0

คนในอดีตต้องต่อสู้โดยใช้การเขียนโปรแกรมแบบมัลติเธรดด้วยมือ พวกเขาต้องทำงานกับส่วนประกอบหลักทั้งหมด (เธรดเซมาฟอร์, mutexes, ล็อค ฯลฯ ) โดยตรง

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

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

เป้าหมายกำลังขยายในแนวนอน การเพิ่มเซิร์ฟเวอร์มาตรฐานเพิ่มเติมแทนที่จะซื้อเซิร์ฟเวอร์ที่ใหญ่กว่า

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


-1

เครื่องของฉันมี 8 คอร์ ในตัวจัดการงานฉันมี 60 กระบวนการที่กำลังทำงานอยู่ บางอย่างเช่น VS ใช้มากถึง 98 เธรด Outlook ใช้ 26 ฉันคาดหวังว่าการใช้หน่วยความจำส่วนใหญ่ของฉันคือสแต็คที่จัดสรรให้กับเธรดที่ไม่ได้ใช้งานแต่ละชุด

ฉันเองกำลังรอให้คอมพิวเตอร์ 300-core ออกมาเพื่อที่ฉันจะได้ไม่ต้องรอให้ Outlook ตอบสนอง แน่นอนโดย Outlook จะใช้ 301 เธรด

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

มันสำคัญกับนักออกแบบกรอบและภาษาและโปรแกรมเมอร์ระบบแบ็คเอนด์ - ไม่มากนักสำหรับผู้สร้างแอพพลิเคชั่น การทำความเข้าใจแนวคิดพื้นฐานบางอย่างเช่นการล็อคและการเขียนโค้ด async น่าจะคุ้มค่า


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