精华内容
下载资源
问答
  • 易语言查看内核线程源码,查看内核线程,EnumThread,EnumDrivers,getdata_int,getdata_str,ZwQuerySystemInformation
  • 易语言查看内核线程

    2015-08-24 21:02:41
    易语言查看内核线程
  • ps命令查看内核线程

    千次阅读 2013-04-01 10:25:48
    ps -aux 命令显示正在运行的线程,名字带方括号的是内核线程
    ps -aux  命令显示正在运行的线程,名字带方括号的是内核线程。
    
    展开全文
  • 内核线程

    千次阅读 2018-03-19 22:31:53
    内核线程的真正含义是:内核线程没有独立的地址空间,地址空间的mm域为空NULL,他们没有用户上下文。《linux内核设计与实现30页、...可以通过ps -ef查看内核线程。内核线程接口:1:kthread_create() :创建内核线程 ...

    内核线程的真正含义是:内核线程没有独立的地址空间,地址空间的mm域为空NULL,他们没有用户上下文。《linux内核设计与实现30页、250页》。


    内核线程只运行于内核空间,它只能使用大于PAGE_OFFSET[3G]的地址空间:0x'FFFF000-0XFFFFFFFF。可以通过ps -ef查看内核线程

    内核线程接口:1:kthread_create() :创建内核线程

                                注意:创建完线程一定要用IS_ERR(ptr)检查返回值,如果正确才能调用唤醒线程

                            2:wake_up_process():唤醒线程

                            3:kthread_run():创建并且唤醒线程,其实是封装的1和2两个函数。

                            4:kthread_stop():销毁线程,kthread_stop首先设置结束标志should_stop,然后等待线程运行完结束线程。

                                注意:销毁线程钱一定要用IS_ERR(ptr)检查ptr是否错误,因为如果创建的线程中没有循环,线程运行一次就结束了,内核线程会自动销毁,这时如果再调用kthread_stop()函数就会导致内核崩溃--oops。---》原因是内核自动销毁,其对应的task_struct结构也会变的无效,所以结构体对应的成员就不能引用。

                            5:kthread_should_stop():该函数用来返回should_stop标志,并决定是否退出。

    内核线程用法:

        1:创建的内核线程中应该包含while循环,目的是让线程持续运行,while的条件应该用while(!kthread_should_stop()){循环体}。

        2:唤醒线程和销毁线程的调用前,一定要判断创建的内核线程的返回值是否是错误的,用IS_ERR()来判断,防止内核挂死。


    内核线程应用:

    1:在线模块用中断驱动,离线模块用内核线程驱动。

    2:应用在中断下半部,例如申请内存会导致睡眠,不能在中断中调用,这时候可以创建一个内核线程,创建一个状态机,中断中需要创建内存时,设置对应的状态机,内核线程一直查询该状态机,当状态机为分配内存时,内核线程就可以完成上述要求。


    内核线程总结草稿图:






    总结:本文主要讲解内核线程的用法及应用,具体内部实现不在本文讨论范围。



    展开全文
  • 内核线程创建与销毁

    2013-08-06 10:56:53
    查看内核线程的方法:ps -aux 可以查看系统中的所有线程,其中带有[ ]的表示是内核线程。 内核线程创建方法: thread = kthread_create(taskq_thread, tqt, "%s/%d", name, i); wake_up_process(thread); ...
    查看内核线程的方法:ps -aux 可以查看系统中的所有线程,其中带有[ ]的表示是内核线程。

    内核线程创建方法:
    thread = kthread_create(taskq_thread, tqt, "%s/%d", name, i);
    wake_up_process(thread);
    其中taskq_thread为该内核函数需要做的事情。
    内核线程的销毁函数如下:

    kthread_stop(thread);


    如果要将内核线程绑定到具体的CPU上,可以采用如下方法:
    kthread_bind(tqt->tqt_thread, i % num_online_cpus());

    <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
    阅读(1337) | 评论(0) | 转发(0) |
    0

    上一篇:脚本备份

    下一篇:块设备设备号的概念

    给主人留下些什么吧!~~
    评论热议
    展开全文
  • 内核线程和用户线程

    千次阅读 2017-04-01 20:18:37
    ---- 在Ubuntu系统下,使用 ps -axjf 命令可以查看详细的内核线程和用户线程状态。 # ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 396 256 c45ebcd0 0000875c S /init root 2 0...

    ---- 在Ubuntu系统下,使用 ps -axjf(ps -eLf) 命令可以查看详细的内核线程和用户线程状态。

    ps:report a snapshot of the current processes, displays information about a selection of the active processes.

    top: if you want a repetitive update of the selection and the displayed information.

     # ps
     USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
     root      1     0     396    256   c45ebcd0 0000875c S /init
     root      2     0     0      0     c4570cec 00000000 S kthreadd
     root      3     2     0      0     c45618e8 00000000 S ksoftirqd/0
     root      4     2     0      0     c4599578 00000000 S watchdog/0
     root      5     2     0      0     c456d8bc 00000000 S events/0
     root      6     2     0      0     c456d8bc 00000000 S cpuset
     root      7     2     0      0     c456d8bc 00000000 S khelper

    上面的ps命令列出了1号进程/init,2号进程kthreadd,其他的线程,基本都是1号和2号进程的子进程(子线程)。

    PID指示该进程的进程号,PPID指示该进程的父进程号。

    可以看出,1号和2号进程的父进程就是0号线程,PPID=0,是Kernel在start_kernel中创建的第一个线程,称为Idle线程

    当没有其他线程在运行时,schedule将调度它进入Idle省电状态

    由于0号进程是一个特殊的进程,所以ps命令并没有把它列出来。

    ps命令参数解析:

    -A:Select all processes. Identical to -e

    -a:Select all processes except both session leaders (see getsid(2)) and processes not associated with a terminal.

    -u:代表user,在需要查看特定用户进程的情况下使用,如ps -u dong

    -f :do full-format listing(全格式列出)

    -L:NLMP(number of threads),LMP(thread id)columns will be added

    如果想根据CPU或内存用量来筛选,用-aux参数

    ---- 线程与进程

    在学习Linux的知识时,书上经常会有线程和进程的提法,在Linux内核中,其实是不区分进程还是线程的。

    Linux kernel会使用一个统一的task_struct (进程描述符)来描述任务相关的所有信息。

    然而我们该怎么样来理解程序,进程,线程的区别呢?

    程序:程序是静态的说法,它是保存在某种介质(磁盘)上的可执行文件,是code与data的集合。

    进程:处于执行状态的程序以及它所包含的资源的总称,进程是一个程序的动态的执行的实体

    线程:线程是进程中的一个动态对象,是程序执行的最小单元

    一个进程中可能包含有多个线程,这些线程会共享同一个进程中的资源。例如地址空间,所打开的文件等。

    从实际的例子来看,假如我们生成了一个可执行的程序,它保存在文件中时,就是程序;

    一旦系统开始调度这个程序执行,那么它可以称为一个进程。

    在这个进程中可能会有不同的线程,例如很可能存在tcp thread, ip thread,以及其它为了完成某一功能而创建的thread。

    由于我们在嵌入式Linux Kernel实际工作中使用的还是线程的概念,因此之后的讨论一概以线程来称呼。

    线程描述符  task_struct  (可以参考kernel/include/linux/sched.h)中包含了一个线程相关的所有信息,里面主要描述了线程的状态,虚拟内存空间信息,寄存器和堆栈上下文等。

    ---- 线程间的关系

    在Linux中,所有的线程可以分为3种,Idle线程内核线程用户线程。

    其中,Idle线程是特殊的0号线程,它在Linux系统一开始创建的时候就存在,并且0号线程是其他所有线程的父线程。

    内核线程是由kernel_thread或kthread_create等特殊的内核线程函数所创建的

    在Linux kernel 2.6以后,基本上内核线程都从2号线程do_fork()而来;

    用户线程是在用户态下通过C库函数fork()所创建,并且大部分都是从1号线程继承而来;

    0号线程 它就是Idle线程,在kernel初始化时(start_kernel函数中)创建.

    并且0号线程的描述符,并不是通过fork()过程创建起来的,而是通过INIT_TASK宏(/kernel/arch/arm/init_task.c)静态配置的。

    在SMP系统中,每一个CPU都对应一个0号线程,当CPU空闲时,Linux Kernel将调度Idle线程执行,

    此时Idle线程进入cpu_idle函数,在该函数内部实现sleep睡眠设计,达到省电的功能;

    1号线程:在start_kernel->rest_init函数中,系统通过调用 kernel_thread(kernel_init, ...)而创建了1号线程.

    当1号线程完成初始化任务后,会通过run_init_process("/sbin/init", ... ) 函数去执行系统目录下的init程序.

    此时1号线程就用内核线程转为了用户线程;init程序会继续完成用户态下的各种应用初始化过程;

    由于1号线程是在rest_init函数中通过kernel_thread 函数(实际上最后执行了do_fork() 函数)所创建的。

    因此1号线程的父线程是0号线程;1号线程最后的显示为"init"。

    2号线程在start_kernel->rest_init函数中,系统通过调用kernel_thread(kthreadd, ...)创建了2号线程

    2号线程主要承担创建其他内核线程的任务

    在后续kernel的执行中,如果调用 kthread_create()函数来创建内核线程,则其父线程均设置为2号线程;

    如果调用kernel_thread()函数来创建内核线程,通过一些附加的操作,也可以将父线程修改为2号线程。

    因此,在一个规范的Linux系统中,我们可以看到几乎所有的内核线程,其父线程均为2号线程,

    它也是0号线程的子线程;2号线程最后显示为"kthreadd"。

    内核线程: 在内核态下,通过kernel_thread()或者kthread_create()等API创建的线程,属于内核线程。

    由于kthread_create的实现方式,通过该函数创建的内核线程,其父线程均为2号kthreadd线程;

    用户线程: 在用户态下,通过pthread_create()或者fork()等C库函数调用所创建的线程。

    由于1号线程是第一个用户线程,同时也是启动其他线程的入口;

    因此所有的用户线程都可以从父子关系上查看到,它们属于1号线程的子孙线程。

    内核线程与用户线程的差别,主要在于:

    1.  创建方式:内核线程必须在内核态下,通过kernel_thread()或者kthread_create()等内核函数API所创建;

    用户线程必须在用户态下,通过fork()或pthread_create()等C library函数所创建;

    2. 运行方式:内核线程只能运行在内核态,它只能调用内核函数,不能调用用户态函数,因此无法使用C library函数;

    用户线程可以运行在用户态,也可以通过系统调用,"陷入"内核态中运行,只有在内核态中才能调用内核函数

    3. 运行空间:内核线程只能访问到内核态的大于PAGE_OFFSET(3GB)的地址空间;用户态可以使用整个4GB地址空间

    此时前3GB的地址空间属于本进程独享,而大于PAGE_OFFSET的内核态空间则属于全体线程共享;

    特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令。

    不同的操作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指令。

    展开全文
  • 内核线程分析报告

    2012-03-30 15:46:23
    刚刚开机之后,使用ps 查看系统内的内核线程,主要情况如下:  共发现有232 个内核线程存在,它们分别是:  (1 )kthreadd :这种内核线程只有一个,它的作用是管理调度其它的内核线程。它在内核初始化的...
  • 内核线程学习笔记

    2013-04-08 11:00:14
    1,内核线程大部分操作和驱动模块一样,有init和exit,也使用insmod命令加载.ko文件,加载后内核线程自动执行,不受用户影响,具体情况以后再续 2,当我加载了一个ko文件后用ps查看,可见,多出来了一个mythread。 ...
  • 在测试开发的内核模块时,发现了一个BUG:在模块没有卸载时使用reboot命令重启系统的话,系统重启不了,查看日志发现在创建的内核线程中陷入了死循环,导致系统无法重启。检查了代码,发现产生问题的原因是当系统...
  • Linux内核线程列表

    千次阅读 2013-07-01 16:25:06
    使用ps aux命令查看到的内核线程列表   USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 4.2 6.0 17504 15140 ? Ss 00:21 0:04 /usr/lib/systemd/systemd root
  • 在使用ps查看线程的时候,会有不少[...]名称的线程,这些有别于其它线程,都是内核线程。 其中多数内核线程从名称看,就知道其主要功能。 比如给中断线程化使用的irq内核线程,软中断使用的内核线程ksoftirqd,以及...
  • linux内核线程的创建

    2014-09-17 10:36:18
    在 Linux 中有很多的内核线程,可以通过 ps command 查看到,比如: kthreadd ksoftirqd watchdog 等等等 … 它们都是由内核从无到有创建的,通过它们的 pid 以及 ppid 可以得出以下几点: 在内核初始化 ...
  • 关键词:kthread、irq、...在使用ps查看线程的时候,会有不少[...]名称的线程,这些有别于其它线程,都是内核线程。 其中多数内核线程从名称看,就知道其主要功能。 比如给中断线程化使用的irq内核线程,软中...
  • 6.1.1 用户级线程和内核级线程 ...图6-1(a)显示了用户级线程,图6-1(b)显示了内核级线程,图6-1(c)则显示了用户线程和内核线程的混合。   (点击查看大图)(a) 用户级线程  
  • 守护进程(内核线程和普通进程)

    千次阅读 2014-05-05 23:45:04
    在操作系统中占据相当大的比例,当Linux操作系统启动以后,尤其是Xwindow也启动以后,你可以用”ps”命令查看系统中的进程,这时会发现很多以”d”结尾的进程名,这些进程就是内核线程。 内核线程也可以叫内核任务...
  • Linux中没有真正的线程,Windows中有,Linux中的线程叫做LWP,即轻量级...查看某个用户(wls81)每个进程开启了多少线程 ps -o nlwp,pid,lwp,args -u wls81 | sort -n 查看某个用户使用了多少进程资源 ps -eL...
  • 查看了schedule()函数实现,发现内核提供了对应的notifier机制. 1.进程sched out流程 schedule->__schedule->context_switch->prepare_task_switch-> fire_sched_out_preempt_no...
  • 一、常见错误方法 ...右键屏幕底部->启动任务管理器->性能->CPU使用记录(如下图,有几个框即为几线程,我的电脑为八线程,这种方式查看线程是可以的,但用这种方式查看核数是错误的) 然而真的是这样吗?
  • 这几天在和同学讨论的时候,对于内核线程和用户线程概念上出现了问题,在网上搜索了不少文章,感觉还是不是我想要的,下来查看了以前学习的操作系统才弄 明白,在这里将我的理解写出来让大家看看,和大家分享分享。...
  • 这两天查微信屏不亮的问题,跟踪进程阻塞,从用户层,跨进程,再跟到kernel层,...查看内核层stack cat /proc/tid/stack 其中的tid为线程id,可以用ps -t查看系统所有线程,每个进程的主线程id和进程id是相同的   如
  • 内核线程和用户级线程区别

    千次阅读 2013-09-21 10:48:54
    这几天在和同学讨论的时候,对于内核线程和用户线程概念上出现了问题,在网上搜索了不少文章,感觉还是不是我想要的,下来查看了以前学习的操作系统才弄 明白,在这里将我的理解写出来让大家看看,和大家分享分享。...
  • 查看java线程

    千次阅读 2020-02-16 14:43:53
    我们知道java线程使用的是底层操作系统"轻量级线程"+"内核线程"的1:1模型,那么我们如何查看一个运行的java进程中线程数呢? 1、linux上查看进程中线程数: 主要有以下三种方法: 1)top -Hp pid $ top -Hp ...
  • 自己创建的内核线程,当把模块加载到内核之后,可以通过:ps –ef 命令来查看线程运行的情况。通过该命令可以看到该线程的pid和ppid等。也可以通过使用kill –s 9 pid 来杀死对应pid的线程。如果要支持kill命令自己...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,018
精华内容 407
关键字:

查看内核线程