จะ จำกัด กระบวนการให้กับซีพียูแกนเดียวได้อย่างไร?


30

คุณจะ จำกัด โปรแกรมโปรเซสเดียวที่รันในสภาพแวดล้อม Windows เพื่อรันบน CPU เดี่ยวบนเครื่องที่มีหลายคอร์ได้อย่างไร?

มันเหมือนกันระหว่างโปรแกรมที่มีหน้าต่างและโปรแกรมบรรทัดคำสั่งหรือไม่?

UPDATE:

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

2
ทำไมคุณถึงต้องการทำเช่นนี้? การปล่อยให้ระบบปฏิบัติการตัดสินใจว่า CPU / core ทำงานอย่างไรซึ่งกระบวนการนั้นจะมีประสิทธิภาพมากกว่า
ChrisF

1
เพื่อเปรียบเทียบมาตรฐานภาษาการเขียนโปรแกรมต่าง ๆ
Jonathan

1
นั่นเป็นเหตุผลที่ดี - คุณควรรวมข้อมูลนั้นไว้ในคำถามของคุณ มันสำคัญ.
ChrisF

แรงจูงใจไม่จำเป็น แต่ฉันได้เพิ่มคำแนะนำของคุณ
Jonathan

1
อย่างไรก็ตามอาจเป็นข้อมูลที่บางคนต้องสามารถให้คำตอบได้
ChrisF

คำตอบ:


27

หากคุณใช้ Windows Vista / 7 (อาจเป็น XP แต่ไม่แน่ใจ) มันค่อนข้างง่ายจริงๆ

พิมพ์: Control+Shift+Escเพื่อจัดการภาระงานของคุณ

คลิกที่แท็บกระบวนการ

ค้นหากระบวนการที่ต้องการเปลี่ยนความสัมพันธ์ของตัวประมวลผล

คลิกขวาที่กระบวนการ

คลิกที่ "Set Affinity"

ที่นี่คุณสามารถเลือกโปรเซสเซอร์ที่กระบวนการของคุณจะใช้

โชคดี!

แก้ไข: คุณต้องเป็นผู้ดูแลระบบเพื่อให้มันใช้งานได้


13
ความสัมพันธ์ไม่รับประกัน กระบวนการจะชอบโปรเซสเซอร์นี้ แต่ถ้ามันมีหลายกระทู้พวกเขาจะไม่อยู่ที่นั่นทั้งหมด
Joel Coehoorn

1
นี่เป็นสิ่งที่ดี แต่ฉันต้องการบางสิ่งที่จะสามารถกำหนดได้ตั้งแต่เริ่มต้น
Jonathan

2
@JoelCoehoorn: ไม่มีก็คือการรับประกัน สิ่งที่คุณกำลังพูดถึงคือเวกเตอร์ตัวประมวลผลที่ต้องการซึ่งแตกต่างจากเวกเตอร์ความสัมพันธ์
Mehrdad

1
@ Mehrdad: นอกจากโปรแกรมจะเปลี่ยนเป็นอะไรก็ตาม
Eugene Ryabtsev

1
@JoelCoehoorn > ความสัมพันธ์ของเธรดบังคับให้เธรดทำงานบนเซ็ตย่อยของตัวประมวลผลเฉพาะ - คุณดูเหมือนจะหมายถึงสิ่งที่บทความที่บอกว่าเป็นหน่วยประมวลผลด้ายเหมาะ
บ๊อบ

19

จากบรรทัดคำสั่งให้ใช้

start / affinity 1 program.exe

สิ่งนี้จะรัน program.exe บน CPU ตัวแรกเนื่องจาก "1" เป็นค่าฐานสิบหกของมาสก์ความสัมพันธ์

CPU3 CPU2 CPU1 CPU0  Bin  Hex
---- ---- ---- ----  ---  ---
OFF  OFF  OFF  ON  = 0001 = 1
OFF  OFF  ON   OFF = 0010 = 2
OFF  OFF  ON   ON  = 0011 = 3
OFF  ON   OFF  OFF = 0100 = 4
OFF  ON   OFF  ON  = 0101 = 5 
OFF  ON   ON   OFF = 0110 = 6
OFF  ON   ON   ON  = 0111 = 7
ON   OFF  OFF  OFF = 1000 = 8
ON   OFF  OFF  ON  = 1001 = 9
ON   OFF  ON   OFF = 1010 = A 
ON   OFF  ON   ON  = 1011 = B
ON   ON   OFF  OFF = 1100 = C
ON   ON   OFF  ON  = 1101 = D
ON   ON   ON   OFF = 1110 = E 
ON   ON   ON   ON  = 1111 = F 

