Bir işlem tek bir CPU çekirdeği ile nasıl sınırlanır?


30

Windows ortamında çalışan tek bir işlem programını çok çekirdekli bir makinede yalnızca tek bir CPU'da çalışacak şekilde nasıl sınırlandırırsınız?

Pencereli bir program ile komut satırı programı arasında aynı mıdır?

GÜNCELLEŞTİRME:

  • Bunu yapmanın nedeni: çeşitli programlama dilleri yönlerinin kıyaslanması
  • Sürecin başından itibaren işe yarayacak bir şeye ihtiyacım var, bu nedenle @ akseli'nin cevabı, diğer durumlar için harika olsa da davamı çözmüyor

2
Bunu neden yapmak istiyorsun? İşletim sisteminin hangi CPU / çekirdeğin çalıştıracağına karar vermesine izin vermek, bu işlemin daha verimli olacağına işaret eder.
ChrisF

1
çeşitli programlama dili yönleriyle kıyaslama yapmak için
Jonathan

1
Bu iyi bir sebep - bu bilgiyi sorunuza eklemeliydiniz. Bu önemli.
ChrisF

Motivasyon esastır, ancak tavsiyenize uyarak ekledim
Jonathan

1
Ancak, birisinin cevap verebilmesi için ihtiyaç duyduğu bilgi olabilir.
ChrisF,

Yanıtlar:


27

Windows Vista / 7 (muhtemelen XP, ancak emin değil) kullanıyorsanız, gerçekten oldukça basit.

Control+Shift+EscGörev yöneticinizi çalıştırmak için : yazın.

İşlemler sekmesine tıklayın

İşlemci benzeşiminin değişmesi gereken süreci bulun

Süreci sağ tıklayın

"Affinity Ayarla" üzerine tıklayın

Burada, işleminizin hangi işlemcileri kullanacağını seçebilirsiniz.

İyi şanslar!

EDIT: Bunun işe yaraması için yönetici olmanız gerekir.


13
Bir yakınlık bir garanti değildir. İşlemler bu işlemciyi tercih edecek, ancak birkaç iş parçacığı varsa hepsi orada kalmayacak.
Joel Coehoorn

1
Bu iyi, ama baştan itibaren deterministik olacak bir şeye ihtiyacım var
Jonathan

2
@JoelCoehoorn: Hayır, olan bir garanti. Bahsettiğiniz şey, yakınlık vektöründen farklı olan tercih edilen işlemci vektörüdür.
Mehrdad

1
@Mehrdad: Programın kendisi ne olursa olsun onu değiştirmiyorsa.
Eugene Ryabtsev

1
@JoelCoehoorn > İplik afinitesi, bir iş parçacığını belirli bir işlemci alt kümesinde çalışmaya zorlar. - bu makalenin söylediklerine atıfta bulunuyorsunuz gibi bir iş parçacığı ideal bir işlemci .
Bob

19

komut satırından kullan

start / affinity 1 program.exe

Bu, ilk CPU'daki program.exe dosyasını çalıştıracaktır çünkü "1", yakınlık maskesinin hex değeridir.

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
Tabanca: Hizmetler'in başlatılması ile aynı şeyi yapabileceğimi biliyor musunuz?
Diogo

Ya 4'ten fazla çekirdeğiniz varsa?
posfan12

7

Ne yapmak istediğinize bağlı:

Yöntem 1: İstek üzerine

ImageCFG kullanın . Bu yardımcı program, herhangi bir sayıda çekirdek üzerinde çalışacak şekilde yürütülebilir bir dosya ayarlamanıza izin verir. Değişiklikleri yapmadan önce hedef yürütülebilir dosyalarınızı yedeklediğinizden emin olun ve oynamayı bitirdiğinizde geri yükleyin.

Yöntem 2: Tüm bir Windows oturumu zorla (Vista / 7)

  1. Tip bcdedit /set onecpu onkomut istemini üzerinde
  2. Sistemi yeniden başlatın.
  3. Çalmayı tamamladığınızda 2 - Type: yazın bcdedit /set onecpu offve yeniden başlatın.

