Linux进程看不到?管理进程应该这样操作 (linux看不到进程管理)

linux系统中,进程是系统中最重要的概念之一。进程是一个运行程序的实体,可以执行各种操作,如文件读写、网络通信等。进程管理对于系统的运行和性能有着重要的影响。但是有的时候,我们发现一些进程看不到,怎么办呢?

本文将介绍Linux进程的基本概念和管理方式,同时探讨常见的进程看不到的原因和解决方法。

一、进程的基本概念

1.进程的概念

进程是一个正在运行的程序实例。每个进程都有自己的地址空间、资源和权限,它们是Linux系统中最小的可调度实体。在Linux系统中,进程是通过fork函数创建的。

2.进程的状态

在Linux系统中,进程的状态分为五种:

1)运行态(R):进程正在运行。

2)等待态(S):进程正在等待某个事件的发生,例如等待磁盘I/O完成。

3)中断睡眠(D):进程正在等待设备中断或信号。

4)停止(T):进程已被终止,但它的父进程尚未进行清理工作。

5)僵尸(Z):进程已经终止,但它的父进程尚未进行清理工作。

3.进程间关系

在Linux系统中,进程间存在父子关系。一个进程可以通过fork函数创建一个子进程,子进程和父进程共享一部分资源。子进程可以通过exec函数替换自己的镜像,父进程可以通过wt函数回收子进程资源。

二、进程管理方式

在Linux系统中,我们可以使用命令行工具或者图形化界面来管理进程。

1.命令行管理进程

在命令行中,我们可以使用ps、top、kill等命令来管理进程。

1)ps命令

ps命令用于查看系统中运行的进程信息。常用参数有:

-a:显示全部进程。

-u:显示进程的详细信息。

-x:显示没有控制终端的进程。

2)top命令

top命令可以实时地显示进程的状态和资源使用情况。常用参数有:

-p:查看指定进程的状态和资源使用情况。

3)kill命令

kill命令用于终止进程。常用参数有:

-9:强行终止进程。

2.图形化管理进程

在图形化界面中,我们可以使用系统监视器等工具来管理进程。

1)系统监视器

系统监视器可以实时地显示进程的状态和资源使用情况。

2)任务管理器

任务管理器可以维护系统中的进程,包括终止进程、调整进程优先级等。

三、进程看不到的原因和解决方法

有时候我们会发现一些进程在ps命令或者系统监视器中看不到,这是因为这些进程处于后台或者守护进程的状态。

对于后台进程,我们可以使用jobs命令或者fg、bg命令将其调至前台。对于守护进程,我们可以通过/var/run/和/etc/init.d/目录下相关文件的设置和启动来管理它们。

1.后台进程

后台进程是指在命令行模式下运行的程序,可以使用&符号将其放到后台运行。例如:

$ ./test &

这时候,我们使用ps命令将看不到该进程。要查看及管理该进程,可以使用以下命令:

1)jobs命令

jobs命令可以列出当前所有在后台运行的进程,例如:

$ jobs

[1]+ Running ./test &

其中[1]+代表该进程的编号。

2)fg命令

fg命令可以将一个后台进程调到前台,并将其标准输入重定向到当前终端。例如:

$ fg %1

其中%1代表进程编号。

3)bg命令

bg命令可以将一个在前台停止的进程放到后台运行。例如:

$ bg %1

其中%1代表进程编号。

2.守护进程

守护进程是一种在后台运行的程序,不和任何终端交互,通常在系统启动时自动启动。守护进程将自己脱离控制台,不受控制台关闭的影响。守护进程一般保存在/etc/init.d目录下,控制脚本保存在/var/run目录下。要查看及管理守护进程,可以使用以下命令:

1)service命令

service命令可以启动、停止、重启一个守护进程。例如:

$ service httpd start

$ service httpd stop

$ service httpd restart

2)systemctl命令

systemctl命令可以列出系统中所有的守护进程。例如:

$ systemctl status

4.

本文介绍了Linux进程的基本概念和管理方式。同时对于进程看不到的原因和解决方法进行了讲解。通过这篇文章,我们应该能够更加深入地了解和管理Linux系统中的进程。

相关问题拓展阅读:

  • Linux 进程管理之进程调度与切换
  • 如何在Linux中查看所有正在运行的进程

Linux 进程管理之进程调度与切换

我们知道,进程运行需要各种各样的系统资源,如内存、文件、打印机和最

宝贵的 CPU 等,所以说,调度的实质就是资源的分配。系统通过不同的调度算法(Scheng Algorithm)来实现这种资源的分配。通常来说,选择什么样的调度算法取决于资源分配的策略(Scheng Policy)。

有关调度相关的结构保存在 task_struct 中,如下:

active_mm 是为内核线程而引入的,因为内核线程没有自己的地址空间,为了让内核线程与普通进程具有统一的上下文切换方式,当内核线程进行上下文切换时,让切换进来的线程的 active_mm 指向刚被调度出去的进程的 active_mm(如果进程的mm 域不为空,则其 active_mm 域与 mm 域相同)。

在 linux 2.6 中 sched_class 表示该进程所属的调度器类有3种:

进程的调度策略有5种,用户可以调用调度器里不同的调度策略:

