किसी एकल CPU कोर के लिए एक प्रक्रिया को कैसे सीमित करें?


30

आप केवल बहु-कोर मशीन पर एक ही सीपीयू पर चलने के लिए विंडोज वातावरण में चलाए जाने वाले एकल प्रक्रिया कार्यक्रम को कैसे सीमित करते हैं?

क्या यह एक विंडो प्रोग्राम और कमांड लाइन प्रोग्राम के बीच समान है?

अद्यतन करें:

  • ऐसा करने का कारण: विभिन्न प्रोग्रामिंग भाषा पहलुओं को बेंचमार्क करना
  • मुझे ऐसी चीज़ की ज़रूरत है जो प्रक्रिया की शुरुआत से ही काम करेगी, इसलिए @ akseli का जवाब, हालाँकि अन्य मामलों के लिए बढ़िया है, इस मामले को हल नहीं करता है

2
तुम ऐसा क्यों करना चाहते हो? OS को यह तय करने दें कि कौन सा सीपीयू / कोर चलता है जो इसे और अधिक कुशल बनाने की प्रक्रिया करता है।
क्रिस 24

1
विभिन्न प्रोग्रामिंग भाषा पहलुओं को बेंचमार्क करने के लिए
जोनाथन

1
यह एक अच्छा कारण है - आपको अपने प्रश्न में उस जानकारी को शामिल करना चाहिए। यह महत्वपूर्ण है।
क्रिस एफएल

प्रेरणा आवश्यक नहीं है, लेकिन मैंने आपकी सलाह के बाद इसे जोड़ा
जोनाथन

1
हालाँकि, यह वह जानकारी हो सकती है, जिसके लिए किसी को उत्तर देने में सक्षम होना चाहिए।
क्रिस

जवाबों:


27

यदि आप Windows Vista / 7 (संभवतः XP, लेकिन निश्चित नहीं है) चला रहे हैं तो यह वास्तव में सरल है।

टाइप करें: Control+Shift+Escअपने कार्य करने वाले को ऊपर लाने के लिए।

प्रोसेस टैब पर क्लिक करें

उस प्रक्रिया को खोजें जिसमें उसके प्रोसेसर की आत्मीयता को बदलना आवश्यक है

प्रक्रिया पर राइट-क्लिक करें

"सेट एफिनिटी" पर क्लिक करें

यहां आप यह चुन सकते हैं कि कौन सा प्रोसेसर आपकी प्रक्रिया का उपयोग करेगा।

सौभाग्य!

EDIT: यह काम करने के लिए आपको प्रशासक होना चाहिए।


13
एक आत्मीयता कोई गारंटी नहीं है। प्रक्रियाएं इस प्रोसेसर को पसंद करेंगी, लेकिन अगर इसमें कई धागे हैं तो वे सभी वहां नहीं रहेंगे।
जोएल कोएहॉर्न

1
यह अच्छा है, लेकिन मुझे कुछ ऐसा चाहिए जो शुरू से ही नियतात्मक हो।
जोनाथन

2
@JoelCoehoorn: नहीं, यह है एक गारंटी। आप जिस बारे में बात कर रहे हैं वह पसंदीदा प्रोसेसर वेक्टर है, जो आत्मीयता वेक्टर से अलग है।
मेहरदाद

1
@ मेहरदाद: जब तक कार्यक्रम खुद इसे जो चाहे बदल देता है।
यूजीन रयबत्सेव

1
@JoelCoehoorn > थ्रेड एफिनिटी प्रोसेसर के एक विशेष उपसमुच्चय पर चलने के लिए थ्रेड को बाध्य करता है। - आपको लगता है कि लेख जो कहता है, वह एक थ्रेड आदर्श प्रोसेसर है
बॉब

19

कमांड लाइन से, उपयोग करें

प्रारंभ / आत्मीयता 1 program.exe

यह प्रोग्राम CPU को पहले 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
रिवाल्टर: क्या आप जानते हैं कि मैं सेवाओं के आरंभ के साथ भी ऐसा कर सकता हूं?
दिओगो

यदि आपके पास 4 से अधिक कोर हैं तो क्या होगा?
पॉज़फ़ान 12

7

निर्भर करता है कि आप क्या करने को तैयार हैं:

विधि 1: मांग पर

ImageCFG का उपयोग करें । यह उपयोगिता आपको किसी भी संख्या में कोर पर चलने के लिए एक निष्पादन योग्य सेटअप करने देगी। सुनिश्चित करें कि आप परिवर्तन करने से पहले अपने लक्ष्य को निष्पादन योग्य बना लें और जब आप इसके साथ खेल रहे हों तो इसे पुनर्स्थापित करें।

विधि 2: एक संपूर्ण Windows सत्र (Vista / 7) को बाध्य करें

  1. bcdedit /set onecpu onकमांड प्रॉम्प्ट पर टाइप करें
  2. सिस्टम को रिबूट करें।
  3. जब आप खेल कर रहे हों, तो 2 टाइप करें: टाइप करें bcdedit /set onecpu offऔर फिर से रिबूट करें।

