Bagaimana membatasi proses pada satu inti CPU?

30

Bagaimana Anda membatasi program proses tunggal yang berjalan di lingkungan Windows untuk berjalan hanya pada CPU tunggal pada mesin multi-core?

Apakah sama antara program berjendela dan program baris perintah?

MEMPERBARUI:

  • Alasan untuk melakukan ini: membandingkan berbagai aspek bahasa pemrograman
  • Saya memerlukan sesuatu yang akan bekerja sejak awal proses, oleh karena itu jawaban @ akseli, meskipun bagus untuk kasus lain, tidak menyelesaikan kasus saya
Jonathan
sumber
2
Mengapa Anda ingin melakukan ini? Membiarkan OS memutuskan CPU / core mana yang menjalankan proses itu akan jauh lebih efisien.
ChrisF
1
untuk membandingkan berbagai aspek bahasa pemrograman
Jonathan
1
Itu alasan yang bagus - Anda harus memasukkan informasi itu dalam pertanyaan Anda. Ini penting.
ChrisF
Motivasi tidak penting, tetapi saya menambahkannya mengikuti saran Anda
Jonathan
1
Namun, itu mungkin informasi yang dibutuhkan seseorang untuk dapat memberikan jawaban.
ChrisF

Jawaban:

27

Jika Anda menjalankan Windows Vista / 7 (mungkin XP, tetapi tidak yakin) itu sangat sederhana.

Ketik: Control+Shift+Escuntuk mengaktifkan pengelola tugas Anda.

Klik pada tab Proses

Temukan proses yang membutuhkan afinitas prosesornya berubah

Klik kanan pada prosesnya

Klik pada "Set Affinity"

Di sini Anda dapat memilih prosesor mana yang akan digunakan proses Anda.

Semoga berhasil!

EDIT: Anda harus menjadi administrator untuk menjalankannya.

akseli
sumber
13
Afinitas bukan jaminan. Proses akan lebih memilih prosesor ini, tetapi jika memiliki beberapa utas, mereka tidak akan tinggal di sana.
Joel Coehoorn
1
Ini bagus, tapi saya butuh sesuatu yang akan menjadi deterministik sejak awal
Jonathan
2
@ JoelCoehoorn: Tidak, itu adalah jaminan. Apa yang Anda bicarakan adalah vektor prosesor yang disukai , yang berbeda dari vektor afinitas.
Mehrdad
1
@Mehrdad: kecuali program itu sendiri mengubahnya ke apa pun yang diinginkannya.
Eugene Ryabtsev
1
@ JoelCoehoorn > Afinitas thread memaksa utas untuk berjalan pada subset prosesor tertentu. - Anda tampaknya merujuk pada apa yang dikatakan artikel tersebut sebagai prosesor thread yang ideal .
Bob
19

dari baris perintah, gunakan

mulai / afinitas 1 program.exe

ini akan menjalankan program.exe pada CPU pertama sebagai "1" adalah nilai hex dari topeng afinitas

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 

sumber
1
Revolter: Tahukah Anda jika saya dapat melakukan hal yang sama dengan inisialisasi Layanan?
Diogo
Bagaimana jika Anda memiliki lebih dari 4 core?
posfan12
7

Tergantung pada apa yang ingin Anda lakukan:

Metode 1: Sesuai permintaan

Gunakan ImageCFG . Utilitas ini akan memungkinkan Anda mensetup sebuah executable untuk dijalankan pada sejumlah core. Pastikan Anda mencadangkan target yang dapat dieksekusi sebelum melakukan perubahan dan mengembalikannya setelah Anda selesai memainkannya.

Metode 2: Memaksa seluruh Sesi Windows (Vista / 7)

  1. Ketik bcdedit /set onecpu onpada prompt perintah
  2. Mulai ulang sistem.
  3. Setelah selesai bermain, ketik 2 - Ketik: bcdedit /set onecpu offdan reboot lagi.

