การเปลี่ยน Windows sheduler timeslice


1

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

ฉันอยู่บนแพลตฟอร์ม WS2016 x64 และฉันสามารถตั้งค่าความละเอียดของตัวจับเวลาได้เพียง 500us (0.5 มิลลิวินาที) เรียกNtSetTimerResolution()ใช้ฟังก์ชันภายในntdll.dllไลบรารี ฉันเดาว่าค่านั้นผูกติดกับผู้ปกครองเวลา

แต่ผมต้องการที่จะเพิ่มไปยัง 100us การวัดอาจเกี่ยวข้องกับการโทรNtDelayExecution()ในQueryPerformanceCounter()สายหลายครั้งภายในลูปแล้วทำการวิเคราะห์สถิติเช่น jitter, std deviation เป็นต้น

สิ่งนี้ควรทำอย่างไร? มีการปรับแต่งรีจิสทรี / ไฟล์ใดบ้างที่ฉันสามารถตั้งค่า windows sheduler timeslice ของ arbiraty ได้?


PS บางคนอาจถามว่า " ทำไมคุณต้องการมัน? " หรือระบุว่า "อย่าทำผิด! " ฉันละทิ้งความคิดแบบนั้นและจะตอบคำถามต่อไป

  • นี่เป็นเพียงการทดลองใช้ซอฟต์แวร์ มันเป็นเพียงสำหรับการทดสอบความเป็นไปได้และผลทางกายภาพของการทำมัน
  • ฉันทราบว่าสามารถนำไปสู่ปัญหาที่อาจเกิดขึ้นเช่นเวลา cpu พิเศษที่สูญเสียไปเพียงแค่การสลับบริบทความไม่เสถียรของระบบการไม่ตอบสนองการสูญเสียข้อมูลและปัญหาใด ๆ ก็ตามที่อาจทำให้เกิด ฉันยอมรับผลกระทบเชิงลบใด ๆ จากการทำล่วงหน้าและรับผิดชอบทั้งหมด แม้ว่าควันและประกายไฟจะออกมาจากเครื่องของฉัน :)
  • ตาม googling หรือค้นหาที่นี่ - ofc ฉัน alredy ทำมันและล้มเหลวในการค้นหาข้อมูลที่เป็นประโยชน์เพราะหัวข้อนี้ค่อนข้างแคบเกี่ยวข้องกับ OS shedulers ทำงาน และแทบไม่มีจุดหมายที่จะทำบนเครื่อง windows ใด ๆ ฉันรู้ว่าฉันไม่สามารถเปลี่ยนเป็นเวลาจริงได้ การค้นหาไซต์นี้ "sheduler timeslice" ไม่ให้ผลลัพธ์

คำตอบ:


0

ช่วงเวลาของตัวกำหนดตารางเวลาไม่ได้รับอิทธิพลโดยตรงจากความละเอียดของตัวจับเวลา สำหรับกระบวนการส่วนใหญ่ใน SKU ของไคลเอ็นต์นั้นคือ 20 มิลลิวินาที สำหรับกระบวนการที่เป็นเจ้าของหน้าต่างพื้นหน้าคือ 60 msec ค่าเหล่านี้เป็นปกติทั้ง 120 msec บนเซิร์ฟเวอร์ SKU

ค่าเหล่านี้จะเหมือนกันโดยไม่คำนึงถึงสิ่งที่คุณทำกับ NtSetTimerResolution สิ่งที่ความละเอียดของตัวจับเวลาขัดจังหวะนาฬิกาจับเวลาจำนวนที่เหมาะสมจะถูกนับก่อนที่จะตรวจพบช่วงเวลา 20 msec และตัวจัดตารางเวลาจะลดตัวนับ "ควอนตัม" ของเธรดปัจจุบัน ฯลฯ

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

ไม่มีรีจิสตรีหรือปรับแต่งอื่น ๆ เพื่อเปลี่ยนแปลง

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

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

ที่มา: ส่วนใหญ่อยู่ในWindows Internalsโดย Solomon, Russinovich, et al .


แม้จะผ่านการแก้ไขฐานสิบหกบางส่วนถ้ามันถูกรวบรวมโดยไม่ตั้งใจว่าเป็นค่าคงที่ภายในเคอร์เนลของ Windows จากนั้นจะกลายเป็นคำถามในการหา 4 หรือ 8 ไบต์และปรับแต่งมัน สิ่งนี้เป็นไปไม่ได้เพราะในไม่ใช่ปัญหาฮาร์ดแวร์ แต่เป็นซอฟต์แวร์ และมันก็มีการปรับแต่ง OS บางประเภทอย่างแน่นอนแม้ว่ามันอาจจะไม่ถูกเปิดเผยผ่านรีจิสตรีโดยตรง ฉันควรเริ่มการค้นหาที่ไหน
xakepp35

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