วิธีการเรียกใช้โปรแกรมที่มีนโยบาย SCHED_RR จากบรรทัดคำสั่ง?


11

โดยโปรแกรมเริ่มต้นทำงานด้วย Time Sharing (นโยบาย TS) บน Linux วิธีรันโปรแกรมด้วยนโยบาย SCHED_RR บน Linux จากบรรทัดคำสั่ง?

ขอบคุณที่ให้ข้อมูลเกี่ยวกับคำสั่ง chrt (1) ฉันได้ใช้คำสั่งเพื่อเรียกใช้ Firefox ด้วยนโยบาย RR แต่ตามที่คุณเห็นด้านล่างเฉพาะเธรดหลักของ Firefox เท่านั้นที่ทำงานด้วยนโยบาย RR คุณสามารถบอกวิธีการใช้งานหัวข้ออื่น ๆ ทั้งหมดของ Firefox ด้วยนโยบาย RR ได้หรือไม่

$ ps -Lo pid,tid,class 2051
  PID   TID CLS
 2051  2051 RR
 2051  2055 TS
 2051  2056 TS
 2051  2057 TS
 2051  2058 TS
 2051  2059 TS
 2051  2060 TS
 2051  2061 TS
 2051  2063 TS
 2051  2067 TS
 2051  2068 TS
 2051  2069 TS
 2051  2070 TS
 2051  2072 TS
 2051  2073 TS
 2051  2074 TS
 2051  2075 TS
 2051  2077 TS
 2051  2078 TS
 2051  2080 TS
 2051  2356 RR
 2051  2386 TS
 2051  2387 TS

แก้ไข: ฉันรันโปรแกรม pthreads ง่าย ๆ ดังต่อไปนี้และทดสอบเหมือนข้างต้น น่าเสียดายที่คำสั่ง chrt เปลี่ยนคลาสของเธรดหลักเท่านั้น โปรดดูที่ด้านล่าง.

$ ps -Lo pid,tid,class 3552
  PID   TID CLS
 3552  3552 TS
 3552  3553 TS
 3552  3554 TS
 3552  3555 TS
 3552  3556 TS
 3552  3557 TS

$ sudo chrt --rr -p 30 3552
 ...
$ ps -Lo pid,tid,class 3552
  PID   TID CLS
 3552  3552 RR
 3552  3553 TS
 3552  3554 TS
 3552  3555 TS
 3552  3556 TS
 3552  3557 TS

---- โปรแกรม----

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   long k = 1;
   long a[10000];
   int i = 1;
  long b[10000];

   for (k = 0; k < 400000000; k++) {
        if (i == 9999) {
       i = 1;   
    } 
    a[i] = ((k + i) * (k - i))/2;
    a[i] = k/2;
        b[i] = i * 20;
    b[i] = a[i] - b[i];
        i++;
    int j = 0;
    for (j = 0; j < i; j++) {
        k = j - i;  
    } 
     } 

   pthread_exit(NULL);

}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

คำตอบ:


10

ใช้chrtคำสั่งด้วยchrt --rr <priority between 1-99> <command>

ตัวอย่าง:

chrt --rr 99 ls

โปรดทราบว่าการตั้งค่านั้นSCHED_RRต้องการการอนุญาตรูทดังนั้นคุณต้องเป็นรูทหรือรันด้วย sudo

นอกจากนี้คุณยังสามารถใช้chrtเพื่อให้ลำดับความสำคัญเรียลไทม์กระบวนการทำงาน:

chrt -p --rr <priority between 1-99> <pid>

คำสั่งเดียวกันใช้สำหรับคลาสการกำหนดตารางเวลาอื่นด้วยเช่นกันถึงแม้ว่าจะมีพารามิเตอร์ที่แตกต่างกันแทน -rr:

Scheduling policies:
  -b | --batch         set policy to SCHED_BATCH
  -f | --fifo          set policy to SCHED_FIFO
  -i | --idle          set policy to SCHED_IDLE
  -o | --other         set policy to SCHED_OTHER
  -r | --rr            set policy to SCHED_RR (default)

แก้ไข:

ในกรณีของ Firefox นั้นจะต้องเป็น spesific ให้กับ Firefox ในแอปพลิเคชันแบบมัลติเธรดที่ฉันเขียนเองเธรดทั้งหมดจะเก็บคลาส RR ไว้ ดังที่เห็นในเอาต์พุตของคุณสองเธรดมีคลาส RR ดังนั้นจึงไม่เพียง แต่เธรดหลักเท่านั้น

แก้ไข 2:

ลองเริ่มต้นกระบวนการchrtแทนการเปลี่ยนกำหนดการ pid ที่มีอยู่ใหม่ ปรากฏว่าหากคุณกำหนดเวลาใหม่เฉพาะเธรดแรกเท่านั้นที่ได้รับคลาส RR อย่างไรก็ตามหากคุณเริ่มด้วยchrtทุกเธรดจะได้รับ


ขอบคุณ @Egil อย่างไรก็ตามคลาสการกำหนดเวลาเริ่มต้นคือ TS ที่ถูกต้อง คุณสามารถดูได้ในเอาต์พุตคำสั่ง ps
samarasa

ใช่ .. ทำงานด้วยวิธีนี้ ดังนั้นมันไม่ทำงานถ้าเราให้ pid
samarasa

มีน้อยเกินไป-r(ใช้เพียงสองครั้ง) ฉันแนะนำให้ใช้-rrrrrrrrrแทน ;-P
poige

ไม่จำเป็นต้องรูทเพื่อที่จะทำงานในตอนท้ายของฉัน ...
ปริศนานักฟิสิกส์

@samarasa: ตัวเลือก -a อาจเป็นสิ่งที่คุณต้องการ จากคู่มือ:-a, --all-tasks Set or retrieve the scheduling attributes of all the tasks (threads) for a given PID.
Narcolessico

0

เพียงเพิ่มรหัสนี้ภายในโค้ดเธรด:

  pthread_t this_thread = pthread_self ();

  struct sched_param params;

  params.sched_priority = sched_get_priority_max (SCHED_RR);

  pthread_setschedparam (this_thread, SCHED_RR, &params);

สิ่งนี้จะให้ลำดับความสำคัญสูงสุด RR แต่ละเธรด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.