A. linux系统中,进程进行系统调用进入内核态时,是该进程本身进入内核态还是操作系统新开了一个内核线程
可以说是进程本身进入内核态。
系统调用调用了内核代码,但是,还是属于这个进程的进程上下文。
进程的切换要依靠时钟中断。
还要明白内核线程的功能,与进程切换没关系。
B. Linux用户进程内核态执行,内核线程的关系问题
1、几乎所有的程序都要切换到内核态运行再返回用户态,用中断完成回的,因为在内核下答封装了一些东西,用户态下只是传入某些参数后调用内核态下的函数罢了,
2、进程有三态(执行态,就绪态,阻塞态),cpu任何时刻都只有一个进程在执行,so从用户态切换到内核态时,用户态下的进程就处于阻塞或就绪态了,至于从用户态切换到内核态执行哪个函数那就看你在用户态下执行的是什么函数了,比如在用户态下的lseek在内核下就是llseek了,不一样的。
3、这问题就是linux的内存管理了,这里就得提到三种地址(逻辑地址、线性地址、物理地址),这里我们提到的4G地址是逻辑地址,不是我们实际的物理地址,linux中一个进程用户占0-3G对应的内核占3G-4G部分
说得不是很清楚,这是比较复杂的内容,需要从头看起,单就这几个问题是不能搞懂linux的,最好还是系统的学习,不断的重复
C. linux内核进行线程切换需要多少时间
Linux内核切换线程时间在微秒级别,几十微秒。
1. 查看需要更新的内核命令:内
apt-cachesearchlinux
#该命令将会显示容所有可以获取的内核
2. 安装内核,假设要安装的内核为2.6.39-0,则使用下面的命令
sudoapt-getinstalllinux-headers-2.6.39-0-genericlinux-image-2.6.39-0-generic
#安装后,reboot即可,重启后,既是以新内核启动。
D. linux 内核中,工作队列和线程有什么区别
一句话概括:根本就是两个不同的概念,差别很大。
简单的说:
一般来说,线版程是windows上的概权念,windows区分进程和线程。而在linux上,统一叫进程,进程是完成某项任务所需资源的集合,同时也是linux基本的执行单元。
工作队列是一个等待被执行的任务链表,由专有的线程来调度、执行。很多linux驱动的中断下半部的实现,都是采用工作队列的方式。
作者:陈彬
链接:https://www.hu.com/question/20085207/answer/13927301
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
E. 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);
例如以下代码创建了一个优先级为10的线程:
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);