在每个 CPU 中都有一个自身的运行队列 rq,每个活动进程只出现在一个运行队列中,在多个 CPU 上同时运行一个进程是不可能的。

运行队列是使用如下结构实现的:

tast 作为调度实体加入到 CPU 中的调度队列中。

系统中所有的运行队列都在 runqueues 数组中,该数组的每个元素分别对应于系统中的一个 CPU。在单处理器系统中,由于只需要一个就绪队列,因此数组只有一个元素。

内核也定义了一下便利的宏,其含义很明显。

Linux、c/c++服磨冲务器开发篇我们来聊聊进程的那些事

Linux内核 进程间通信组件的实现

学习视频教程-腾讯课堂

需要C/C++ linux服务器架构师学习资料加qun获取(资料包括

C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg

等),免费分享

在分析调度流程之前,我们先来看在什么情况下要执行调度程序,我们把这种情况叫做调度时机。

Linux 调度时机主要有。

时机1,进程要调用 sleep() 或 exit() 等函数进行状态转换,这些函数会主动调用调度程序进行进程调度。

时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4 是一样的。

时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。在每次反复循环中,驱动程序都检查 need_resched 的值,如果必要,则调用调度程序 schedule() 主动放弃 CPU。

时机4 , 如前所述, 不管是从中断、异常还是系统调用返回, 最终都调用 ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调用调度程序。那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核吵圆态该处理的事全部做完。

Linux 的调度程序是一个叫 Schedule() 的函数,这个函数来决定是否要进行进程的切换,如果要切换的话,切换到哪个进程等。

从代码分析来看,Schedule 主要完成了2个功能:

进程上下文切换包括进程的地址空间的切换和执行环境的切换。

对于 switch_mm 处理,关键的一步就是它将新进程页面目录的起始物理地址装入到寄瞎碰歼存器 CR3 中。CR3 寄存器总是指向当前进程的页面目录。

switch_to 把寄存器中的值比如esp等存放到进程thread结构中,保存现场一边后续恢复,同时调用 __switch_to 完成了堆栈的切换。

在进程的 task_struct 结构中有个重要的成分 thread,它本身是一个数据结构 thread_struct, 里面记录着进程在切换时的(系统空间)堆栈指针,取指令地址(也就是“返回地址”)等关键性的信息。

关于__switch_to 的工作就是处理 TSS (任务状态段)。

TSS 全称task state segment,是指在操作系统进程管理的过程中,任务(进程)切换时的任务现场信息。

linux 为每一个 CPU 提供一个 TSS 段,并且在 TR 寄存器中保存该段。

linux 中之所以为每一个 CPU 提供一个 TSS 段,而不是为每个进程提供一个TSS 段,主要原因是 TR 寄存器永远指向它,在任务切换的适合不必切换 TR 寄存器,从而减小开销。

在从用户态切换到内核态时,可以通过获取 TSS 段中的 esp0 来获取当前进程的内核栈 栈顶指针,从而可以保存用户态的 cs,esp,eip 等上下文。

TSS 在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。所谓任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。

在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到 TR(任务寄存器)所指定的任务的 TSS 中;然后,下一任务的 TSS 被装入 TR;最后,从 TR 所指定的 TSS 中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在 TSS 中保存任务现场各寄存器状态的完整映象,实现任务的切换。

因此,__switch_to 核心内容就是将 TSS 中的内核空间(0级)堆栈指针换成 next->esp0。这是因为 CPU 在穿越中断门或者陷阱门时要根据新的运行级别从TSS中取得进程在系统空间的堆栈指针。

thread_struct.esp0 指向进程的系统空间堆栈的顶端。当一个进程被调度运行时,内核会将这个变量写入 TSS 的 esp0 字段,表示这个进程进入0级运行时其堆栈的位置。换句话说,进程的 thread_struct 结构中的 esp0 保存着其系统空间堆栈指针。当进程穿过中断门、陷阱门或者调用门进入系统空间时,处理器会从这里恢复期系统空间栈。

由于栈中变量的访问依赖的是段、页、和 esp、ebp 等这些寄存器,所以当段、页、寄存器切换完以后,栈中的变量就可以被访问了。

因此 switch_to 完成了进程堆栈的切换,由于被切进的进程各个寄存器的信息已完成切换,因此 next 进程得以执行指令运行。

由于 A 进程在调用 switch_to 完成了与 B 进程堆栈的切换,也即是寄存器中的值都是 B 的,所以 A 进程在 switch_to 执行完后,A停止运行,B开始运行,当过一段时间又把 A 进程切进去后,A 开始从switch_to 后面的代码开始执行。

schedule 的调用流程如下:

如何在Linux中查看所有正在运行的进程

最简单的查看正在运行的命令是top,可以动态显示进程,负载,CPU等。

这个只需要输入下面命令就可以了

ps -fe

linux看不到进程管理的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux看不到进程管理,Linux进程看不到?管理进程应该这样操作,Linux 进程管理之进程调度与切换,如何在Linux中查看所有正在运行的进程的信息别忘了在本站进行查找喔。

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《Linux进程看不到?管理进程应该这样操作 (linux看不到进程管理)》
文章链接:https://zhuji.vsping.com/27727.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。