Yöntem 2: Tüm bir Windows oturumu zorla (XP)

  1. Boot.ini dosyanızı açın ('Sistem Başlangıcında' Başlat ve Kurtarma '-> Düzenle düğmesi altındaki' Bilgisayarım -> Özellikler -> Gelişmiş Sekmesi -> Ayarlar düğmesini sağ tıklayın).
  2. Dosyada aşağıdaki (veya benzer) bölümü bulacaksınız:

    [işletim sistemleri]

    çoklu (0) disk (0) rdisk (0) bölüm (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect

  3. / Onecpu bayrağını ekleyerek değiştirin:

    [işletim sistemleri]

    çoklu (0) disk (0) rdisk (0) bölüm (2) \ WINDOWS = "Microsoft Windows XP Professional" / fastdetect / onecpu

  4. Yeniden Başlatma. Oynama bittikten sonra bayrağı kaldırın ve yeniden başlatın.

Yöntem 0: İyi bir yöntem değil (İşlemci benzeşimi)

Başka türlü İşlemci Benzeşimi içeren herhangi bir şey iyi bir seçenek değildir, korkarım. İşlemci benzeşimi işlemci için bir ipucudur. İşlemci saygı duymak zorunda değildir ve çoğu zaman kabul etmez.


Yöntem 2, Win7 üzerinde çalışmıyor gibi görünüyor. D:\>bcdedit /set onecpusonuçları The set command specified is not valid.....The parameter is incorrect.
en fazla

2
technet.microsoft.com/en-us/library/cc938636.aspx diyor ki: "... zor afinite, bu, işlemci afinite maskesinin afinite maskesinden etkilenen dişlileri, maske tarafından belirtilen işlemcilere sınırlandırdığı anlamına gelir. yakınlık maskesi, yakınlık maskesinde bulunmayan işlemciler üzerinde çalışmayacak ". Buna saygı gösterilmeyeceğini söyleyen herhangi bir kaynak var mı?
Eugene Ryabtsev 28:13

4

Aşağıdaki işlevi programımda python 2.6'da kullanıyorum ve windows fonksiyonlarını çağırıyor. Makinemin sadece iki çekirdeği var, o yüzden bu parçayı değiştirmeniz gerekebilir. Yorumlar, şu anki yakınlığın ne olduğunu nasıl göreceğinizi açıklar. 1 maskesini ayarlarsanız veya varsayılan olarak ayarlarsanız, tek bir çekirdekli makine için "olduğu gibi" çalışır.

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 bir kod isterse emin değil ...
bytebuster

Bu işlevi komut satırından veya toplu iş dosyasından nasıl uygularsınız? İşlem kimliğinin ne olacağını önceden bilmenin veya ayarlamanın bir yolu var mı?
posfan12


4

PowerShell kullanarak çok benzer bilgiler aramaya başladığımda, burada ihtiyacım olan bilgiyi buldum: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

Hangi Windows işletim sistemini kullandığınızdan bahsetmediniz, (Eskileri PowerShell ile gelmedi, ancak orada değilse kurabilirsiniz).

Hızlı olanı, PowerShell'de işlem benzeşiminin sadece kolayca değiştirebileceğiniz bir özellik olmasıdır.

İşleminizin özelliklerini (ve diğer bilgi gruplarını) görmek için (örnek bir işlem olarak foo kullanarak), PowerShell komutu şöyle olacaktır:

Get-Process foo | Get-Üye

ProcessorAffinity'in bu özelliklerden biri olduğunu göreceksiniz. Bunu değiştirmek önemsizdir ve yukarıdaki Çekirdek tablosundaki / bağlantısındaki değerleri kullanarak çalıştırmak istediğiniz çekirdeği seçebilirsiniz.

ProcessorAffinity özelliğinin foo için değerinin ne olduğunu görmek için işte komut:

(Get-Process foo). İşlemciAffeliği

Eğer sadece cpu 4'te foo çalıştırmak isteseydiniz, değeri şu şekilde ayarlarsınız:

(Get-Process foo) .ProcessorAffinity = 8


Açıklamanızdan söyleyemem: bu sadece mevcut süreçler için geçerli mi? OP bir süreç başlatmak istemez ve yakınlığını belirler; Cevabında olduğu gibi , yakınlığı belirlenmiş bir sürece başlamak istiyor start /affinity. Tekniğin bunu yapabilir mi? Eğer öyleyse, lütfen nasıl olduğunu açıkla.
Scott,

2
@Scott Yalnızca mevcut işlemler. Verdiğiniz bağlamda, cevabım yardımcı olmuyor. "Sürecin başlaması" nın, süreci başlatma ve sonra hemen yakınlığını belirleme meselesi olduğunu hissettim. IE: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 Ancak, yorumunuzu okuduktan ve Start-Processkendisinin eksik bir afinite bayrağına sahip olduğunu tespit ettikten sonra , test ettiğim aşağıdakileri gördüm:[System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

Bu alternatifi eklemek için cevabınızı düzenlemenizi öneririm.
Scott,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.