Linux中创建线程的优先级设置-linux创建线程优先级 (linux中./表示什么)

教程大全 2025-07-17 22:11:22 浏览

操作系统中,线程是一种轻量级的执行单元,它能够在不同的执行环境中运行,并与其他线程共享系统资源。在Linux中,创建线程需要使用pthread库,并且可以通过设置优先级来控制线程的执行顺序。

本文将介绍Linux中创建线程的方法,并详细介绍如何设置线程的优先级来控制其执行顺序。

一、创建线程的方法

Linux中,创建线程的方法是使用pthread库中的pthread_create()函数。函数原型如下:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

在pthread_create()函数中,之一个参数thread是指向线程ID的指针,在线程创建成功后,该指针会被设置为新线程的ID;第二个参数attr是指向线程属性的指针,可以用来设置线程的属性,如优先级、堆栈大小等;第三个参数start_routine是线程启动时要执行的函数指针;最后一个参数arg是传递给线程函数的参数。

下面是一个简单的创建线程的例子:

void *thread_func(void *arg)

int id = *(int*)arg;

printf(“Hello from thread %d\n”, id);

pthread_exit(NULL);

pthread_t threads[3];

int ids[3] = {1, 2, 3};

pthread_create(&threads[i], NULL, thread_func, (void*)&ids[i]);

pthread_join(threads[i], NULL);

在上面的例子中,创建了3个线程,每个线程执行的函数是thread_func(),并传递了一个整数参数作为线程ID。线程ID是在主线程中创建,并且使用pthread_join()函数等待线程执行完毕。

二、设置线程的优先级

在Linux中,线程的优先级是通过调整线程调度策略和调度参数来控制的。在pthread库中,可以使用pthread_attr_t类型的对象来设置线程属性,并通过pthread_create()函数的attr参数传递给新创建的线程。

下面是一个设置线程优先级的例子:

void *thread_func(void *arg)

int id = *(int*)arg;

int policy, priority;

struct sched_param param;

pthread_getschedparam(pthread_self(), &policy, ¶m);

priority = param.sched_priority;

printf(“Thread %d: policy=%d priority=%d\n”, id, policy, priority);

pthread_exit(NULL);

pthread_t threads[3];

pthread_attr_t attr;

int ids[3] = {1, 2, 3};

pthread_attr_init(&attr);

pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);

pthread_create(&threads[i], &attr, thread_func, (void*)&ids[i]);

