Làm thế nào để giới hạn một quá trình trong một lõi CPU?


30

Làm thế nào để bạn giới hạn một chương trình xử lý duy nhất chạy trong môi trường Windows chỉ chạy trên một CPU duy nhất trên máy đa lõi?

Có giống nhau giữa chương trình cửa sổ và chương trình dòng lệnh không?

CẬP NHẬT:

  • Lý do để làm điều này: điểm chuẩn các khía cạnh ngôn ngữ lập trình khác nhau
  • Tôi cần một cái gì đó sẽ hoạt động ngay từ khi bắt đầu quá trình, do đó, câu trả lời của @ akseli, mặc dù rất tốt cho các trường hợp khác, không giải quyết được trường hợp của tôi

2
Tại sao bạn muốn làm nó? Để HĐH quyết định CPU / lõi nào chạy quá trình nào sẽ hiệu quả hơn nhiều.
ChrisF

1
để đánh giá các khía cạnh ngôn ngữ lập trình khác nhau
Jonathan

1
Đó là một lý do chính đáng - bạn nên đưa thông tin đó vào câu hỏi của mình. Nó quan trọng.
ChrisF

Động lực không phải là điều cần thiết, nhưng tôi đã thêm nó theo lời khuyên của bạn
Jonathan

1
Tuy nhiên, nó có thể là thông tin mà ai đó cần để có thể đưa ra câu trả lời.
ChrisF

Câu trả lời:


27

Nếu bạn đang chạy Windows Vista / 7 (có thể là XP, nhưng không chắc chắn) thì thực sự khá đơn giản.

Nhập vào: Control+Shift+Escđể có được taskmanager của bạn lên.

Nhấp vào tab Quy trình

Tìm quá trình cần thay đổi mối quan hệ bộ xử lý của nó

Nhấp chuột phải vào quá trình

Nhấp vào "Đặt mối quan hệ"

Tại đây bạn có thể chọn (các) bộ xử lý mà quy trình của bạn sẽ sử dụng.

Chúc may mắn!

EDIT: Bạn phải là quản trị viên để làm việc này.


13
Một mối quan hệ không phải là một sự đảm bảo. Các quy trình sẽ thích bộ xử lý này, nhưng nếu nó có một số luồng thì tất cả chúng sẽ không ở đó.
Joel Coehoorn

1
Điều này là tốt, nhưng tôi cần một cái gì đó sẽ mang tính quyết định ngay từ đầu
Jonathan

2
@JoelCoehoorn: Không, đó một sự đảm bảo. Những gì bạn đang nói là vectơ bộ xử lý ưa thích , khác với vectơ ái lực.
Mehrdad

1
@Mehrdad: trừ khi chính chương trình thay đổi nó thành bất cứ điều gì nó sẽ làm.
Eugene Ryabtsev

1
@JoelCoehoorn > Mối quan hệ luồng buộc một luồng chạy trên một tập hợp con cụ thể của bộ xử lý. - bạn dường như đang đề cập đến những gì bài báo nói là một bộ xử lý lý tưởng .
Bob

19

từ dòng lệnh, sử dụng

bắt đầu / ái lực 1 chương trình.exe

cái này sẽ chạy chương trình.exe trên CPU đầu tiên vì "1" là giá trị hex của mặt nạ ái lực

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: Bạn có biết nếu tôi có thể làm tương tự với khởi tạo Dịch vụ không?
Diogo

Nếu bạn có nhiều hơn 4 lõi thì sao?
posfan12

7

Phụ thuộc vào những gì bạn sẵn sàng làm:

Cách 1: Theo yêu cầu

Sử dụng ImageCFG . Tiện ích này sẽ cho phép bạn thiết lập một tệp thực thi để chạy trên bất kỳ số lượng lõi nào. Hãy chắc chắn rằng bạn sao lưu mục tiêu thực thi trước khi thực hiện các thay đổi và khôi phục nó khi bạn hoàn thành việc chơi với nó.

Phương pháp 2: Buộc toàn bộ Phiên Windows (Vista / 7)

  1. bcdedit /set onecpu onvào dấu nhắc lệnh
  2. Khởi động lại hệ thống.
  3. Khi bạn chơi xong, gõ 2 - Gõ: bcdedit /set onecpu offvà khởi động lại.

