【Linux】计算机组成与进程

目录

一、计算机的基本组成

1、计算机组成五大部件

2、系统总线

3、指令

二、进程

1、PID  

2、PCB

3、进程状态

4、进程管理命令

(1)ps

(2)pstree

(3)jobs

(5)&

(6)fg bg

(7)kill

(8)pkill

(9)killAll

(10)top

5、生产环境服务器变慢,诊断思路和性能评估


一、计算机的基本组成

1、计算机组成五大部件

  • 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运 算,移位,比较等。
  • 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算 机按照预先规定的目标和步骤有条不紊地进行操作及处理。
  • 存储器 :存储程序和各种数据。
  • 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存储起来。
  • 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。 一台计算机可以抽象成下图: CPU 中包含控制器和运算器, 内存就是存储器。I/O 设 备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡。

image

2、系统总线

  • 数据总线:用来在各个功能部件中间传输数据,是双向传输总线
  • 地址总线 :用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地址。
  • 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。

3、指令

  • 指令 :是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和操 作码。
  • 程序 : 由一条一条的指令构成。
  • 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。
  • 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
  • RISC :精简指令系统计算机。
  • CISC :复杂指令系统计算机。
  • 程序与指令:高级语言 汇编助记符 机器指令

二、进程

  • 什么是进程?即运行起来的程序
    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
  • 什么是线程?
    线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。进程内部至少有一个线程。
  • 什么是程序?
    计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

1、PID  

PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。

PID(进程控制符)英文全称为Process Identifier,它也属于电工电子类技术术语。

PID是各进程的代号,每个进程有唯一的PID编号。它是进程运行时系统随机分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是你终止程序后再运行PID标识符就会被系统回收,就可能会被继续分配给新运行的程序。

 含义

只要运行一程序,系统会自动分配一个标识。

是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。

只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。

如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID。

是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。

和用户进行交互的命令解释器。

2、PCB

进程控制块,进程的属性信息。

在操作系统中会使用链表将PCB连接在一起,链表中有多少个节点,这个操作系统就有多少个进程,操作系统通过管理PCB来管理运行起来的 进程

              image.png

进程描述信息:

  • 进程标识符用于唯一的标识一个进程(pid,ppid)。

进程控制信息:

  • 进程当前状态
  • 进程优先级
  • 程序开始地址
  • 各种计时信息
  • 通信信息

资源信息:

  • 占用内存大小及管理用数据结构指针
  • 交换区相关信息
  • I/O设备号、缓冲、设备相关的数结构
  • 文件系统相关指针

现场保护信息(cpu进行进程切换时):

  • 寄存器
  • PC
  • 程序状态字PSW
  • 栈指针

3、进程状态

    就绪 、运行、阻塞

              image.png

  • ready:表示线程已经被创建,正在等待系统调度分配CPU使用权。
  • running:表示线程获得了CPU使用权,正在进行运算。
  • waiting:表示线程等待(或者说挂起),让出CPU资源给其他线程使用。

为什么除去new和terminated状态?

是因为这两种状态实际上并不存在于线程运行中,所以也没什么实际讨论的意义。对于Java中的线程状态无论是Timed Waiting ,Waiting还是Blocked,对应的都是操作系统线程的waiting(等待)状态。而Runnable状态,则对应了操作系统中的ready和running状态。

4、进程管理命令

(1)ps

只显示当前终端的进程。

默认显示与当前终端有关的进程信息

参数描述
-A列出所有的进程
-e等于“-A”
-a显示现行终端机下的所有进程,包括其他用户的进程;
-u以用户为主的进程状态 ;
x通常与 a 这个参数一起使用,可列出较完整信息。
-w显示加宽可以显示较多的资讯
-au显示较详细的资讯
-aux显示所有包含其他使用者的行程
-f做一个更为完整的输出。

-L

显示进程中的线程 ID

 

这个PID的取值范围从1开始到整数的最大值。这我们可以根据下面要讲的PS命令看一下

 

                                        image.png

 

ps  -a 与 -A

                       image.png

打印指定用户的信息

                           image.png

ps与grep组合法。打印指定进程信息

         image.png

显示所有进程信息,连带命令行

        image.png

 

最常用的命令:

ps -aux 和ps -le 一样

image.png

USER表示哪个用户启动了这个进程;

PID表示进程的ID;

%CPU表示cpu的占用率;占用越高,进程越消耗资源。

%MEM表示内存的使用率;占用越高,进程越消耗资源。

VSZ如果一个程序完全驻留在内存中一共需要会用多少内存;(该进程所占的虚拟内存大小,单位kb)

RSS表示进程当前实际上占用了多少内存,注意不要跟VSZ混淆,VSZ的前提是进程完全驻留在内存中;该进程所占的物理内存大小,单位kb)

TTY表示tty终端;tty1-tty7代表本地控制台终端,tty1-tty6是本地的字符结面终端,tty是图形终端。ps/0-256代表虚拟终端。

STAT表示当前进程的状态,(S表示处于休眠状态,D表示不可中断的状态,Z表示僵尸进程(正在关闭的状态),X表示死掉的进程);

START启动这个命令的时间点;

TIME 进程执行起到现在总的CPU占用时间;

COMMAND表示启动这个进程的命令。

 

ps -ef

                image.png

UID: 说明该程序被谁拥有(用户ID)

PID:就是指该程序的 ID(进程ID)

PPID: 就是指该程序父级程序的 ID(父进程号)

C: 指的是 CPU 占用率

STIME: 程序的启动时间

TTY: 指的是登录终端

TIME : 表示进程执行起到现在总的CPU占用时间

CMD: 启动这个进程的命令,它其实就是一个启动进程的命令

(2)pstree

pstree命令以树状图显示进程间的关系(display a tree of processes)。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。

