linux線程的優先順序設置
『壹』 linux c如何調整線程優先順序
你好。
在分時系統里應該沒什必要吧
setpriority/getpriority,這兩個函數描述的是改變進程優先順序。
但是在linux中線程就是一個輕量級的進程,
所以這兩個函數是可以作用於單獨的線程的
如果我的回答沒能幫助您,請繼續追問。
『貳』 linux操作系統設置優先順序的問題
linux下調整進程優先順序
進程的優先順序決定了進程是否優先被cpu分配資源進行處理。
在cpu資源十分充足時,每個正在運行的進程都能分配到足夠的資源進行處理,此時調整進程的優先順序是沒有什麼意義的;
如果cpu資源緊張時,top查看cpu使用達到90%以上時,優先順序高的進程將被優先分配資源去執行。
如果此時手頭有一個非常緊要的任務要執行,比如傳輸一個非常重要的數據或是准備給客戶發一封非常緊急的郵件,
你希望這些任務優先地被執行完成,那麼就需要調整這些任務的優先順序了。
優先順序的值=優先系數+nice值
優先系數由系統內核決定,不可更改
nice值可以手動更改,范圍是 -20~19
優先順序的值越低,優先順序越高;優先順序的值越高,優先順序越低。
所以想調整成最高優先順序的話,就將nice值設為-20;想調整成最低優先順序的話,將nice值設為19。
調整優先順序:
1、任務未運行前進行調整
# nice -n-20 sh /xxx/xxx.sh --以最高優先順序運行xxx.sh這個腳本
# nice -n19 sh /xxx/xxx.sh --以最低優先順序運行xxx.sh這個腳本
2、任務已經開始運行的情況下調整
①
# top --查看系統當前進程運行情況
> r --鍵入小r
> PID to renice: --提示輸入運行的進程的pid
> Renice PID 23302 to value: --把這個進程的nice值設置為多少,根據需要進行調整
②
# renice -20 PID 將進程的nice值改為-20
# renice 19 PID 將進程的nice值改為19
轉載紅黑聯盟:linux下調整進程優先順序
『叄』 如何在linux/unix中設置線程的優先順序
我們使用int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
來創建線程,但是如何設置線程的優先順序呢?
在討論這個問題的時候,我們先要確定當前線程使用的調度策略,posix提供了
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);函數來獲取所
使用的調度策略,它們是:SCHED_FIFO, SCHED_RR 和 SCHED_OTHER。
我們可以使用
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
來獲取線程線程可是設置的最大和最小的優先順序值,如果調用成功就返回最大和最小的優先順序值,否則返回-1。
從我現在運行的linux系統中,我使用下列程序(程序見附錄)獲取了對應三種調度策略中的最大和最小優先順序:
policy = SCHED_OTHER
Show current configuration of priority
max_priority = 0
min_priority = 0
Show SCHED_FIFO of priority
max_priority = 99
min_priority = 1
Show SCHED_RR of priority
max_priority = 99
min_priority = 1
Show priority of current thread
priority = 0
Set thread policy
Set SCHED_FIFO policy
policy = SCHED_FIFO
Set SCHED_RR policy
policy = SCHED_RR
Restore current policy
policy = SCHED_OTHER
我們可以看到
SCHED_OTHER是不支持優先順序使用的,而SCHED_FIFO和SCHED_RR支持優先順序的使用,他們分別為1和99,數值越大優先順序越高。 從上面的結果我們可以看出,如果程序控制線程的優先順序,一般是用pthread_attr_getschedpolicy來獲取系統使用的調度策略,如果是SCHED_OTHER的話,表明當前策略不支持線程優先順序的使用,否則可以。當然所設定的優先順序范圍必須在最大和最小值之間。我們可以通過sched_get_priority_max和sched_get_priority_min來獲取。
可能網友會問,是否我們可以通過int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);來設定自己所需的調度策略呢?我覺得是完全可以的(有些系統需要定義_POSIX_THREAD_PRIORITY_SCHEDULING),只要系統實現了對應的調用策略。
說了半天,我們還沒有說,在系統允許使用線程優先順序別的時候,如何設置優先順序別呢?
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
上面兩個函數分別用於設置線程的優先順序,struct sched_param的定義如下
struct sched_param
{
int __sched_priority; //所要設定的線程優先順序
};
例:創建優先順序為10的線程
pthread_attr_t attr;
struct sched_param param;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);
param.sched_priority = 10;
pthread_attr_setschedparam(&attr, ¶m);
pthread_create(xxx , &attr , xxx , xxx);
pthread_attr_destroy(&attr);
附:使用的測試程序:
#include <iostream>
#include <pthread.h>
#include <sched.h>
#include <assert.h>
using namespace std;
static int get_thread_policy( pthread_attr_t &attr )
{
int policy;
int rs = pthread_attr_getschedpolicy( &attr, &policy );
assert( rs == 0 );
switch ( policy )
{
case SCHED_FIFO:
cout << "policy = SCHED_FIFO" << endl;
break;
case SCHED_RR:
cout << "policy = SCHED_RR" << endl;
break;
case SCHED_OTHER:
cout << "policy = SCHED_OTHER" << endl;
break;
default:
cout << "policy = UNKNOWN" << endl;
break;
}
return policy;
}
static void show_thread_priority( pthread_attr_t &attr, int policy )
{
int priority = sched_get_priority_max( policy );
assert( priority != -1 );
cout << "max_priority = " << priority << endl;
priority = sched_get_priority_min( policy );
assert( priority != -1 );
cout << "min_priority = " << priority << endl;
}
static int get_thread_priority( pthread_attr_t &attr )
{
struct sched_param param;
int rs = pthread_attr_getschedparam( &attr, ¶m );
assert( rs == 0 );
cout << "priority = " << param.__sched_priority << endl;
return param.__sched_priority;
}
static void set_thread_policy( pthread_attr_t &attr, int policy )
{
int rs = pthread_attr_setschedpolicy( &attr, policy );
assert( rs == 0 );
get_thread_policy( attr );
}
int main( void )
{
pthread_attr_t attr;
struct sched_param sched;
int rs;
rs = pthread_attr_init( &attr );
assert( rs == 0 );
int policy = get_thread_policy( attr );
cout << "Show current configuration of priority" << endl;
show_thread_priority( attr, policy );
cout << "Show SCHED_FIFO of priority" << endl;
show_thread_priority( attr, SCHED_FIFO );
cout << "Show SCHED_RR of priority" << endl;
show_thread_priority( attr, SCHED_RR );
cout << "Show priority of current thread" << endl;
int priority = get_thread_priority( attr );
cout << "Set thread policy" << endl;
cout << "Set SCHED_FIFO policy" << endl;
set_thread_policy( attr, SCHED_FIFO );
cout << "Set SCHED_RR policy" << endl;
set_thread_policy( attr, SCHED_RR );
cout << "Restore current policy" << endl;
set_thread_policy( attr, policy );
rs = pthread_attr_destroy( &attr );
assert( rs == 0 );
return 0;
}
編譯命令:
#g++ pthread_priority3.c -o pthread_priority3 -lpthread
『肆』 在Linux下怎麼修改當前線程的優先順序
注意:盡量不要修改系統默認優先順序
Thread類與線程優先順序相關的屬性和方法:
MAX_PRIORITY : 線程可以具有最高優先順序
MIN_PRIORITY : 線程可以具有的最低優先順序
NORM_PRIORITY : 分配給線程的默認優先順序
getPriority() : 獲得線程的優先順序
setPriority() : 修改線程的優先順序
java">importjava.util.Scanner;
{
publicstaticThread[]getThreads(){
ThreadGroupgroup=Thread.currentThread().getThreadGroup();
Thread[]threads=newThread[group.activeCount()];
group.enumerate(threads);
System.out.println("線程ID "+"線程名稱 "+"線程優先順序");
for(Threadthread:threads){
System.out.println(thread.getId()+" "+thread.getName()+" "+thread.getPriority());;
}
returnthreads;
}
publicstaticStringinput(){
Scannersc=newScanner(System.in);
Stringstr=sc.nextLine();
returnstr;
}
(Thread[]threads){
System.out.println("請輸入您要修改的線程的ID");
inti=Integer.parseInt(input());
intcount=-1;
for(Threadthread:threads){
if(thread.getId()==i){
System.out.println("請輸入您要修改成的優先順序別:");
intpriroty=Integer.parseInt(input());
thread.setPriority(priroty);
break;
}else{
count++;
}
}
if(count==threads.length-1){
System.out.println("找不到您要的線程");
}
getThreads();
}
publicstaticvoidmain(String[]args){
modifyPriority(getThreads());
}
}
『伍』 Linux編程線程優先順序,主程序創建了兩個線程A、B
可以通過設置線程優先順序。
在創建線程前使用pthread_attr_init對創建線程的參數pthread_attr_t進行初始化,其中包括優先順序參數,然後在創建線程時傳入參數即可。具體使用方法可以參考man手冊
『陸』 線程的優先順序在什麼時候設置,在任何時候都能設置嗎
線程開始(start)之前。
由於宿主平台的支持不同,一般只設置下面三種優先順序
public static final int MIN_PRIORITY;
public static final int NORM_PRIORITY;
public static final int MAX_PRIORITY;
例如:
Thread t=new Thread();
t.setPriority(Thread.MAX_PRIORITY);
t.start();
還有如果類是繼承了Thread類里邊都可以設的,this.setPriority( );
(6)linux線程的優先順序設置擴展閱讀:
各個作業在輸入計算機之前,都要按一定的要求對它指定優先順序。例如要按程序的性質或其長度,或是按作業的來源等,指定其優先順序。然後計算機根據各作業程序優先順序的高低,來決定處理各程序的先後次序。甚至在處理過程中,還能允許優先順序較高的程序中斷優先順序較低的程序。
進程是有優先順序的。如果即將被運行的進程的優先順序比正在運行的進程的優先順序高,則系統可以強行剝奪正在運行的進程的CPU,讓優先順序高的進程先運行。
『柒』 linux應用與內核通信有幾種方式linux有幾種調度方式linux有多少任務優先順序
通信方式主要有:文件加共享內存,管道,SOCKET。一般都用SOCKET,可移植性強。
調度方式:時間片,優先順序,還有就是時間片加優先順序混合,默認是第三種。
線程優先順序是1~99,值越大優先順序越高。
『捌』 linux查看線程優先順序命令
用top或者ps -l查看進程會發現有PR(PRI) NI兩個欄位:
NI 是優先值,是用戶層面的概念, PR是進程的實際優先順序, 是給內核(kernel)看(用)的。
一般情況下,PR=NI+20, 如果一個進程的優先順序PR是20, 那麼它的NI(nice)值就是20-20=0。
進程調度優先順序是從-20到19,一共40個級別,數字越大,表示進程的優先順序越低。默認時候,進程的優先順序是0。查看進程優先順序有兩個辦法:ps和top。top命令顯示的NI列的值。或者可以使用ps -efl來查看,也是在ni列表示了進程的優先順序。《Linux就該這么學》 一起學習,進程的優先順序可以在程序運行的時候設置,也可以在程序運行過程中動態的修改。
『玖』 Linux 多線程問題: 怎麼在創建線程後,設置線程的優先順序及其他參數,有沒有相關的函數。
linux並不是實時操作系統,把下面的代碼運行一遍就能夠理解了,代碼有很詳細的注釋。
http://blog.csdn.net/lanseshenhua/article/details/5524797
『拾』 linux系統中,程序有若干個優先順序,最低的優先順序是什麼
linux系統中,程序有若干個優先順序,最低的優先順序是19。
Linux為一套免費使用和自由傳播的類UNIX操作系統,其內核由林納斯·本納第克特·托瓦茲於1991年第一次釋出,它主要受到Minix和Unix思想的啟發,是一個基於POSIX和Unix的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的Unix工具軟體、應用程序和網路協議。它支持32位和64位硬體
(10)linux線程的優先順序設置擴展閱讀:
普通用戶只能在0~19之間調整應用程序的優先權值,只有超級用戶有權調整更高的優先權值(從-20~19)。linux系統屬於這種數值越小優先順序越高,數值越大優先順序越低的系統。windows屬於那種優先數值大的優先順序高的系統。
在linux系統中,使用ifconfig命令給網口配置ip,系統會自動生成這個網卡的相關路由信息,可以使用命令route –n查看系統所有的路由信息,參數-n是不進行地址解析,如果不添加-n選項,route命令會根據/etc/resolv文件中配置的DNS伺服器進行地址解析。