1
Revolter: คุณรู้หรือไม่ว่าฉันสามารถทำเช่นเดียวกันกับการเริ่มต้นบริการได้หรือไม่
Diogo

ถ้าคุณมีมากกว่า 4 แกน
posfan12

7

ขึ้นอยู่กับสิ่งที่คุณยินดีที่จะทำ:

วิธีที่ 1: ตามต้องการ

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

วิธีที่ 2: บังคับเซสชัน Windows ทั้งหมด (Vista / 7)

  1. พิมพ์bcdedit /set onecpu onพรอมต์คำสั่ง
  2. รีบูทระบบ
  3. เมื่อคุณเล่นเสร็จแล้วให้พิมพ์ 2 - ประเภท: bcdedit /set onecpu offและรีบูตอีกครั้ง

วิธีที่ 2: บังคับเซสชัน Windows ทั้งหมด (XP)

  1. เปิดไฟล์ boot.ini ของคุณ (คลิกขวาที่ My Computer -> Properties -> Advanced Tab -> ปุ่ม Settings ภายใต้ 'Startup and Recovery' -> ปุ่ม Edit ใน 'System Startup')
  2. คุณจะพบส่วนต่อไปนี้ (หรือคล้ายกัน) ในไฟล์:

    [ระบบปฏิบัติการ]

    หลาย (0) ดิสก์ (0) พาร์ติชัน rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect

  3. เปลี่ยนโดยเพิ่มแฟล็ก / onecpu:

    [ระบบปฏิบัติการ]

    หลาย (0) ดิสก์ (0) พาร์ติชัน rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu

  4. Reboot เมื่อคุณเล่นเสร็จแล้วให้ลบธงและรีบูตอีกครั้ง

วิธีที่ 0: ไม่ใช่วิธีที่ดี (ตัวประมวลผลความเกี่ยวข้อง)

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


วิธีที่ 2 ดูเหมือนจะไม่ทำงานบน Win7 D:\>bcdedit /set onecpuผลลัพธ์ในThe set command specified is not valid.....The parameter is incorrect.
สูงสุด

2
technet.microsoft.com/en-us/library/cc938636.aspxพูดว่า "... hard affinity ซึ่งหมายความว่ามาสก์ affinity ของโปรเซสเซอร์ จำกัด เธรดที่ได้รับผลกระทบจากมาสก์ affinity ไปยังโปรเซสเซอร์ที่ระบุโดย mask เธรดถูก จำกัด โดยฮาร์ด มาสก์ที่เกี่ยวข้องจะไม่ทำงานในโปรเซสเซอร์ที่ไม่รวมอยู่ในมาสก์ที่เกี่ยวข้อง " มีแหล่งใดที่บอกว่าจะไม่ได้รับความเคารพ?
Eugene Ryabtsev

4

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

def setaffinitymask(pid = None, mask = 1):
    """ Set The Affinity Mask of a Windows Process.  Affinity Mask is a value between 1-3 where
        1 is for core 0, 2 is for core 1, 3 is for both cores (it is a bitmap)
        Default sets the Affinity Mask to core 0 only
        python process can take any valid process ID. """

    import win32api, win32process, win32con

    if pid  == None:
        pid  = win32api.GetCurrentProcessId()
    if mask == None:
        mask = 1
    if mask  < 1 or mask > 3:
        mask = 1
        print 'process affinity mask out of range [1..3] setting it to 1'
    handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, True, pid)
    # see what mask is currently set to
    # processAffinityMask, systemAffinityMask = win32process.GetProcessAffinityMask(handle)
    # print 'process affinity mask = ', processAffinityMask, ', system affinity mask = ', systemAffinityMask
    # set affinity for process to mask value
    win32process.SetProcessAffinityMask(handle, mask) # 1=core 0, 2=core 1, 3=both
    processAffinityMask, systemAffinityMask = win32process.GetProcessAffinityMask(handle)
    #print 'process affinity mask = ', processAffinityMask, ', system affinity mask = ', systemAffinityMask

