কিভাবে একটি একক সিপিইউ কোর একটি প্রক্রিয়া সীমাবদ্ধ?


30

উইন্ডোজ পরিবেশে চালিত একটি একক প্রক্রিয়া প্রোগ্রামকে কেবলমাত্র একক সিপিইউতে মাল্টি-কোর মেশিনে চালানোর জন্য কীভাবে সীমাবদ্ধ করবেন?

এটি কি উইন্ডোযুক্ত প্রোগ্রাম এবং কমান্ড লাইন প্রোগ্রামের মধ্যে একই?

হালনাগাদ:

  • এটি করার কারণ: বিভিন্ন প্রোগ্রামিং ভাষার দিকগুলি বেঞ্চমার্ক করা
  • আমার এমন কিছু দরকার যা প্রক্রিয়াটির খুব প্রথম থেকেই কাজ করে, তাই @ আকসেলির উত্তর, যদিও অন্যান্য ক্ষেত্রে দুর্দান্ত তবে আমার মামলাটি সমাধান করে না

2
আপনি কেন এটা করতে চান? কোন সিপিইউ / কোর রান করে কোন প্রসেসটি এটি আরও কার্যকর হতে চলেছে তা ওএসকে সিদ্ধান্ত দেওয়া decide
ChrisF

1
বিভিন্ন প্রোগ্রামিং ভাষার দিকগুলি বেনমার্ক করার জন্য
জোনাথন

1
এটি একটি ভাল কারণ - আপনার প্রশ্নটিতে আপনার সেই তথ্যটি অন্তর্ভুক্ত করা উচিত ছিল। এটা গুরুত্বপূর্ণ.
ChrisF

অনুপ্রেরণা অপরিহার্য নয়, তবে আমি আপনার পরামর্শ অনুসরণ করে এটি যুক্ত করেছি
জোনাথন

1
যাইহোক, এটি একটি উত্তর প্রদান করতে সক্ষম হতে হবে এমন তথ্য হতে পারে।
ChrisF

উত্তর:


27

যদি আপনি উইন্ডোজ ভিস্তা / 7 চালাচ্ছেন (সম্ভবত এক্সপি, তবে নিশ্চিত না) তবে এটি সত্যিই সহজ।

Control+Shift+Escআপনার টাস্ক ম্যানেজারটি পেতে টাইপ করুন:

প্রক্রিয়া ট্যাবে ক্লিক করুন

যে প্রক্রিয়াটির প্রসেসরের সাদৃশ্য বদলাতে হবে তার সন্ধান করুন

প্রক্রিয়া ডান ক্লিক করুন

"সেট অফ অ্যাফিনিটি" এ ক্লিক করুন

আপনার প্রক্রিয়াটি কোন প্রসেসর ব্যবহার করবে তা আপনি এখানে নির্বাচন করতে পারেন।

শুভকামনা!

সম্পাদনা: এটি কাজ করতে আপনাকে প্রশাসক হতে হবে।


13
একটি আত্মীয়তা গ্যারান্টি নয়। প্রক্রিয়াগুলি এই প্রসেসরটিকে পছন্দ করবে, তবে এর যদি বেশ কয়েকটি থ্রেড থাকে তবে তারা সমস্ত সেখানে থাকবে না।
জোয়েল কোহোর্ন

1
এটি ভাল, তবে আমার এমন কিছু দরকার যা শুরু থেকেই
জোনাথন

2
@JoelCoehoorn: না, এটা হয় একটি গ্যারান্টি। আপনি যে বিষয়ে কথা বলছেন তা হ'ল পছন্দসই প্রসেসর ভেক্টর, যা অ্যাফিনিটি ভেক্টর থেকে আলাদা।
মেহরদাদ

1
@ মেহরদাদ: যদি না প্রোগ্রাম নিজেই যা কিছু পরিবর্তন করে তা পরিবর্তন করে।
ইউজিন রায়বতসেভ

1
@ জোয়েলকোহর্ন > থ্রেড অ্যাফিনিটি থ্রেডকে প্রসেসরের একটি নির্দিষ্ট উপসেটে চালিত করতে বাধ্য করে। - আপনি যে নিবন্ধটি বলেছে এটি একটি থ্রেড আদর্শ প্রসেসর বলে উল্লেখ করছে ।
বব

19

কমান্ড লাইন থেকে, ব্যবহার করুন

start / affinity 1 program.exe

এটি প্রথম সিপিইউতে প্রোগ্রাম। এক্সে চালাবে কারণ "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 টিরও বেশি কোর থাকে?
posfan12

7

আপনি যা করতে ইচ্ছুক তার উপর নির্ভর করে:

