日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux线程优先级设置

發布時間:2023/12/31 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux线程优先级设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux內核的三種調度策略:

1.SCHED_OTHER 分時調度策略

2.SCHED_FIFO 實時調度策略,先到先服務。一旦占用cpu則一直運行。一直運行直到有更高優先級任務到達或自己放棄

3.SCHED_RR實 時調度策略,時間片輪轉。當進程的時間片用完,系統將重新分配時間片,并置于就緒隊列尾。放在隊列尾保證了所有具有相同優先級的RR任務的調度公平。

Linux線程優先級設置:

首先,可以通過以下兩個函數來獲得線程可以設置的最高和最低優先級,函數中的策略即上述三種策略的宏定義:

  int sched_get_priority_max(int policy);   

? ? ? ?int sched_get_priority_min(int policy);

注意:SCHED_OTHER 是不支持優先級使用的,而 SCHED_FIFO 和 SCHED_RR 支持優先級的使用,他們分別為1和99,數值越大優先級越高。

設置和獲取優先級通過以下兩個函數:

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); param.sched_priority = 51; //設置優先級

系統創建線程時,默認的線程是 SCHED_OTHER。所以如果我們要改變線程的調度策略的話,可以通過下面的這個函數實現。

int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);

? ? 上面的param使用了下面的這個數據結構:

struct sched_param { ? ?

? ? int __sched_priority; // 所要設定的線程優先級

};

我們可以通過下面的測試程序來說明,我們自己使用的系統的支持的優先級:

#include <stdio.h>

#include <pthread.h>

#include <sched.h>

#include <assert.h>

static int api_get_thread_policy (pthread_attr_t *attr)

{

? ? int policy;

? ? int rs = pthread_attr_getschedpolicy (attr, &policy);

? ? assert (rs == 0);

? ? switch (policy)

? ? {

? ? ? ? case SCHED_FIFO:

? ? ? ? ? ? printf ("policy = SCHED_FIFO\n");

? ? ? ? ? ? break;

? ? ? ? case SCHED_RR:

? ? ? ? ? ? printf ("policy = SCHED_RR");

? ? ? ? ? ? break;

? ? ? ? case SCHED_OTHER:

? ? ? ? ? ? printf ("policy = SCHED_OTHER\n");

? ? ? ? ? ? break;

? ? ? ? default:

? ? ? ? ? ? printf ("policy = UNKNOWN\n");

? ? ? ? ? ? break;?

? ? }

? ? return policy;

}

static void api_show_thread_priority (pthread_attr_t *attr,int policy)

{

? ? int priority = sched_get_priority_max (policy);

? ? assert (priority != -1);

? ? printf ("max_priority = %d\n", priority);

? ? priority = sched_get_priority_min (policy);

? ? assert (priority != -1);

? ? printf ("min_priority = %d\n", priority);

}

static int api_get_thread_priority (pthread_attr_t *attr)

{

? ? struct sched_param param;

? ? int rs = pthread_attr_getschedparam (attr, &param);

? ? assert (rs == 0);

? ? printf ("priority = %d\n", param.__sched_priority);

? ? return param.__sched_priority;

}

static void api_set_thread_policy (pthread_attr_t *attr,int policy)

{

? ? int rs = pthread_attr_setschedpolicy (attr, policy);

? ? assert (rs == 0);

? ? api_get_thread_policy (attr);

}?

int main(void)

{

? ? pthread_attr_t attr;? ? ? ?// 線程屬性

? ? struct sched_param sched;? // 調度策略

? ? int rs;

? ? /*?

? ? ?* 對線程屬性初始化

? ? ?* 初始化完成以后,pthread_attr_t 結構所包含的結構體

? ? ?* 就是操作系統實現支持的所有線程屬性的默認值

? ? ?*/

? ? rs = pthread_attr_init (&attr);

? ? assert (rs == 0);? ? ?// 如果 rs 不等于 0,程序 abort() 退出

? ? /* 獲得當前調度策略 */

? ? int policy = api_get_thread_policy (&attr);

? ? /* 顯示當前調度策略的線程優先級范圍 */

? ? printf ("Show current configuration of priority\n");

? ? api_show_thread_priority(&attr, policy);

? ? /* 獲取 SCHED_FIFO 策略下的線程優先級范圍 */

? ? printf ("show SCHED_FIFO of priority\n");

? ? api_show_thread_priority(&attr, SCHED_FIFO);

? ? /* 獲取 SCHED_RR 策略下的線程優先級范圍 */

? ? printf ("show SCHED_RR of priority\n");

? ? api_show_thread_priority(&attr, SCHED_RR);

? ? /* 顯示當前線程的優先級 */

? ? printf ("show priority of current thread\n");

? ? int priority = api_get_thread_priority (&attr);

? ? /* 手動設置調度策略 */

? ? printf ("Set thread policy\n");

? ? printf ("set SCHED_FIFO policy\n");

? ? api_set_thread_policy(&attr, SCHED_FIFO);

? ? printf ("set SCHED_RR policy\n");

? ? api_set_thread_policy(&attr, SCHED_RR);

? ? /* 還原之前的策略 */

? ? printf ("Restore current policy\n");

? ? api_set_thread_policy (&attr, policy);

? ? /*?

? ? ?* 反初始化 pthread_attr_t 結構

? ? ?* 如果 pthread_attr_init 的實現對屬性對象的內存空間是動態分配的,

? ? ?* phread_attr_destory 就會釋放該內存空間

? ? ?*/

? ? rs = pthread_attr_destroy (&attr);

? ? assert (rs == 0);

? ? return 0;

}

總結

以上是生活随笔為你收集整理的Linux线程优先级设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。