ทำไมกระบวนการจัดลำดับความสำคัญไม่ทำให้การปรับปรุงความเร็วดีขึ้น


18

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

ทำไมนี้ มีอะไรเกิดขึ้นหรือมีอะไรมากกว่านั้นที่ต้องทำ?


6
มันเหมือนชีวิตจริง หากคุณมีความสำคัญในการขึ้นเครื่องบินมากกว่าผู้โดยสารคนอื่นนั่นไม่ได้หมายความว่าเที่ยวบินจะใช้เวลาน้อยลงสำหรับคุณ!
Mehrdad

คำตอบ:


28

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

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


5
ระดับความสำคัญจะช่วยได้เมื่อคอขวดเป็นเธรดจำนวนมากที่สามารถรันได้ เธรดที่มีลำดับความสำคัญสูงกว่าใน Windows ที่ยังคงทำงานได้ในตอนท้ายของช่วงเวลาของพวกเขาจะได้รับโอกาสอีกครั้งในการเรียกใช้เธรดที่มีลำดับความสำคัญต่ำกว่า (Windows พยายามที่จะไม่ใช้งานเธรดที่มีลำดับความสำคัญต่ำ ลำดับความสำคัญมีผลกระทบเล็กน้อยต่อเธรดที่รอ I / O - Windows จะเพิ่มระดับความสำคัญของเธรดชั่วคราวหลังจากที่ I / O เสร็จสมบูรณ์ขึ้นอยู่กับประเภทของ I / O ที่กำลังรออยู่
Mike Dimmick

4

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


3

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

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

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

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

ก่อนที่ Windows Vista ลำดับความสำคัญของเธรดจะไม่มีผลกับการดำเนินการของ I / O ที่รวดเร็ว ตั้งแต่ Windows Vista, I / Os สามารถมีลำดับความสำคัญได้ตามค่าเริ่มต้นซึ่งมาจากลำดับความสำคัญของเธรด

สรุป: คุณส่วนใหญ่จะไม่เห็นผลใด ๆ ของการเปลี่ยนลำดับความสำคัญของเธรดยกเว้นว่า CPU ของคุณโหลดหนักมากและโดยทั่วไปแล้วเอฟเฟกต์จะน้อยที่สุด หากกระบวนการต้องรอ I / O หรือไม่ได้ต่อสู้กับกระบวนการอื่นสำหรับเวลา CPU กระบวนการนั้นจะทำงานได้เร็วที่สุดและการเปลี่ยนลำดับความสำคัญจะไม่ทำให้เร็วขึ้น


0

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

ปัญหาอื่น ๆ ที่เป็นไปได้:

  • โปรแกรมอาจไม่มีประสิทธิภาพ / เขียนได้ไม่ดี
  • อาจช้าลงเนื่องจากการเข้าถึงดิสก์ "ช้า" หรือเครือข่ายช้า

0

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

ตรงกันข้ามกับที่ระบุไว้อย่างชัดเจนในประโยคแรกของคำตอบที่ยอมรับในปัจจุบัน ( /superuser//a/752587/322588 ) การเปลี่ยนแปลงลำดับความสำคัญจะมีประสิทธิภาพมากที่สุดเมื่อ CPU เป็นคอขวดตามที่อธิบายไว้ในคำตอบของ Mike Dimmick ( /superuser//a/752864/322588 ) ยิ่งกว่านั้นคำแถลงในวรรคสองของคำตอบที่ได้รับการยอมรับ "หากกระบวนการของคุณหมดเวลาทั้งหมดที่จัดสรรไว้ในการคำนวณจริงการตั้งเวลาจะไม่เปลี่ยนแปลงสิ่งใดที่นั่น" ผิดอย่างสมบูรณ์เว้นแต่กระบวนการโดยทั่วไปแล้วมีลำดับความสำคัญสูงสุดของทั้งหมด เธรดที่รันได้ทุกครั้งที่รอการเรียกใช้ นี่เป็นเพราะในสถานการณ์อื่น ๆ การเพิ่มลำดับความสำคัญมีแนวโน้มที่จะได้รับเวลามากขึ้นต่อช่วงเวลาของนาฬิกาแขวน

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

ข้อจำกัดความรับผิดชอบ: ฉันไม่รู้นายดิมมิคถึงแม้ว่าฉันจะบอกได้ว่าเขารู้สิ่งที่เขาเขียน


บางทีคุณอาจเข้าใจผิด คำถามเกี่ยวกับกระบวนการทำงานที่เร็วขึ้น กระบวนการที่เชื่อมโยงกับ CPU จะทำให้หมดเวลาหน่วยการตั้งเวลา (ควอนตัม) ของพวกเขาและจากนั้นเข้าสู่คิวของกระบวนการที่พร้อมในตอนท้าย ในระบบปฏิบัติการเดสก์ท็อปเช่น Windows นั่นหมายความว่ากระบวนการมีโอกาส 1 / quantum-Hz ในการทำงานทุกวินาที การเปลี่ยนลำดับความสำคัญ (โดยทั่วไป) จะไม่เปลี่ยนความยาวของไทม์สของมัน มันจะใช้เวลาจำนวนเดียวกันของการตั้งเวลาควอนตัมให้เสร็จสมบูรณ์ ขับเคลื่อนนี้เป็นวิธีการที่ Windows จริงขนาดรันไทม์กระบวนการ: ควอนตั้มจำนวนที่กำหนดไว้
Andon M. Coleman

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

ลำดับความสำคัญของกระบวนการเชื่อมโยง I / O ที่รออยู่นั้นแตกต่างกันอย่างมากและสามารถมีผลกระทบที่วัดได้ในรายงานรันไทม์ใน Windows อีกครั้ง Windows วัดค่ารันไทม์เป็นจำนวนควอนตั้มที่หมดอายุ (แม้ว่ากระบวนการใช้เวลา 1 ms จากควอนตัม 10 ms ที่ใช้งานจริงและจากนั้นสมัครใจรอที่เหลืออีก 9 ms สำหรับ I / O เคอร์เนลของ Windows นับว่าคุ้มค่า 10 มิลลิวินาที ของโหมดผู้ใช้รันไทม์) ใบจองสามารถช่วยให้แอปพลิเคชันที่ถูกผูกไว้ใช้ I / O ลดปริมาณควอนตัมให้น้อยลง เมล็ดอื่น (เช่น Linux) สามารถวัดปริมาณควอนตั้มบางส่วนได้อย่างถูกต้องในกระบวนการ 'รันไทม์ แต่ Windows ไม่สามารถ
Andon M. Coleman

@ AndonM.Coleman ตั้งแต่ Vista และใหม่กว่าใช่มันสามารถทำได้
เจมี่ Hanrahan

@JamieHanrahan: ดีคุณสามารถโทรหาtimeBeginPeriod (...)ซึ่งอะไรแล้วไม่โต้ตอบ โดยทั่วไปเกมจะตั้งค่านี้เป็น1เมื่อเริ่มเกมและจะใช้ช่วงเวลา 1 ms ในการกำหนดตารางเวลาข้ามกระดานกับทุกสิ่งที่ทำงานบนระบบ มันไม่ได้แยกออกเป็นกระบวนการที่ทำ นี่เป็นส่วนหนึ่งของเหตุผลที่การใช้ Windows อย่างจริงจังสำหรับการทำงานหลายอย่างพร้อมกัน
Andon M. Coleman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.