জাভাতে কোরগুলির সন্ধান করা


411

জাভা কোডের মধ্যে থেকে আমি কীভাবে আমার অ্যাপ্লিকেশনটিতে উপলব্ধ কোরগুলির সন্ধান করতে পারি?


3
প্রায় সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে "কোর == প্রসেসর"।
জোছিম সৌর

32
খালি জাভা ব্যবহার করে মেশিনের শারীরিকভাবে কতগুলি কোর রয়েছে তা সন্ধান করা। জাভা প্রোগ্রামটি প্রারম্ভকালে যে পরিমাণ কোর ব্যবহার করতে পারে তা সন্ধান করা সহজ, রানটাইম.জেটআরটাইম ()। উপলভ্য প্রসেসর () ব্যবহার করে । সমস্ত বড় আধুনিক ওএসএসের সিপিইউ অ্যাফিনিটি সেট করার দক্ষতার কারণে (অর্থাত্ একটি অ্যাপ্লিকেশনটি কেবলমাত্র একটি নির্দিষ্ট সংখ্যক কোরে সীমাবদ্ধ করে রাখা) এটি মনে রাখা উচিত।
SyntaxT3rr0r 21'15

6
যৌক্তিক বা শারীরিক কোরে? একটি গুরুত্বপূর্ণ পার্থক্য আছে।
b1nary.atr0phy

উত্তর:


722
int cores = Runtime.getRuntime().availableProcessors();

যদি coresএটির চেয়ে কম হয়, হয় আপনার প্রসেসরটি মারা যাচ্ছেন, বা আপনার জেভিএম এর মধ্যে একটি মারাত্মক ত্রুটি রয়েছে, বা মহাবিশ্বটি ফুটিয়ে তুলতে চলেছে।


106
এটি আপনাকে লজিকাল থ্রেডের সংখ্যা দেবে। যেমন আপনার যদি হাইপার-থ্রেডিং চালু থাকে তবে এটি কোরের সংখ্যার দ্বিগুণ হবে।
পিটার লরে

6
@ পিটার, হ্যাঁ, ভাল পয়েন্ট আমার আই 7 মেশিন দিয়ে এই ক্রিয়াটি সম্পাদন করার সময় আমি নিজেকে হিলের রাজা অনুভব করেছি! :)
বার্ট কায়ার্স

14
@ পিটার লরি: এটি কেবলমাত্র জেভিএমের কাছে উপলব্ধ লজিক্যাল থ্রেডগুলির সংখ্যা দেয় (আমার ধারণা প্রারম্ভের সময়)। সিপিইউ অ্যাফিনিটি ব্যবহার করে ব্যবহারকারী / ওএস কোনও জেভিএম দেখায় এমন "কোর" সংখ্যাকে সীমাবদ্ধ করতে পারে। আপনি এটি একটি চলমান জেভিএম-তেও করতে পারেন তবে আমি কীভাবে এই প্রভাব উপলব্ধ প্রসেসরগুলি () উপলব্ধ তা নিশ্চিত নই ।
SyntaxT3rr0r

25
@ পিটারল্যাওরি: এটি ভুল বলে মনে হচ্ছে, উপলভ্য প্রসেসরগুলির জাভা ডকুমেন্টেশনগুলি () বলছে "ভার্চুয়াল মেশিনের একটি বিশেষ আহ্বানের সময় এই মানটি পরিবর্তিত হতে পারে available উত্স ব্যবহার যথাযথভাবে। " উত্স
জেডাব্লু

9
@ বিভিন্ন বিস্ফোরণ এবং এ জাতীয়: বা মেশিনটিতে আসলে 2,147,483,647 টির বেশি যৌক্তিক থ্রেড উপলব্ধ? ;)
পিয়েরে হেনরি

26

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