পদ্ধতি 1: চাহিদা অনুযায়ী

ইমেজসিএফজি ব্যবহার করুন । এই ইউটিলিটি আপনাকে কোনও সংখ্যক কোরে চালানোর জন্য একটি নির্বাহযোগ্য সেটআপ করতে দেয়। পরিবর্তনগুলি করার আগে আপনি নির্ধারিত আপনার টার্গেটটিকে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন এবং এটি খেলার সাথে শেষ হয়ে গেলে এটি পুনরুদ্ধার করুন।

পদ্ধতি 2: একটি সম্পূর্ণ উইন্ডোজ সেশন জোর করুন (ভিস্তা / 7)

  1. bcdedit /set onecpu onএকটি কমান্ড প্রম্পটে টাইপ করুন
  2. সিস্টেমটি পুনরায় বুট করুন।
  3. আপনি খেলতে শেষ হয়ে গেলে 2 - টাইপ করুন: bcdedit /set onecpu offএবং পুনরায় বুট করুন।

পদ্ধতি 2: একটি সম্পূর্ণ উইন্ডোজ সেশন জোর করে (এক্সপি)

  1. আপনার boot.ini ফাইলটি খুলুন ('স্টার্টআপ এবং পুনরুদ্ধার' এর অধীনে সেটিংস বোতাম -> প্রোপার্টি -> অ্যাডভান্সড ট্যাব -> 'সিস্টেম স্টার্টআপ'-এ সম্পাদনা বোতাম) ডান ক্লিক করুন।
  2. আপনি ফাইলটিতে নিম্নলিখিত (বা অনুরূপ) বিভাগটি পাবেন:

    [অপারেটিং সিস্টেম]

    মাল্টি (0) ডিস্ক (0) rdisk (0) পার্টিশন (2) I WINDOWS = "মাইক্রোসফ্ট উইন্ডোজ এক্সপি পেশাদার" / ফাস্টডিটেক্ট

  3. / Onecpu পতাকা যুক্ত করে এটি পরিবর্তন করুন:

    [অপারেটিং সিস্টেম]

    মাল্টি (0) ডিস্ক (0) rdisk (0) পার্টিশন (2) I উইন্ডোস = "মাইক্রোসফ্ট উইন্ডোজ এক্সপি পেশাদার" / ফাস্টডিটেক্ট / অনেকপু

  4. পুনরায় বুট করুন। একবার আপনি খেলাটি শেষ হয়ে গেলে পতাকাটি সরিয়ে আবার রিবুট করুন।

পদ্ধতি 0: একটি ভাল পদ্ধতি নয় (প্রসেসরের অ্যাফিনিটি)

অন্যথায় প্রসেসর অ্যাফিনিটি জড়িত যে কোনও কিছুই ভাল বিকল্প নয়, আমি ভীত। প্রসেসরের অ্যাফিনিটি প্রসেসরের একটি ক্লু। প্রসেসর এটি সম্মান করতে বাধ্য নয়, এবং প্রায়শই তা করবে না।


পদ্ধতি 2 টি উইন 7 এ কাজ করছে বলে মনে হচ্ছে না। D:\>bcdedit /set onecpuফলাফল The set command specified is not valid.....The parameter is incorrect.
সর্বাধিক

2
টেকনেট.মাইক্রোসফট.ইন- ইউস / লিবারি / সিসি 938636.aspx বলেছে "... হার্ড অ্যাফিনিটি, অর্থাত্ প্রসেসরের অ্যাফিনিটি মাস্কটি মাস্ক দ্বারা নির্দিষ্ট হওয়া প্রসেসরের কাছে অ্যাফিনিটি মাস্ক দ্বারা প্রভাবিত থ্রেডগুলিকে সীমাবদ্ধ করে দেয় Th অ্যাফিনিটি মাস্ক প্রসেসরগুলিতে চলবে না যেগুলি অ্যাফিনিটি মাস্কে অন্তর্ভুক্ত নয় "। কোনও উত্স বলছে এটি সম্মান করা যাচ্ছে না?
ইউজিন রায়বটসেভ

4

আমি আমার প্রোগ্রামটিতে পাইথন ২.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

নিশ্চিত না যে ওপি একটি কোড চেয়েছে ...
বাইটবাস্টার

কমান্ড লাইন বা ব্যাচ ফাইল থেকে আপনি এই ফাংশনটি কীভাবে সম্পাদন করবেন? প্রক্রিয়া আইডি কী হবে তা আগেই জানার বা সেট করার কোনও উপায় আছে?
posfan12

4