ไม่แน่ใจว่า OP ขอรหัสหรือไม่ ...
bytebuster

คุณเรียกใช้ฟังก์ชันนี้จากบรรทัดคำสั่งหรือไฟล์แบตช์ได้อย่างไร มีวิธีที่จะทราบหรือตั้งค่าไว้ล่วงหน้าว่า ID กระบวนการจะเป็นอย่างไร
posfan12

4

ใน Windows 8 คุณต้องไปที่แท็บรายละเอียดของตัวจัดการงานเพื่อตั้งค่าความสัมพันธ์ มันไม่ได้ให้ตัวเลือกแก่คุณในแท็บกระบวนการ

แก้ไข: นอกจากนี้หากโปรแกรมที่คุณต้องการเริ่มมีพารามิเตอร์หัวข้อนี้อาจมีประโยชน์: วิธีเริ่มโปรแกรมด้วยอาร์กิวเมนต์บรรทัดคำสั่งใน Windows 'cmd ด้วยคำสั่ง' start '?


4

เมื่อฉันค้นหาข้อมูลที่คล้ายกันโดยใช้ PowerShell ฉันพบข้อมูลที่ฉันต้องการที่นี่: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

คุณไม่ได้พูดถึงว่าคุณใช้ระบบปฏิบัติการ Windows รุ่นใด (ตัวเก่าไม่ได้มาพร้อมกับ PowerShell แม้ว่าคุณจะสามารถติดตั้งได้หากไม่มีอยู่)

ความรวดเร็วของมันคือใน PowerShell ความสัมพันธ์ของกระบวนการเป็นเพียงคุณสมบัติที่คุณสามารถเปลี่ยนได้อย่างง่ายดาย

หากต้องการดูคุณสมบัติ (และข้อมูลอื่น ๆ ) ของกระบวนการของคุณ (โดยใช้ foo เป็นกระบวนการตัวอย่าง) คำสั่ง PowerShell จะเป็น:

รับกระบวนการ foo | ได้รับการบริการสมาชิก

คุณจะเห็น ProcessorAffinity เป็นหนึ่งในคุณสมบัติเหล่านั้น การเปลี่ยนเป็นเรื่องเล็กน้อยและคุณสามารถเลือกแกนที่คุณต้องการรันโดยใช้ค่าจากตาราง / ลิงค์ของ Revolter ด้านบน

เพื่อดูว่ามูลค่าของทรัพย์สิน ProcessorAffinity สำหรับ foo นี่คือคำสั่ง:

(รับกระบวนการ foo) .ProcessorAffinity

ดังนั้นหากคุณต้องการรัน foo บน cpu 4 เท่านั้นคุณจะต้องตั้งค่าเช่น:

(Get-Process foo) .ProcessorAffinity = 8


ฉันไม่สามารถบอกได้จากคำอธิบายของคุณ: สิ่งนี้ใช้ได้กับกระบวนการที่มีอยู่หรือไม่ OP ไม่ต้องการเริ่มต้นกระบวนการจากนั้นตั้งค่าความสัมพันธ์ เขาต้องการเริ่มต้นกระบวนการด้วยความสัมพันธ์ที่ตั้งไว้แล้วในstart /affinityคำตอบ เทคนิคของคุณสามารถทำได้หรือไม่? ถ้าเป็นเช่นนั้นโปรดอธิบายวิธีการ
สกอตต์

2
@Scott กระบวนการที่มีอยู่เท่านั้น ในบริบทที่คุณให้คำตอบของฉันไม่ได้ช่วย ฉันรู้สึกว่า "การเริ่มต้นกระบวนการ" เป็นเรื่องของการเริ่มต้นกระบวนการและจากนั้นตั้งค่าความสัมพันธ์ของมันทันที IE: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 อย่างไรก็ตามหลังจากที่ได้อ่านความคิดเห็นของคุณและการค้นหาที่Start-Processมีการตั้งค่าสถานะความสัมพันธ์ที่ขาดหายไปตัวเองฉันมาพร้อมกับสิ่งต่อไปนี้ซึ่งฉันทดสอบ: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

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