linux线程的调度?linux运维面试题目及答案

大家好,如果您还对linux线程的调度不太了解,没有关系,今天就由本站为大家分享linux线程的调度的知识,包括linux运维面试题目及答案的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

linux查看线程状态命令linux查看线程状态

linux中的线程有哪几种状态?

就绪:线程分配了CPU以外的全部资源,等待获得CPU调度执行:线程获得CPU,正在执行阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列挂起:由于终端请求,操作系统的要求等原因,导致挂起。

怎么在linux系统下查看网卡状态信息?

方法一:

ethtooleth0采用此命令可以查看到网卡相关的技术指标。

(不一定所有网卡都支持此命令)

ethtool-ieth1加上-i参数查看网卡驱动。

可以尝试其它参数查看网卡相关技术参数。

方法二:

也可以通过dmesg|grepeth0等看到网卡名字(厂家)等信息。

通过查看/etc/sysconfig/network-scripts/ifcfg-eth0可以看到当前的网卡配置包括IP、网关地址等信息。

当然也可以通过ifconfig命令查看。

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux操作系统诞生于1991年10月5日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。

Linux如何查看线程数最佳解决方案?

1、top-H手册中说:-H:Threadstoggle加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。

2、psxH手册中说:HShowthreadsasiftheywereprocesses这样可以查看所有存在的线程。

3、ps-mp

linux怎么指定线程库?

大概的介绍一下Linux的指定CPU运行,包括进程和线程。linux下的top命令是可以查看当前的cpu的运行状态,按1可以查看系统有多少个CPU,以及每个CPU的运行状态。可是如何查看线程的CPU呢?

top-Hppid,pid就是你当前程序的进程号,如果是多线程的话,是可以查看进程内所有线程的CPU和内存使用情况。

pstree可以查看主次线程,同样的pstree-ppid。可以查看进程的线程情况。

taskset这个其实才是重点,可以查看以及设置当前进程或线程运行的CPU(设置亲和力)。

taskset-pcpid,查看当前进程的cpu,当然有的时候不只是一个,taskset-pccpu_numpid,cpu_num就是设置的cpu。这样的话基本的命令和操作其实大家都知道了,接下来就是在代码中完成这些操作,并通过命令去验证代码的成功率。进程制定CPU运行:

viewplaincopy#include#include#include#include#include#define__USE_GNU#include#include#includeintmain(intargc,char*argv){//sysconf获取有几个CPUintnum=sysconf(_SC_NPROCESSORS_CONF);intcreated_thread=0;intmyid;inti;intj=0;//原理其实很简单,就是通过cpu_set_t进行位与操作cpu_set_tmask;cpu_set_tget;if(argc!=2){printf(usage:./cpunumn);exit(1);}myid=atoi(argv)

;printf(systemhas%iprocessor(s).n,num)

;//先进行清空,然后设置掩码CPU_ZERO(mask);CPU_SET(myid,mask)

;//设置进程的亲和力if(sched_setaffinity(0,sizeof(mask),mask)==-1){printf(warning:couldnotsetCPUaffinity,continuing...n);}while(1){CPU_ZERO(get);//获取当前进程的亲和力if(sched_getaffinity(0,sizeof(get),get)==-1){printf(warning:coundnotgetcpuaffinity,continuing...n);}for(i=0;inum;i++){if(CPU_ISSET(i,get)){printf(thisprocess%disrunningprocessor:%dn,getpid(),i);}}}return0;}进程设置CPU运行,其实只能是单线程。多线程设定CPU如下:

viewplaincopy#define_GNU_SOURCE#include#include#include#include#include#includevoid*myfun(void*arg){cpu_set_tmask;cpu_set_tget;charbuf;inti;intj;//同样的先去获取CPU的个数intnum=sysconf(_SC_NPROCESSORS_CONF);printf(systemhas%dprocessor(s)n,num);for(i=0;inum;i++){CPU_ZERO(mask);CPU_SET(i,mask);//这个其实和设置进程的亲和力基本是一样的if(pthread_setaffinity_np(pthread_self(),sizeof(mask),mask)0){fprintf(stderr,setthreadaffinityfailedn);}CPU_ZERO(get);if(pthread_getaffinity_np(pthread_self(),sizeof(get),get)0){fprintf(stderr,getthreadaffinityfailedn);}for(j=0;jnum;j++){if(CPU_ISSET(j,get)){printf(thread%disrunninginprocessor%dn,(int)pthread_self(),j);}}j=0;while(j++100000000){memset(buf,0,sizeof(buf));}}pthread_exit(NULL);}intmain(intargc,char*argv){pthread_ttid;if(pthread_create(tid,NULL,(void*)myfun,NULL)!=0){fprintf(stderr,threadcreatefailedn);return-1;}pthread_join(tid,NULL);return0;}

linux线程调度策略

从Linux 2.6.23起,默认调度器为CFS(Completely Fair Scheduler),取代了O(1)调度器。CFS调度策略的详细信息可在sched-design-CFS中查阅,且cgroup的CPU调度为CFS扩展的一部分。