উইন্ডোজ 8-এ, আপনাকে অ্যাপিটিটি সেট করতে টাস্ক ম্যানেজারের বিশদ ট্যাবে যেতে হবে। এটি আপনাকে প্রক্রিয়া ট্যাবে বিকল্প দেয় না।

সম্পাদনা: এছাড়াও, আপনি যে প্রোগ্রামটি শুরু করতে চান তাতে যদি প্যারামিটার থাকে তবে এই থ্রেডটি কাজে লাগতে পারে: উইন্ডোজে 'কমান্ড' দিয়ে 'স্টার্ট' কমান্ড দিয়ে কমান্ড লাইন আর্গুমেন্ট যুক্ত একটি প্রোগ্রাম কীভাবে শুরু করতে পারি?


4

পাওয়ারশেল ব্যবহার করে আমি খুব অনুরূপ তথ্যের সন্ধান করতে গিয়ে আমার এখানে প্রয়োজনীয় তথ্যগুলি খুঁজে পেয়েছি: http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

আপনি কোন উইন্ডোজ ওএস ব্যবহার করছেন তা উল্লেখ করেননি, (পুরানোগুলি পাওয়ারশেলের সাথে আসে নি, যদিও এটি না থাকলে আপনি এটি ইনস্টল করতে পারেন)।

এটির দ্রুততা, পাওয়ারশেলের ক্ষেত্রে প্রক্রিয়া সংযুক্তি হ'ল এমন একটি সম্পত্তি যা আপনি সহজেই পরিবর্তন করতে পারেন।

আপনার প্রক্রিয়াটির বৈশিষ্ট্যগুলি (এবং তথ্যের অন্যান্য টিবিড) দেখতে (উদাহরণস্বরূপ foo ব্যবহার করে) পাওয়ার পাওয়ার কমান্ডটি হ'ল:

গেট-প্রসেস ফু | পান-সদস্য

আপনি দেখতে পাবেন যে প্রসেসর অফিনিটি সেই বৈশিষ্ট্যগুলির মধ্যে একটি। এটিকে পরিবর্তন করা তুচ্ছ এবং আপনি উপরের রেভোল্টারের টেবিল / লিঙ্ক থেকে মানগুলি ব্যবহার করে আপনি কোন কোরটি চলতে চান তা নির্বাচন করতে পারেন।

প্রসেসরঅফিনিটি সম্পত্তিটির foo এর জন্য মূল্য কী তা দেখতে এখানে কমান্ডটি দেওয়া হয়েছে:

(গেট-প্রসেস ফুও) .প্রসেসরঅফিনিটি

সুতরাং আপনি যদি কেবল সিপিইউ 4-তে ফু চালাতে চান তবে আপনি মানটি সেট করতে পারেন:

(গেট-প্রসেস ফুও) .প্রসেসরঅফিনিটি = 8


আমি আপনার ব্যাখ্যা থেকে বলতে পারি না: এটি কি কেবল বিদ্যমান প্রক্রিয়াগুলিতে প্রযোজ্য? ওপি কোনও প্রক্রিয়া শুরু করতে চায় না এবং তারপরে তার সম্পর্ক স্থাপন করতে চায় না; তিনি উত্তর হিসাবে যেমন ইতিমধ্যে সেট করা তার সান্নিধ্য নিয়ে একটি প্রক্রিয়া শুরু করতে চান start /affinity। আপনার কৌশল কি এটি করতে পারে? যদি তা হয় তবে দয়া করে কীভাবে তা ব্যাখ্যা করুন।
স্কট

2
@ স্কট শুধুমাত্র বিদ্যমান প্রক্রিয়া। আপনি যে প্রসঙ্গে সরবরাহ করেছেন তাতে আমার উত্তর সাহায্য করবে না। আমি অনুভব করেছি যে "প্রক্রিয়াটির খুব সূচনা", প্রক্রিয়াটি শুরু করার বিষয়টি ছিল এবং তারপরে তত্ক্ষণাত এর সখ্যতা স্থাপন করে। আইই: Start-Process foo ; (Get-Process foo).ProcessorAffinity=8 তবে, আপনার মন্তব্যটি পড়ার পরে এবং এটিতে Start-Processএকটি নিখরচায় আত্মপ্রকাশের পতাকা রয়েছে, আমি নিম্নলিখিতটি নিয়ে এসেছি, যা আমি পরীক্ষা করেছি: [System.Diagnostics.Process]::start("foo.exe").ProcessorAffinity=0x0010
বেওক

আমি পরামর্শ দিচ্ছি যে বিকল্পটি যুক্ত করতে আপনি নিজের উত্তরটি সম্পাদনা করুন।
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.