linux怎么统计内核产生的进程

linux怎么统计内核产生的进程,第1张

1。 使用top命令,具体用法是 top -H加上这个选项,top的每一行就不是显示一个进程,而是一个线程

2。 使用ps命令,具体用法是 ps -xH

这样可以查看所有存在的线程,也可以使用grep作进一步的过滤。

3。 使用ps命令,具体用法是 ps -mq PID

这样可以看到指定的进程产生的线程数目。

更进一步,其实一些系统监控工具,在本质上也是读取的系统产生的文件罢了。比如说进程这个事情,

看看这个目录吧,/proc/5000/ 这里面有你所有想要的。其实stat代表着当前的一些信息。

使用ps命令来查看进程的时候,进程状态分别对应的含义如下:

D 不可中断睡眠 (通常是在IO *** 作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生

R 正在运行或可运行(在运行队列排队中)

S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)

T 已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行

W 正在换页(2.6.内核之前有效)

X 死进程 (未开启)

Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的

<高优先级(not nice to other users)

N 低优先级(nice to other users)

L 页面锁定在内存(实时和定制的IO)

s 一个信息头

l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)

+ 在前台进程组

关于更多Linux的学习,请查阅书籍《linux就该这么学》。

首先,我们知道所有线程共享主线程的虚拟地址空间(current->mm指向同一个地址),且都有自己的用户态堆栈(共享父进程的地址空间,再在里面分配自己的独立栈,默认2M)。这是毫无疑问的,但还有一点我没搞明白,内核栈是共享还是独立的?猜测:独立的。理由:要不然内核栈对应的thread_info中的tast_struct没有办法与每个线程对应起来,因为现在已经有多个task_struct了,但保存内核栈的thread_info(其实是thread_union联合体)中只能保存一个task_struct。所以理论上分析,虽然可以共享地址空间,但每个线程还是需要一个单独的内核栈的。看代码:分析创建线程最终肯定会走到内核函数do_fork()中来的,所以从此函数看起。do_fork()->copy_process()->dup_task_struct()fork.c中dup_task_struct()的实现:static struct task_struct *dup_task_struct(struct task_struct *orig){struct task_struct *tskstruct thread_info *tiunsigned long *stackendint node = tsk_fork_get_node(orig)int errtsk = alloc_task_struct_node(node)if (!tsk)return NULLti = alloc_thread_info_node(tsk, node)/*就是这里,果然分配内核栈了*/if (!ti)goto free_tskerr = arch_dup_task_struct(tsk, orig)/*这里分配task_struct结构*/if (err)goto free_titsk->stack = ti...}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7539512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存