以树状图形式显示进程之间的关系

          image.png

pstree -p

                 image.png

pstree [-p] <pid>

                  image.png

(3)jobs

显示当前终端的任务

         image.png

     

(4)sleep  

睡眠 n 秒。

(5)&

后台运行程序

          image.png

(6)fg bg

 fg %任务号 将后台运行的或挂起的进程挪到前台执行

       bg %任务号 将挂起的进程唤醒到后台执行

                      image.png

(7)kill

              image.png

                image.png

结束或者挂起一个进程

-9 强制结束进程

-stop 挂起进程

-1 这两个是啥意思

-15

              image.png

                image.png

(8)pkill

结束一组同名的进程

pkill [选项][信号]进程名

  -t 按照终端号提出用户。

                         image.png

(9)killAll

顾名思义杀死所有。加信号和kill通用;

killall [选项][信号]进程名

-i   交互式,询问是否要杀死某个进程。

-I     忽略进程名的大小写。

image.png

 

(10)top

查看系统资源使用情况以及进程信息                        

                    image.png

 

         image.png

前五行信息:

 

统计信息区

  • 第一行:任务队列信息,与uptime命令执行结果相同。
    • 17:25:29:系统当前时间
    • up 1:10:主机已运行时间
    • 1 users:用户连接数(不是用户数,who命令)
    • load average: 0.00, 0.00, 0.00:系统平均负载,统计最近1,5,15分钟的系统平均负载

三个值相加 /3*100% 判断结果和60%

补充:uptime -V可查询版本

  • 第二行:进程信息
    • Tasks: 287 total:进程总数
    • 1 running:正在运行的进程数
    • 146 sleeping:睡眠的进程数
    • 0 stopped:停止的进程数
    • 0 zombie:僵尸进程数
  • 第三行:CPU信息(当有多个CPU时,这些内容可能会超过两行)
    • 1.7 us:用户空间所占CPU百分比
    • 3.3sy:内核空间占用CPU百分比
    • 0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
    • 94.2 id:空闲CPU百分比
    • 0.0 wa:等待输入输出的CPU时间百分比
    • 0.0 hi:硬件CPU中断占用百分比
    • 0.0 si:软中断占用百分比

软中断是啥意思

    • 0.0 st:虚拟机占用百分比

 第四行:内存信息(与第五行的信息类似与free命令)

    • 1021564 total:物理内存总量
    • 93224    used:已使用的内存总量
    • 51540    free:空闲的内存总量(free+used=total)
    • 416800 buffers:用作内核缓存的内存量
  • 第五行:swap信息
    • 998396  total:交换分区总量
    • 996852  used:已使用的交换分区总量
    • 1544 free:空闲交换区总量
    • 351844 cached Mem:缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。

PID:进程ID,进程的唯一标识符

USER:进程所有者的实际用户名。

PR:进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。

NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级

VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR:SHR是进程使用的共享内存。共享内存大小,单位kb

S:这个是进程的状态。它有以下不同的值:

      • D - 不可中断的睡眠态。
      • R – 运行态
      • S – 睡眠态
      • T – 被跟踪或已停止
      • Z – 僵尸态

%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。

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

TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。

COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)

还有许多在默认情况下不会显示的输出,它们可以显示进程的页错误、有效组和组ID和其他更多的信息。

如果查看进程cpu的使用相关信息也可以使用pidstat -u

  • 在Debian/Ubuntu系统中可以使用下面的命令来安装:
    apt-get install sysstat
  • CentOS/Fedora/RHEL版本的linux中则使用下面的命令:
    yum install sysstat

                  image.png

详细说明

  • PID:进程ID
  • %usr:进程在用户空间占用cpu的百分比
  • %system:进程在内核空间占用cpu的百分比
  • %guest:进程在虚拟机占用cpu的百分比
  • %CPU:进程占用cpu的百分比
  • CPU:处理进程的cpu编号
  • Command:当前进程对应的命令

pidstat 的用法:

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]

常用的参数:

  • -u:默认的参数,显示各个进程的cpu使用统计
  • -r:显示各个进程的内存使用统计
  • -d:显示各个进程的IO使用情况
  • -p:指定进程号
  • -w:显示每个进程的上下文切换情况
  • -t:显示选择任务的线程的统计信息外的额外信息
  • -T { TASK | CHILD | ALL }
    这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
    注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
  • -V:版本号
  • -h:在一行上显示了所有活动,这样其他程序可以容易解析。
  • -I:在SMP环境,表示任务的CPU使用率/内核数量
  • -l:显示命令名和所有参数

 

实例:显示每个进程的上下文切换情况(-w)

(上下文切换频率高,损耗资源大)

 

image.png

  • PID:进程id
  • Cswch/s:每秒主动任务上下文切换数量
  • Nvcswch/s:每秒被动任务上下文切换数量
  • Command:命令名

5、生产环境服务器变慢,诊断思路和性能评估

记一次印象深刻的故障?

结合Linux 和 JDK命令一起分析,步骤如下

  • 使用top命令找出CPU占比最高的
  • ps -ef 或者 jps 进一步定位,得知是一个怎么样的后台程序出的问题
  • 定位到具体线程或者代码
    • ps -mp 进程 -o THREAD,tid,time
    • 参数解释
      • -m:显示所有的线程
      • -p:pid进程使用CPU的时间
      • -o:该参数后是用户自定义格式
  • image.png
  • 将需要的线程ID转换为16进制格式(英文小写格式)
    • printf “%x\n” 有问题的线程ID
  • jstack 进程ID | grep tid(16进制线程ID小写英文) -A60
  • 可以直接jstack + 进程ID
    黄色两个操作的方式是一样的

精准定位到错误的地方

  • image.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值