内核使用调度器决定下一个CPU周期执行的线程。每个线程包含调度策略与静态优先级sched_priority,调度器基于系统上所有线程的策略与优先级来决定调度。

对于SCHED_OTHER、SCHED_IDLE、SCHED_BATCH策略的线程,sched_priority不影响调度结果,且必须设为0。实时策略SCHED_FIFO与SCHED_RR线程的sched_priority取值为1至99,实时线程优先级高于普通线程。

调度器为每个sched_priority维护运行线程列表。调度器查看非空且优先级最高的列表,选择首部元素作为下个执行线程。

调度策略决定了如何根据静态优先级将线程插入相同优先级的线程列表,以及如何调整线程位置。所有调度具有抢占性,较高优先级线程准备运行时会抢占当前线程,并返回到相同优先级的等待列表。

进程调度包括两个队列:进程初始进入ready队列等待调度,遇到I/O阻塞、子进程结束或软中断等会进入wait队列,阻塞解除后返回ready队列。

SCHED_FIFO:First in-first out调度策略适用于静态优先级大于0的线程,线程立即抢占所有运行的SCHED_OTHER、SCHED_BATCH或SCHED_IDLE线程。不使用时间片,SCHED_FIFO策略线程应遵守规则。

SCHED_RR:轮询调度策略增强SCHED_FIFO,每个线程允许在最大时间段内运行。运行超过该时间段的SCHED_RR线程会被放置在优先级列表末尾。被更高优先级线程抢占后恢复运行,将在未过期时间段内继续。

SCHED_DEADLINE:结合GEDF与CBS的调度策略,适用于短任务模型。每个任务有相对截止时间与计算时间,使用sched_setattr(2)设置Runtime、Deadline与Period。内核要求参数至少1024,小于2^63。

CBS确保任务间不干扰,当SCHED_DEADLINE线程不可运行时,内核阻止其运行,执行准入测试确保修改可行。总的CPU利用率应小于可用CPU。使用SCHED_DEADLINE策略的线程优先级最高,会抢占其他策略下的线程。

使用SCHED_DEADLINE策略的线程fork(2)返回EAGAIN错误,除非设置reset-on-fork标记。调用sched_yield(2)停止当前任务,等待新周期。

SCHED_OTHER:默认Linux分时调度策略,静态优先级为0(普通线程)。动态优先级基于nice值,决定选择运行的线程。

SCHED_BATCH:用于静态优先级为0的批量处理进程,调度类似SCHED_OTHER,考虑CPU密集型行为,避免交互引起的抢占。

SCHED_IDLE:用于非常低优先级任务,nice值不影响此策略。

设置子进程的调度策略可使用reset-on-fork标识,fork(2)后子进程会disable此标识。

在Linux 2.6.12前,只有拥有特权的线程可设置非0静态优先级。后续版本仅非特权线程在调用者有效用户ID与目标线程一致时设置SCHED_OTHER策略。

设置或修改SCHED_DEADLINE策略需特权线程,RLIMIT_RTPRIO定义非特权线程设置SCHED_RR与SCHED_FIFIO策略的静态优先级上限。

实时进程与SCHED_FIFO、SCHED_RR中无限循环处理可能阻塞其他线程。从Linux 2.6.25起,通过RLIMIT_RTTIME限制实时进程CPU使用上限。

从Linux 2.6.25起,为非实时进程保留CPU时间,shell可停止进程以释放资源。

子进程通过fork(2)继承调度策略与参数,使用execve(2)可保存策略与参数。

SCHED_FIFO、SCHED_RR或SCHED_DEADLINE策略下调度的非阻塞无限循环可能导致系统冻结。从Linux 2.6.25起,通过RLIMIT_RTTIME限制实时与deadline进程使用CPU。

autogroup特性从Linux 2.6.38起提供,提升多进程与CPU密集型负载的交互式桌面性能。设置CONFIG_SCHED_AUTOGROUP启用特性,通过文件/proc/sys/kernel/sched_autogroup_enabled控制。autogroup允许进程以组形式调度,提升CPU分配效率。

nice值影响调度,SCHED_FIFO、SCHED_RR与SCHED_DEADLINE策略下,nice值仅影响同一任务组内的线程调度。

autogroup与cgroups CPU控制器可分别设置进程占用的CPU,cgroup配置覆盖autogroup。

从Linux 2.6.18起,Linux逐渐具备实时功能,部分依赖realtime-preempt补丁集。在补丁合并主线前,实时性能需通过安装补丁实现。

在/proc/sched_debug查看CPU核心调度情况,如docker服务在core1上的调度;/proc/$pid/sched查看特定进程调度情况。

详细信息参考原文作者charlieroro的博客园文章。

linux调度是基于进程还是线程

在LINUX系统之中,被调度的应该是进程。因为只有进程才拥有一个独立的上下文环境,是分配系统资源的最小单位……而线程在SMP体系中加速了执行的效率……

在LINUX之中,线程也可称作轻量级进程,它能享有自己的堆栈,线程ID等独立资源,但大多还是要依赖其创建进程,比如地址空间,信号,文件句柄……

阅读剩余
THE END