top命令浅析

top

使用top命令会实时的刷新系统的负载信息

top命令的选项很多,此处只列举我个人觉得比较实用的几个选项,具体选项可以参考man top 进行查看

-u user    只显示指定用户启动的进程

-p pid     只显示指定pid的进程

-d secs    指定列表的刷新速度

-i          不显示任何闲置(idle)或无用的(zombie)的进程/或在交互模式下按i也可以实现此功能,这样只输出活跃的进程,看上去比较简洁。

 

统计信息区前五行是系统整体的统计信息。

第一行是任务队列信息,同 uptime  命令的执行结果。其内容如下:

01:06:48                 当前时间

up  1:22                 系统运行时间,格式为时:分

1   user                 当前登录用户数

load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。这三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值。

第二、三行为进程和CPU的信息,内容如下:

Tasks: 29 total  进程总数

1 running            正在运行的进程数

28 sleeping       睡眠的进程数

0 stopped            停止的进程数

0 zombie            僵尸进程数

Cpu(s): 0.3% us  用户空间占用CPU百分比

1.0% sy            内核空间占用CPU百分比

0.0% ni            用户进程空间内改变过优先级的进程占用CPU百分比

98.7% id            空闲CPU百分比---这个值越低说明cpu越忙

0.0% wa            等待输入输出的CPU时间百分比

0.0% hi            硬中断所占的百分比

0.0% si            软中断所占的百分比

最后两行为内存信息。内容如下:

Mem: 191272k total 物理内存总量

173656k used         使用的物理内存总量

17616k free         空闲内存总量

22052k buffers         用作内核缓存的内存量

Swap: 192772k total 交换区总量

0k used                 使用的交换区总量

192772k free         空闲交换区总量

123988k cached         缓冲的交换区总量。

            内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,

            该数值即为这些内容已存在于内存中的交换区的大小。

            相应的内存再次被换出时可不必再对交换区写入。

小技巧,在使用top命令时按下m,内存使用栏会出现使用百分比,如下,

 按下e键可以切换展示的单位

 

 

进程信息区统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。

列名 含义

PID 进程id

PPID 父进程id

RUSER Real user name

UID 进程所有者的用户id

USER 进程所有者的用户名

GROUP 进程所有者的组名

TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?

PR 优先级

NI nice值。负值表示高优先级,正值表示低优先级(-19~+20,共40个等级,-19为优先级最高)

P 最后使用的CPU,仅在多CPU环境下有意义

%CPU 上次更新到现在的CPU时间占用百分比

TIME 进程使用的CPU时间总计,单位秒

TIME+ 进程使用的CPU时间总计,单位1/100秒

%MEM 进程使用的物理内存百分比

VIRT 进程使用的虚拟内存总量,指的是进程占用的虚拟内存大小,包括实际使用的内存和暂时未使用的内存空间,包括进程使用的库、代码、数据,以及malloc、new分配的堆空间和分配的栈空间等,在Linux操作系统中,程序在运行时会申请一定的内存空间用于存储程序数据和运行时信息。在程序运行过程中,有些内存空间并不是一直都被占用的,可能有些时间段内是暂时空闲的。这些内存空间被称为暂时未使用的空间,也称为虚拟内存(注意:top命令中的VIRT是一个进程的虚拟内存大小,包括了程序中已经申请的内存、共享库中已加载的内存、堆和栈等。而系统的最大内存是指该系统所能够支持的最大物理内存的大小。

因此,一个进程的VIRT大小可能超过系统最大内存大小,是因为虚拟内存可以被映射到物理内存或者硬盘上的交换分区中。所以,即使系统物理内存已满,进程也可以从交换分区中获取空间,从而使其虚拟内存超过系统的最大内存大小。)

RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA,指的是进程当前正在使用的物理内存大小,不包括暂时未使用的内存空间和结果数据存储在虚拟内存中的内存大小。也就是应用程序的常驻内存(RES表示进程的常驻内存大小,准确表示当前有多少物理内存被这个进程消费。这个大小永远要比VIRT小,因为程序大部分使用到c库,这些库的代码是共享的,所以它们不会被计算在RES中。

SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。

CODE 可执行代码占用的物理内存大小,单位kb

DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb

SHR 共享内存大小,单位kb

nFLT 页面错误次数

nDRT 最后一次写入到现在,被修改过的页面数。

S 进程状态。

            D=不可中断的睡眠状态

            R=运行

            S=睡眠

            T=跟踪/停止

            Z=僵尸进程

COMMAND 命令名/命令行

WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名

Flags 任务标志,

扩展,关于硬中断和软中断

什么是硬中断

定义:硬中断(Hardware interrupt)是由于硬件设备产生的中断信号,当硬件设备需要CPU的处理时,它会向CPU发送一个中断请求,CPU在收到中断请求后会暂停正在执行的任务,保存当前任务的状态,并跳转到中断处理程序的地址去执行。在中断处理程序执行结束后,CPU再恢复之前的任务并继续执行硬中断可以是外部设备产生的,如鼠标、键盘,磁盘驱动器,网络适配器等,也可以是CPU自身产生的,如除零错误,缺页中断等(因为这些错误会导致当前进程无法继续执行,需要中断当前进程,处理异常情况)。

为什么会产生硬中断?

因为硬件的处理速度相比cpu的处理速度更快,硬件通常是由电子电路或其他物理部件,如磁盘组成的,这些部件可以直接执行计算或操作,而无需等待cpu完成指令,而cpu则需要按照程序逐步执行指令,这需要时间,---硬件为了得到及时的响应,并迅速得到处理,硬件回向cpu发送中断信号,cpu会立即暂停当前操作,切换到中断处理程序,处理完毕后再切换到原来的操作。硬中断是系统中非常重要的一部分,以确保系统能够快速响应硬件的需求。

什么是软中断

定义:软中断(Soft Interrupt)是操作系统用于处理非硬件中断的一种机制。它是一种软件中断,通常由系统调用或者异常事件触发,如键盘输入、定时器事件等。

软中断是在内核空间中执行的,与硬件中断不同,它不会暂停CPU的执行,而是会直接进入内核态,调用相应的处理函数来执行需要处理的操作,如网络包处理、文件系统I/O等。由于软中断不需要真正的中断硬件,因此可以更快速地完成处理。软中断通常是由操作系统在内核空间中创建的,用于提高系统性能和响应能力。它是现代操作系统中非常重要的一部分。

硬中断和软中断的区别

硬中断和软中断是计算机中的两种不同的中断方式。硬中断大部分是由外部设备发出的中断信号,而软中断是由CPU执行指令产生的中断信号。硬中断的中断号是由中断控制器提供的,而软中断的中断号由指令直接给出,无需使用中断控制器。硬中断是可屏蔽的,而软中断不可屏蔽。硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等待较长时间

需要注意的是键盘输入属于硬件输入,但是键盘输入并不会直接触发硬件中断,而是通过软件来实现的。当用户按下键盘上的某个键时,键盘会向计算机发送一个扫描码,然后操作系统会将扫描码转换为字符编码,并将其存储在缓冲区中。当应用程序需要读取键盘输入时,它会从缓冲区读取字符编码

什么是扫描码

键盘扫描码是指键盘向计算机发送的一项数据,用于告知计算机那些键被按下。键盘扫描码是由键盘发送的1至3个字节为一组。大多数字符键具有单字节扫描码,执行特殊功能的按键用2字节或3字节扫描码,通常以下列字节开头(十六进制): E0 、 E1 或 E2 。当按下一个键时,产生 mark 码,放开键时,产生 break 码。因此:当按下 A 键放开,实际上产生了两次 IRQ1 中断。扫描码集包括基本 scan code 和扩展 scan code。基本 scan code 绝大多数 scan code 是 1 byte 的,而扩展 scan code 则由 e0 、 e1 或 e2 引导

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocal 是 Java 中的一个类,它提供了一种线程局部变量的机制。线程局部变量是指每个线程都有自己的变量副本,每个线程对该变量的访问都是独立的,互不影响。 ThreadLocal 主要用于解决多线程并发访问共享变量时的线程安全问题。在多线程环境下,如果多个线程共同访问同一个变量,可能会出现竞争条件,导致数据不一致或者出现线程安全问题。通过使用 ThreadLocal,可以为每个线程提供独立的副本,从而避免了线程安全问题。 ThreadLocal 的工作原理是,每个 Thread 对象内部都维护了一个 ThreadLocalMap 对象,ThreadLocalMap 是一个 key-value 结构,其中 key 是 ThreadLocal 对象,value 是该线程对应的变量副本。当访问 ThreadLocal 的 get() 方法时,会根据当前线程获取到对应的 ThreadLocalMap 对象,并从中查找到与 ThreadLocal 对象对应的值。如果当前线程尚未设置该 ThreadLocal 对象的值,则会通过 initialValue() 方法初始化一个值,并将其存入 ThreadLocalMap 中。当访问 ThreadLocal 的 set() 方法时,会将指定的值存入当前线程对应的 ThreadLocalMap 中。 需要注意的是,ThreadLocal 并不能解决共享资源的并发访问问题,它只是提供了一种线程内部的隔离机制。在使用 ThreadLocal 时,需要注意合理地使用,避免出现内存泄漏或者数据不一致的情况。另外,由于 ThreadLocal 使用了线程的 ThreadLocalMap,因此在使用完 ThreadLocal 后,需要手动调用 remove() 方法清理对应的变量副本,以防止内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值