Metode 2: Memaksa seluruh Sesi Windows (XP)

  1. Buka file boot.ini Anda (Klik kanan Komputer Saya -> Properti -> Tab Lanjut -> tombol Pengaturan di bawah 'Startup dan Pemulihan' -> tombol Edit di 'Startup Sistem').
  2. Anda akan menemukan bagian berikut (atau serupa) dalam file:

    [sistem operasi]

    multi (0) disk (0) rdisk (0) partisi (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect

  3. Ubah dengan menambahkan flag / onecpu:

    [sistem operasi]

    multi (0) disk (0) rdisk (0) partisi (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu

  4. Mulai ulang. Setelah selesai bermain hapus bendera dan reboot lagi.

Metode 0: Bukan metode yang baik (Prosesor Affinity)

Apa pun yang melibatkan Prosesor Affinity bukanlah pilihan yang baik, saya khawatir. Afinitas prosesor adalah petunjuk untuk prosesor. Prosesor tidak berkewajiban untuk menghormatinya, dan seringkali tidak.

A Dwarf
sumber
Metode 2 sepertinya tidak berfungsi pada Win7. D:\>bcdedit /set onecpuhasil dalam The set command specified is not valid.....The parameter is incorrect.
maks
2
technet.microsoft.com/en-us/library/cc938636.aspx mengatakan "... afinitas keras, yang berarti bahwa topeng afinitas prosesor membatasi benang yang dipengaruhi oleh topeng afinitas ke prosesor yang ditentukan oleh topeng. Thread dibatasi oleh hard topeng afinitas tidak akan berjalan pada prosesor yang tidak termasuk dalam topeng afinitas ". Adakah sumber yang mengatakan bahwa itu tidak akan dihormati?
Eugene Ryabtsev
4

Saya menempatkan fungsi berikut dalam program saya di python 2.6 dan itu memanggil fungsi windows. Mesin saya hanya memiliki dua inti sehingga Anda mungkin perlu mengubah bagian itu. Komentar memberi tahu Anda cara melihat apa yang menjadi pertalian saat ini. Ini berfungsi "sebagaimana adanya" untuk mesin inti tunggal jika Anda menetapkan atau default ke topeng 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
Marichyasana
sumber
Tidak yakin apakah OP meminta kode ...
bytebuster
Bagaimana Anda menjalankan fungsi ini dari baris perintah atau file batch? Apakah ada cara untuk mengetahui atau menetapkan sebelumnya apa proses ID akan?
posfan12
4

Ketika saya mencari informasi yang sangat mirip menggunakan PowerShell, saya menemukan informasi yang saya butuhkan di sini: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

Anda tidak menyebutkan OS Windows yang Anda gunakan, (Yang lebih tua tidak datang dengan PowerShell, meskipun Anda dapat menginstalnya jika tidak ada di sana).

Cepatnya, adalah bahwa di PowerShell, proses afinitas hanyalah sebuah properti yang dapat Anda ubah dengan mudah.

Untuk melihat properti (dan informasi menarik lainnya) dari proses Anda (menggunakan foo sebagai contoh proses), perintah PowerShell adalah:

Dapatkan-Proses foo | Dapatkan Anggota

Anda akan melihat ProcessorAffinity adalah salah satu properti itu. Mengubahnya sepele, dan Anda dapat memilih inti yang ingin Anda jalankan, menggunakan nilai-nilai dari tabel / tautan Revolter di atas.

Untuk melihat apa nilai properti ProcessorAffinity untuk foo, inilah perintahnya:

(Dapatkan-Proses foo) .ProcessorAffinity

Jadi jika Anda ingin menjalankan foo hanya pada cpu 4, Anda akan menetapkan nilainya seperti:

(Dapatkan-Proses foo) .ProcessorAffinity = 8

Bewc
sumber
Saya tidak tahu dari penjelasan Anda: apakah ini hanya berlaku untuk proses yang ada? OP tidak ingin memulai suatu proses dan kemudian menetapkan afinitasnya; ia ingin memulai suatu proses dengan afinitasnya yang telah ditetapkan , seperti dalam start /affinityjawabannya. Bisakah teknik Anda melakukannya? Jika demikian, tolong jelaskan caranya.
Scott
2
@Scott Hanya proses yang ada. Dalam konteks yang Anda berikan, jawaban saya tidak membantu. Saya merasa bahwa "sangat awal dari proses", adalah masalah memulai proses & kemudian segera mengatur afinitasnya. IE: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 Namun, setelah membaca komentar Anda, dan menemukan yang Start-Processmemiliki bendera afinitas yang hilang itu sendiri, saya datang dengan yang berikut, yang saya uji: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc
Saya sarankan Anda mengedit jawaban Anda untuk menambahkan alternatif itu.
Scott