Phương pháp 2: Buộc toàn bộ Phiên Windows (XP)

  1. Mở tệp boot.ini của bạn (Nhấp chuột phải vào Máy tính của tôi -> Thuộc tính -> Tab nâng cao -> nút Cài đặt trong 'Khởi động và khôi phục' -> Nút chỉnh sửa trong 'Khởi động hệ thống').
  2. Bạn sẽ tìm thấy phần sau (hoặc tương tự) trong tệp:

    [các hệ điều hành]

    phân vùng nhiều (0) đĩa (0) rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect

  3. Thay đổi nó bằng cách thêm cờ / onecpu:

    [các hệ điều hành]

    phân vùng nhiều (0) đĩa (0) rdisk (0) (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu

  4. Khởi động lại. Khi bạn đã chơi xong, gỡ cờ và khởi động lại.

Phương pháp 0: Không phải là một phương pháp tốt (Quan hệ bộ xử lý)

Bất cứ điều gì khác liên quan đến Bộ xử lý không phải là một lựa chọn tốt, tôi sợ. Ái lực của bộ xử lý là một đầu mối của bộ xử lý. Bộ xử lý không bắt buộc phải tôn trọng nó, và thường sẽ không.


Phương pháp 2 dường như không hoạt động trên Win7. D:\>bcdedit /set onecpukết quả trong The set command specified is not valid.....The parameter is incorrect.
tối đa

2
technet.microsoft.com/en-us/l Library / cc938636.aspx nói "... mối quan hệ cứng, có nghĩa là mặt nạ ái lực của bộ xử lý hạn chế các luồng bị ảnh hưởng bởi mặt nạ ái lực đối với bộ xử lý được chỉ định bởi mặt nạ. mặt nạ ái lực sẽ không chạy trên các bộ xử lý không có trong mặt nạ ái lực ". Bất kỳ nguồn nào nói rằng nó sẽ không được tôn trọng?
Eugene Ryabtsev

4

Tôi đặt hàm sau trong chương trình của mình vào python 2.6 và nó gọi các hàm windows. Máy của tôi chỉ có hai lõi nên bạn có thể cần thay đổi phần đó. Các ý kiến ​​cho bạn biết làm thế nào để xem mối quan hệ hiện tại là gì. Nó hoạt động "như hiện tại" cho một máy lõi đơn nếu bạn đặt hoặc mặc định là mặt nạ 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

Không chắc chắn nếu OP yêu cầu mã ...
bytebuster

Làm thế nào để bạn thực hiện chức năng này từ dòng lệnh hoặc tệp bó? Có cách nào để biết hoặc đặt trước ID tiến trình sẽ là gì không?
posfan12


4

Khi tôi tìm kiếm thông tin rất giống nhau bằng PowerShell, tôi đã tìm thấy thông tin tôi cần ở đây: http://www.energizedtech.com/2010/07/powershell-setting- Processor-a.html

Bạn đã không đề cập đến hệ điều hành Windows nào bạn đang sử dụng, (Những cái cũ hơn không đi kèm với PowerShell, mặc dù bạn có thể cài đặt nó nếu không có).

Sự nhanh chóng của nó, là trong PowerShell, mối quan hệ quá trình đơn giản là một thuộc tính bạn có thể thay đổi dễ dàng.

Để xem các thuộc tính (và các thông tin khác về thông tin) của quy trình của bạn (sử dụng foo làm quy trình ví dụ), lệnh PowerShell sẽ là:

Nhận quy trình | Nhận thành viên

Bạn sẽ thấy ProcessorAffinity là một trong những tính chất đó. Thay đổi nó là chuyện nhỏ và bạn có thể chọn lõi nào bạn muốn chạy, sử dụng các giá trị từ bảng / liên kết của Revolter ở trên.

Để xem giá trị của thuộc tính ProcessorAffinity dành cho foo, đây là lệnh:

(Get-Process foo) .ProcessorAffinity

Vì vậy, nếu bạn chỉ muốn chạy foo trên cpu 4, bạn sẽ đặt giá trị như sau:

(Get-Process foo) .ProcessorAffinity = 8


Tôi không thể nói từ lời giải thích của bạn: điều này chỉ áp dụng cho các quy trình hiện có? OP không muốn bắt đầu một quy trình và sau đó thiết lập mối quan hệ của nó; anh ta muốn bắt đầu một quá trình với mối quan hệ đã được đặt ra , như trong start /affinitycâu trả lời. Kỹ thuật của bạn có thể làm điều đó? Nếu vậy, hãy giải thích làm thế nào.
Scott

2
@Scott Chỉ các quy trình hiện có. Trong ngữ cảnh bạn cung cấp, câu trả lời của tôi không giúp được gì. Tôi cảm thấy rằng "rất bắt đầu của quá trình", là một vấn đề bắt đầu quá trình và sau đó ngay lập tức thiết lập mối quan hệ của nó. IE: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 Tuy nhiên, sau khi đọc bình luận của bạn và phát hiện Start-Processcó một lá cờ ái lực bị thiếu, tôi đã đưa ra những điều sau đây, mà tôi đã kiểm tra: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

Tôi đề nghị bạn chỉnh sửa câu trả lời của bạn để thêm phương án đó.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.