আমি যখন তাদের সংখ্যা সীমাবদ্ধ করি তখন কি জিএনইউ / লিনাক্স প্রক্রিয়া এবং থ্রেডগুলি একসাথে গণনা করে?


11

আমি আমার মেশিনে /etc/security/limits.confএবং এনপ্রোক মান সহ ব্যবহারকারী প্রতি প্রক্রিয়া সংখ্যা সীমাবদ্ধ করতে চাই ।

আমি এখানে পড়েছি যে লিনাক্স প্রক্রিয়া এবং থ্রেডের মধ্যে পার্থক্য করে না?

আমার ব্যবহারকারী প্রতি আমার বর্তমান এনপ্রোক সীমা 1024, তবে এটিতে থ্রেডও অন্তর্ভুক্ত থাকলে এটি আমার দৃষ্টিতে খুব কম। limits.confকেবলমাত্র ম্যান-পৃষ্ঠাতে এনপ্রোকের জন্য "প্রক্রিয়া" উল্লেখ করা হয়েছে এবং অন্য কিছুই নয়।

বুস্টের সাথে সি ++ তে // সম্পাদনা // নমুনা কোড // জি ++ -ও বুস্ট_থ্রেড বুস্ট_থ্রেড.সিপি -লবস্ট_থ্রেড

#include <unistd.h>
#include <iostream>
#include <boost/thread.hpp>
using namespace std;

int counter;

void print_thread(int i) {
    counter++;
    cout << "thread(" << i << ") counter " << counter << "\n";
    sleep(5);
    counter--;
}

int main() {
    int i = 0;
    int max = 1000000;

    while (i < max) {
        boost::thread(print_thread, i);
        i++;
    }

    return 0;
}

পরীক্ষা (কিছু লাইন সরানো):

$ ulimit -u
1024
$ ./thread 
...
...
...
thread(828) counter 828
thread(829) counter 829
thread(830) counter 830
thread(831) counter 831
thread(832) counter 832
thread(610) counter thread(833833) counter 834

thread(834) counter 835
thread(835) counter 836
thread(836) counter 837
thread(837) counter 838
thread(838) counter 839
thread(839) counter 840
thread(840) counter 841
thread(841) counter 842
thread(842) counter 843
thread(843) counter 844
thread(844) counter 845
thread(845) counter 846
thread(846) counter 847
thread(847) counter 848
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> >'
  what():  boost::thread_resource_error
Aborted (core dumped)

আমার ল্যাপটপ অলস থাকার সময় ~ 130 টি প্রক্রিয়া ব্যবহার করে। সুতরাং এনপ্রোক বা লিনাক্স আরও বিস্তৃত দৃষ্টিতে প্রক্রিয়া এবং থ্রেডের মধ্যে পার্থক্য করে না। যা আমার কাছে যুক্তিসঙ্গত বলে মনে হচ্ছে, কারণ থ্রেডগুলি কেবল প্রক্রিয়া নয়, ক্লান্তিকরও হতে পারে।

উত্তর:


14

আপনি যে nprocসীমাটির কথা বলছেন তা চালানোযোগ্য সত্তার ক্ষেত্রে প্রযোজ্য , এটি থ্রেডগুলিকে সীমাবদ্ধ করে রাখছে (এবং সেইজন্য, এতে থাকা প্রক্রিয়াগুলি) । প্রতিটি প্রক্রিয়াটিতে কমপক্ষে একটি থ্রেড থাকে (প্রাথমিক থ্রেড), যাতে কেবল থ্রেড চালানো যায় । কঠোরভাবে বলতে গেলে, প্রক্রিয়াগুলি "চালানো যায় না"।

এই উত্তরটি লিনাক্সের থ্রেড এবং প্রক্রিয়াগুলির মধ্যে আসল পার্থক্য ব্যাখ্যা করে।

আমি দিনটির উত্তরে কোডটি পরীক্ষা করেছি ( sleep(1);থ্রেড কোডেও যুক্ত হয়েছে) এবং তাঁর (?!) এর বিপরীতে, যখন অনেকগুলি থ্রেড তৈরি হয়েছিল তখন আমি সীমাটিতে পৌঁছেছিলাম : pthread_create()ফিরে আসছিল EAGAINpthread_create(3)ডকুমেন্টেশন এই ত্রুটি সম্পর্কে নিম্নলিখিত বলেছেন:

EAGAIN

অন্য থ্রেড তৈরির জন্য অপ্রতুল সংস্থান, বা থ্রেডের সংখ্যার উপর সিস্টেম-চাপিয়ে দেওয়া সীমাটি সম্মুখীন হয়েছিল। পরবর্তী কেসটি দুটি উপায়ে ঘটতে পারে: RLIMIT_NPROC সফট রিসোর্স সীমা (সেটরলিমিট (2) এর মাধ্যমে সেট), যা প্রকৃত ব্যবহারকারীর আইডির জন্য প্রক্রিয়াটির সংখ্যা সীমাবদ্ধ করে; অথবা থ্রেডের সংখ্যা, / proc / sys / কার্নেল / থ্রেড-সর্বাধিকের উপর কার্নেলের সিস্টেম-প্রশস্ত সীমা পৌঁছেছে।

আমি কার্নেল উত্সে নির্দিষ্ট প্রতি-থ্রেড সীমাটির কোনও উল্লেখ দেখতে পাই না , আমি কেবল সেখানে দেখতে পাই , এটিই আপনি সীমাবদ্ধ করে (সাথে ) পরিবর্তন করতে পারেন , বা ।RLIMIT_NPROClimits.confnproculimit -usetrlimit(2)


0

ulimit শুধুমাত্র প্রক্রিয়া সংখ্যা সীমাবদ্ধ। সুতরাং একটি মান সেট ব্যবহার করে

ulimit -u 1024

উপার্জনের সংখ্যা সীমাবদ্ধ করবে।

eg.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void* test(void *ptr){
   return 0;
}



int main()
{
        pthread_t thread[50];
        int i=0;

      for(i=0;i<50;i++){
      if(!pthread_create( &thread[i], NULL,test,NULL))
         printf("%d ",i);

       }


      for(i=0;i<50;i++)
       pthread_join( thread[i], NULL);
       return 0;
}

ulimit সেট এবং চেক

lab@x:/tmp$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
lab@x:/tmp$ 
lab@x:/tmp$ 
lab@x:~$ cd /home/x
lab@x:/home/x$ ./thread 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 lab@x:/home/x$ 
lab@x:/home/x$ 
lab@x:/home/x$ ulimit -u 10
lab@x:/home/x$ 

প্রক্রিয়া সীমা 10 সেট করা হয়েছে

lab@x:/home/x$ ./thread 
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 lab@x:/home/x$ 
lab@x:/home/x$ 

এখানে 50 থ্রেড তৈরি করা যেতে পারে।


3
প্রথম নজরে আপনার কোড এবং যুক্তিটি সঠিক দেখাচ্ছে তবে আমি ভয় করি যে আপনার কোড এবং যুক্তিটি ভুল। আপনার থ্রেডগুলি তাত্ক্ষণিকভাবে ফিরে আসবে, ঘুমের সাথে (5) বা পরীক্ষার জন্য প্রয়োজনীয় আরও কিছু সময় () আপনার কোডটি ব্যর্থ হওয়া উচিত।
পিটার ওয়েবার

ঠিক আছে, আমি পরীক্ষায় কিছুক্ষণ (1) {(() যোগ করেছি এবং এখনও আমি উপরের মত একই ফলাফল পেয়েছি।
দিন

আমি আমার অনুরোধ সম্পাদনা করেছি। আপনি আমার কোড পরীক্ষা করতে পারে। আপনার প্রথম উত্তর "হ্যাঁ লিনাক্স সিস্টেমগুলি পসিক্স থ্রেড এবং প্রসেসগুলি একসাথে গণনা করেছে" পুরোপুরি সঠিক দেখাচ্ছে।
পিটার ওয়েবার

হ্যাঁ আমি এটি একটি প্রোগ্রামে চেষ্টা না করা পর্যন্ত এটি ভেবেছিলাম।
দিন

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