विधि 2: एक संपूर्ण Windows सत्र (XP) को बाध्य करें

  1. अपनी बूट.इन फ़ाइल खोलें ('मेरा कंप्यूटर पर राइट-क्लिक करें -> गुण -> उन्नत टैब ->' स्टार्टअप और रिकवरी 'के तहत सेटिंग्स बटन ->' सिस्टम स्टार्टअप 'में बटन संपादित करें)।
  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. रीबूट। एक बार जब आप झंडा हटाने और फिर से रिबूट खेलने के लिए किया जाता है।

विधि 0: एक अच्छी विधि नहीं (प्रोसेसर एफिनिटी)

कुछ भी जो अन्यथा प्रोसेसर एफिनिटी को शामिल करता है एक अच्छा विकल्प नहीं है, मुझे डर है। प्रोसेसर के लिए प्रोसेसर का एक संबंध है। प्रोसेसर इसका सम्मान करने के लिए बाध्य नहीं है, और अक्सर नहीं होगा।


विधि 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 "... हार्ड आत्मीयता, जिसका अर्थ है कि प्रोसेसर आत्मीयता मुखौटा आत्मीयता से प्रभावित थ्रेड्स को मास्क द्वारा निर्दिष्ट प्रोसेसर को प्रभावित करता है। थ्रेड्स एक हार्ड द्वारा प्रतिबंधित है। एफिनिटी मास्क उन प्रोसेसर पर नहीं चलेगा जो एफिनिटी मास्क में शामिल नहीं हैं "। किसी भी स्रोत का कहना है कि इसका सम्मान नहीं किया जा रहा है?
यूजीन रयबत्सेव

4

मैंने अपने प्रोग्राम में पायथन 2.6 में निम्नलिखित फ़ंक्शन को रखा और यह विंडोज़ फ़ंक्शन को कॉल करता है। मेरी मशीन में केवल दो कोर हैं इसलिए आपको उस हिस्से को बदलने की आवश्यकता हो सकती है। टिप्पणियां आपको बताती हैं कि वर्तमान आत्मीयता कैसी है, यह देखना है। यह एकल कोर मशीन के लिए "जैसा है" काम करता है यदि आप 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

यकीन नहीं हुआ तो ओपी ने एक कोड मांगा ...
बाइटबस्टर

आप कमांड लाइन या बैच फ़ाइल से इस फ़ंक्शन को कैसे निष्पादित करते हैं? क्या पहले से जानने या निर्धारित करने का कोई तरीका है कि प्रक्रिया आईडी क्या होगी?
पॉज़फ़ान 12

4

विंडोज 8 में, आपको सेट एफिनिटी करने के लिए टास्क मैनेजर के विवरण टैब पर जाना होगा। यह आपको प्रक्रिया टैब पर विकल्प नहीं देता है।

EDIT: इसके अलावा, यदि आप जिस प्रोग्राम को शुरू करना चाहते हैं, उसमें पैरामीटर हैं, तो यह धागा काम आ सकता है: विंडोज 'cmd' पर कमांड लाइन आर्ग्युमेंट्स के साथ 'स्टार्ट' कमांड के साथ प्रोग्राम कैसे शुरू करें?


4

जैसा कि मैं PowerShell का उपयोग करते हुए बहुत ही समान जानकारी की तलाश में था, मुझे वह जानकारी मिली जिसकी मुझे यहाँ ज़रूरत थी: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

आपने उल्लेख नहीं किया कि आप कौन सा विंडोज ओएस इस्तेमाल कर रहे हैं, (पुराने वाले पॉवरशेल के साथ नहीं आए थे, हालांकि आप इसे स्थापित कर सकते हैं यदि यह वहां नहीं है)।

यह जल्दी है, यह है कि PowerShell में, प्रक्रिया संबंध केवल एक संपत्ति है जिसे आप आसानी से बदल सकते हैं।

आपकी प्रक्रिया के गुणों (और जानकारी के अन्य tidbits) को देखने के लिए (एक उदाहरण प्रक्रिया के रूप में foo का उपयोग करके), PowerShell कमांड होगी:

Get-Process foo | Get-सदस्य

आप देखेंगे प्रोसेसरऑफ़िनिटी उन गुणों में से एक है। इसे बदलना तुच्छ है, और आप रिवाल्टर की तालिका / लिंक से मानों का उपयोग करके यह चुन सकते हैं कि आप किस कोर पर चलना चाहते हैं।

यह देखने के लिए कि ProcessorAffinity प्रॉपर्टी का मूल्य foo के लिए क्या है, यहां कमांड है:

(गेट-प्रोसेस फू)

इसलिए यदि आप केवल सीपीयू 4 पर फू चलाना चाहते हैं, तो आप मान को इस तरह सेट करेंगे:

(गेट-प्रोसेस फू) ।प्रोसेसरऑफिनिटी = oo


मैं आपके स्पष्टीकरण से नहीं बता सकता: क्या यह केवल मौजूदा प्रक्रियाओं पर लागू होता है? ओपी एक प्रक्रिया शुरू नहीं करना चाहता है और फिर अपनी आत्मीयता निर्धारित करता है; वह उत्तर में पहले से ही निर्धारित अपनी आत्मीयता के साथ एक प्रक्रिया शुरू करना चाहता है start /affinity। क्या आपकी तकनीक ऐसा कर सकती है? यदि हां, तो कृपया बताएं कि कैसे।
स्कॉट

2
@ केवल मौजूदा प्रक्रियाएँ। आपके द्वारा दिए गए संदर्भ में, मेरा जवाब मदद नहीं करता है। मैंने महसूस किया कि "प्रक्रिया की बहुत शुरुआत", प्रक्रिया शुरू करने और फिर तुरंत इसकी आत्मीयता स्थापित करने का मामला था। IE: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 हालांकि, आपकी टिप्पणी को पढ़ने के बाद, और यह पाया कि Start-Processएक लापता आत्मीयता ध्वज है, मैं निम्नलिखित के साथ आया था, जिसे मैंने परीक्षण किया: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
Bewc

मेरा सुझाव है कि आप उस विकल्प को जोड़ने के लिए अपना उत्तर संपादित करें।
स्कॉट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.