private int getNumberOfCPUCores() {
    OSValidator osValidator = new OSValidator();
    String command = "";
    if(osValidator.isMac()){
        command = "sysctl -n machdep.cpu.core_count";
    }else if(osValidator.isUnix()){
        command = "lscpu";
    }else if(osValidator.isWindows()){
        command = "cmd /C WMIC CPU Get /Format:List";
    }
    Process process = null;
    int numberOfCores = 0;
    int sockets = 0;
    try {
        if(osValidator.isMac()){
            String[] cmd = { "/bin/sh", "-c", command};
            process = Runtime.getRuntime().exec(cmd);
        }else{
            process = Runtime.getRuntime().exec(command);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
    String line;

    try {
        while ((line = reader.readLine()) != null) {
            if(osValidator.isMac()){
                numberOfCores = line.length() > 0 ? Integer.parseInt(line) : 0;
            }else if (osValidator.isUnix()) {
                if (line.contains("Core(s) per socket:")) {
                    numberOfCores = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]);
                }
                if(line.contains("Socket(s):")){
                    sockets = Integer.parseInt(line.split("\\s+")[line.split("\\s+").length - 1]);
                }
            } else if (osValidator.isWindows()) {
                if (line.contains("NumberOfCores")) {
                    numberOfCores = Integer.parseInt(line.split("=")[1]);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(osValidator.isUnix()){
        return numberOfCores * sockets;
    }
    return numberOfCores;
}

ওএসভালিডেটর শ্রেণি:

public class OSValidator {

private static String OS = System.getProperty("os.name").toLowerCase();

public static void main(String[] args) {

    System.out.println(OS);

    if (isWindows()) {
        System.out.println("This is Windows");
    } else if (isMac()) {
        System.out.println("This is Mac");
    } else if (isUnix()) {
        System.out.println("This is Unix or Linux");
    } else if (isSolaris()) {
        System.out.println("This is Solaris");
    } else {
        System.out.println("Your OS is not support!!");
    }
}

public static boolean isWindows() {
    return (OS.indexOf("win") >= 0);
}

public static boolean isMac() {
    return (OS.indexOf("mac") >= 0);
}

public static boolean isUnix() {
    return (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0 );
}

public static boolean isSolaris() {
    return (OS.indexOf("sunos") >= 0);
}
public static String getOS(){
    if (isWindows()) {
        return "win";
    } else if (isMac()) {
        return "osx";
    } else if (isUnix()) {
        return "uni";
    } else if (isSolaris()) {
        return "sol";
    } else {
        return "err";
    }
}

}


4
এটি কোডের একটি অংশ যা ওপড হওয়া ভাল প্রার্থী। :)
লাইবুমায়ার শায়দারিভ

1
ওএসভালিডেটর শ্রেণি ওএসএক্সকে সমর্থন করে তবে getNumberOfCores এটিকে সম্পূর্ণ উপেক্ষা করে। একদিকে যেমন, blog.opengroup.org/2015/10/02/… সুতরাং 'ম্যাক' আপনার ইউনিক্সে থাকা উচিত () তবে ... বিএসডি, ওএসএক্সের জন্য, কোনও lscpu কমান্ড উপস্থিত নেই এবং আপনার getNumberOfCores ফিরে আসবে 0.
পল হারগ্রায়েভ

1
লিনাক্সে, আপনাকে "সকেট (গুলি)" দ্বারা প্রতি সকেট একাধিক "কোর (গুলি) করতে হবে। এছাড়াও, আমি নিয়মিত প্রকাশ করতে চাই would
আলেকসান্দ্র ডাবিনস্কি

1
"OS.indexOf ()" এর পরিবর্তে "OS.contains ()" ব্যবহার করা আরও ভাল। এটি পাঠযোগ্যতার উন্নতি করে এবং টাইপ করা কম।
জোশ গ্যাজার

6

সিপিইউ কোরগুলির সংখ্যা (এবং আরও অনেকগুলি তথ্য) বের করার এটি অতিরিক্ত উপায়, তবে এই কোডটির অতিরিক্ত অতিরিক্ত নির্ভরতা প্রয়োজন:

নেটিভ অপারেটিং সিস্টেম এবং হার্ডওয়্যার সম্পর্কিত তথ্য https://github.com/oshi/oshi

SystemInfo systemInfo = new SystemInfo();
HardwareAbstractionLayer hardwareAbstractionLayer = systemInfo.getHardware();
CentralProcessor centralProcessor = hardwareAbstractionLayer.getProcessor();

প্রক্রিয়াকরণের জন্য লজিক্যাল সিপিইউগুলির সংখ্যা পান:

centralProcessor.getLogicalProcessorCount();

এটি আপনাকে সেন্ট্রালপ্রসেসর.গেট ফিজিক্যালপ্রসেসর অ্যাকাউন্ট () ব্যবহার করতে দেয় যা সম্ভবত এই তথ্যটি অর্জনের জন্য জাভা সবচেয়ে ভাল উপায়। যদি আপনার কাছে থ্রেড থাকে যা প্রায় নিয়মিত কাজ করে চলেছে এবং আপনি অন্যান্য থ্রেড এবং প্রক্রিয়াগুলির জন্য সিপিইউ ক্ষমতার একটি সুসংজ্ঞাত বাম পাশে রেখে এখনও শুরু করতে পারেন এমন থ্রেডগুলির সংখ্যা জানতে চান, গণনাটি এই সংখ্যাটি হওয়া উচিত ভিত্তিক
malamut

-3

এটি সাইগউইন ইনস্টল করে উইন্ডোজে কাজ করে:

System.getenv("NUMBER_OF_PROCESSORS")


আমি সাইগউইন ইনস্টল করেছি, তবে এটি উইন্ডোজ শেল থেকে কাজ করে:groovy -e "println System.getenv('NUMBER_OF_PROCESSORS')"
আবু নাসার

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