pthread_setschedpolicy(threads[i], SCHED_IDC.com/xtywjcwz/25681.html" target="_blank">fifo);

pthread_setschedprio(threads[i], i + 1);

pthread_join(threads[i], NULL);

pthread_attr_destroy(&attr);

在上面的例子中,创建了3个线程,并使用pthread_attr_setinheritsched()函数设置线程属性继承机制为显示继承,即继承主线程的调度策略和调度参数。使用pthread_setschedpolicy()函数和pthread_setschedprio()函数设置线程的调度策略为SCHED_FIFO,并通过i+1设置线程的优先级,其中i的范围为0~2。

线程的调度策略有SCHED_FIFO、SCHED_RR、SCHED_OTHER三种,优先级范围为1~99,值越小表示优先级越高。线程的调度参数可以通过struct sched_param类型的对象sched_param来设置。

三、

相关问题拓展阅读:

linux应用与内核通信有几种方式?linux有几种调度方式?linux有多少任务优先级?

通信方式主要有:文件加共享内存,管道,SOCKET。一般都用SOCKET,可液陵袭移植性强。

调度方式:时间片,优先级,还有就是时间片加优先级混合,默认是第三种。

线程优先闹兄级是汪羡1~99,值越大优先级越高。

通讯方式:文件以及共享内存,管道,SOCKET。一般使用的SOCKET,便携性。的

调度的时间片,优先级,有时间片加优先喊胡袭级的郑兄混合,默认的是第三个。

线程的优先级为1到99,做瞎值越大优先级越高。

你这么问,真心建议你看看《unix环境高级编程》系统了解下。当然,考试什么的就算了。

linux进程、线程及调度算法(三)

表示什么

调度策略值得是大家都在ready时,并且CPU已经被调度时,决定谁来运行,谁来被调度。

两者之间有一定矛盾。

响应的优化,意味着高优先级会抢占优先级,会花时间在上下文切换,会影响吞吐。

上下文切换的时间是很短的,几微妙就能搞定。上下文切换本身对吞吐并多大影响,

重要的是,切换后引起的cpu 的 cache miss.

每次切换APP, 数据都要重新load一次。

Linux 会尽可能的在响应与吞吐之间寻找平衡。比如在编译linux的时候,会让你选择 kernal features -> Preemption model.

抢占模型会影响linux的调度算法。

所以 ARM 的架构都是big+LITTLE, 一个很猛CPU+ 多个 性能较差的 CPU, 那么可以把I/O型任务的调度指源 放在 LITTLE CPU上。需要计算的放在big上。

早期2.6 内核将优先级划分了bit的优先级。数值越低,优先级越高。0-99优先级 都是 RT(即时响应)的 ,都是非RT的,即normal。

调度的时候 看哪个bitmap 中的 优先级上有任务ready。可能多个任务哦。

在普通优先级线程调度中,高优先级并不代表对低优先级的绝对优势。会在不同优先级进行轮转。

就是比101高,101也会比102高,但100 不会堵着101。

众丝进程在轮转时,优先级高的:

初始唯并态设置nice值为0,linux 会探测 你是喜欢睡眠,还是干活。越喜欢睡,linux 越奖励你,优先级上升(nice值减少)。越喜欢干活,优先级下降(nice值增加)。所以一个进程在linux中,干着干着 优先级越低,睡着睡着 优先级越高。

后期linux补丁中

红黑树,数据结构, 左边节点小于右边节点

同时兼顾了 CPU/IO 和 nice。

数值代表着 进程运行到目前为止的virtual runtime 时间。

(pyhsical runtime) / weight * 1024(系数)。

优先调度 节点值(vruntime)最小的线程。权重weight 其实有nice 来控制。

一个线程一旦被调度到,则物理运行时间增加,vruntime增加,往左边走。

weight的增加,也导致vruntime减小,往右边走。

总之 CFS让线程 从左滚到右,从右滚到左。即照顾了I/O(喜欢睡,分子小) 也 照顾了 nice值低(分母高).所以 由喜欢睡,nice值又低的线程,最容易被调度到。

自动调整,无需向nice一样做出奖励惩罚动作,个人理解权重其实相当于nice

但是 此时 来蔽拍一个 0-99的线程,进行RT调度,都可以瞬间秒杀你!因为人家不是普通的,是RT的!

一个多线程的进程中,每个线程的调度的策略 如 fifo rr normal, 都可以不同。每一个的优先级都可以不一样。

实验举例, 创建2个线程,同时开2个:

运行2次,创建两个进程

sudo renice -n -5(nice -5级别) -g(global), 会明显看到 一个进程的CPU占用率是另一个的 3倍。

为什么cpu都已经达到200%,为什么系统不觉得卡呢?因为,我们的线程在未设置优先级时,是normal调度模式,且是

CPU消耗型

调度级别其实不高。

利用chrt工具,可以将进程 调整为 50 从normal的调度策略 升为RT (fifo)级别的调度策略,会出现:

chrt , nice renice 的调度策略 都是以线程为单位的,以上 设置的将进程下的所有线程进行设置nice值

线程是调度单位,进程不是,进程是资源封装单位!

两个同样死循环的normal优先级线程,其中一个nice值降低,该线程的CPU 利用率就会比另一个CPU的利用率高。

关于linux创建线程优先级的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云 服务器 和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。


Linux环境变量顺序是什么?

路径排前面的优先。 比如 $JAVA_HOME/bin和/usr/bin下面都有java。 PATH=$JAVA_HOME/bin:$PATH 时,执行 java的时候是$JAVA_HOME/bin/java,如果没有再执行/usr/bin/java PATH=$PATH:$JAVA_HOME/bin 时,执行 java的时候是/usr/bin/java。 一般用户设定都是为了特殊用途,使用方式2没什么意义,所以方式1多些。 内核启动的时候,各个驱动初始化的工作在文件init/main.c中的do_basic_setup()函数中做.

linux用户级进程跟内核线程(进程)有什么差别

1、几乎所有的程序都要切换到内核态运行再返回用户态,用中断完成的,因为在内核下封装了一些东西,用户态下只是传入某些参数后调用内核态下的函数罢了,2、进程有三态(执行态,就绪态,阻塞态),cpu任何时刻都只有一个进程在执行,so从用户态切换到内核态时,用户态下的进程就处于阻塞或就绪态了,至于从用户态切换到内核态执行哪个函数那就看你在用户态下执行的是什么函数了,比如在用户态下的lseek在内核下就是llseek了,不一样的。3、这问题就是linux的内存管理了,这里就得提到三种地址(逻辑地址、线性地址、物理地址),这里我们提到的4G地址是逻辑地址,不是我们实际的物理地址,linux中一个进程用户占0-3G对应的内核占3G-4G部分说得不是很清楚,这是比较复杂的内容,需要从头看起,单就这几个问题是不能搞懂linux的,最好还是系统的学习,不断的重复

怎么设置进程优先级?

3、设置进程优先级在Windows中每一个程序都有一个进程和进程号,而且它们之间有优先级别的差异。 一般用户想更改它们的默认优先级别,那简直是势比登天!不过,有一任务管理器,就觉得易如反掌了!首先在“应用程序”项目中选择欲设置优先级的程序,然后右击,选择“转到进程”命令(如图2),此时在进程选项窗口中相应进程会被选中,右击,选择“设置优先级”命令,并在滑出的子菜单中自由设置吧(如图3)!一切都由您自己说了算!当然,我们也可以选择“终止进程”命令来结束这个进程。 不过,终止进程时要小心。 如果结束应用程序,您将丢失未保存的数据。 如果结束系统服务,系统的某些部分可能无法正常工作。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