linux进程与线程

本文详细介绍了Linux进程的基础,包括进程的生命周期、父进程和子进程、僵尸进程等概念。同时,列举了多种进程管理工具如pstree、ps、pgrep、kill等的使用方法,以及如何查看和调整进程的优先级。此外,还提到了Linux的作业控制和系统结构,包括/proc和/sys文件夹在监控和管理系统中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Linux进程基础:

Linux程序:系统,用户,固件
          程序运行,需要系统调用,然后缓存到内存中,然后被CPU处理。整个过程称为执行任务

程序
​        一组指令以及参数集合,按照相应的逻辑控制计算机完成特定的任务。(文件,由一组指定参数集合起来的,完成相应任务。)特点:静态的、封闭的。

        程序运行产生多个进程。

进程
       运行的程序,是一个动态的过程。是操作系统的基本单位,有生命周期,有状态的。具有并发性(一个程序对应多个进程),交互性(一个进程可派生多个子进程)。

         操作系统以进程为单位分配系统资源。

         每一个进程运行是独立的

         具有独立的地址空间,运行状态

         多个程序同时运行,每一个程序就是一个进程

线程
​         一个进程中可有多个线程,每一个线程只能被一个进程所拥有。(线程把整个任务完成之后,才能运行,即任务每一个线程可以被不同的进程运行,但运行结果需要整合到一起才能被使用)

         线程不能独立运行,线程的运行由进程决定。

         程序运行起来可以对他进行交互操作。(每一个Linux线程或者Linux进程都有一个独立的资源集,资源集中有:CPU资源、内存资源、I/O资源等),入口、序列、出口。

1、进程的生命周期:

         等待状态------就绪状态-------运行状态--------阻塞状态------休眠状态-------死亡状态

         sleeping:睡眠状态

         stopping:停止状态

         running:运行状态

         zombie:僵死状态

​ 这些状态是实时变化的

[root@localhost ~]# ping 192.168.239.200 > /dev/null 2>&1 &
[1] 8256
[root@localhost ~]# ls

//将ping的结果输出重定向到/dev/null 中,并将其扔至后台,还可以继续执行命令
2、父进程和子进程:

     父进程在运行过程中,产生子进程。子进程继承父进程所有资源和权限,并运行自己的程序(通过调用 exec 方法运行)。子进程运行过程中父进程处于休眠状态,只有子进程运行结束,父进程才再次运行。

     父进程可以产生多个子进程,当一个子进程完成后父进程进入执行状态,然后再进入休眠状态(只要有一个子进程完成任务,父进程就会苏醒一次)。父进程产生的子进程还可以产生自己的子进程。

3、僵尸进程:

     一个父进程产生了一个子进程,子进程A又产生了自己的子进程B,当子进程A运行结束后,父进程从休眠状态进入执行状态,此时子进程A产生的子进程B将会处于僵尸状态,被系统定期清理掉。

【扩充】
1.操作系统:自下而上结构
         硬件,内核(内核文件,内核模块,驱动程序),固件(芯片+程序),应用(应用程序)

应用(应用程序)
|
内核(内核文件,内核模块,驱动程序)
| 固件(芯片+程序)
硬件

二、Linux进程管理工具:

pstree:进程树,查看进程间的关系------>父进程、子进程

​ -p:显示进程号,PID

​ -u:显示用户

​ -A:各进程树之间的连接以ASCII码字符来连接

​ -U:各进程树之间的连接以 utf8 字符来连接,某些终端可能会有错误

注:子进程的端口号大于父进程的端口号。

[root@localhost ~]# yum install psmisc
	//CentOS7上没有pstree命令
[root@localhost ~]# pstree
init─┬─atd
     ├─auditd───{auditd}
     ├─console-kit-dae───63*[{console-kit-da}]
     ├─crond
     ├─dbus-daemon───{dbus-daemon}
     ├─login───bash
     ├─master─┬─pickup
     │        └─qmgr
     ├─5*[mingetty]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─sshd─┬─sshd───bash───pstree
     │      └─sshd───sftp-server
     └─udevd
ps:查看进程

​ -a:显示所有进程

​ -A:显示所有进程,与 -e 效果相同

​ -u:显示以用户为主的进程

​ -x:和 -au 一起使用,显示完整信息

​ -l:显示更完整信息

[root@localhost ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME   CMD
4 S     0   7221   7211  0  80   0 - 28860 do_wai pts/0    00:00:00   bash

F:标志类型;代表这个程序的旗标(flag),4代表使用者为superuser;
S:进程状态
UID:代表执行者身份
PID:进程的ID号
PPID:父进程的ID
C:CPU使用的资源百分比
PRI:指进程的执行优先权,其值越小越早被执行
NI:这个进程的nice值,其表示进程可被执行的优先级的修正数值
ADDR:地址内核函数,指出该程序在内存的那个部分。如果是个执行的程序,一般就是[-]
SZ:使用掉的内存大小
WCHAN:目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY:登入者的经端机位置
TIME:使用掉的CPU时间
CMD:所下达的指令名称
[root@localhost ~]# ps -aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME   COMMAND
root          1  0.3  0.6 127996  6540 ?        Ss   23:10   0:03   /usr/lib/syste

USER:该进程属于哪个使用者账号
PID:该进程的进程ID号。
%CPU:该进程使用掉的CPU资源百分比
%MEM:该进程所占用的物理内存百分比
VSZ:该进程使用掉的虚拟内存量(kbytes)
RSS:该进程占用的固定的内存量(Kbytes)
TTY:该进程是在那个终端机上面运作,若与终端机无关,则显示?。另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连按进主机的程序,
STAT:该程序目前的状态,主要的状态有:
		R:该程序目前正在运作,或者是可被运作;
		S:该程序目前正在睡眠当中,但可被某些讯号唤醒
		T:该程序目前正在侦测或者是停止了
		Z:该进程应该已经终止,但是其父进程却无法正常的终止他,造成僵尸程序的状态
START:该进程被触发启动的时间
TIME:该进程实际使用CPU运作的时间
COMMAND:该程序的实际指令
pgrep:查看正在调度的进程信息,包括进程是否已经消亡

    pgrep通过匹配其程序名,找到匹配的进程;通常与kill命令一起使用。

​ -l 进程名:显示进程名和PID

​ -o:匹配多个进程时,显示进程号最小的那个

​ -n:匹配多个进程时,显示进程号最大的那个

​ 注:进程号越大,并不意味着进程的启动时间越晚

[root@localhost ~]# pgrep ssh
6988
7271
7275
//默认只显示PID

[root@localhost ~]# pgrep  -l httpd
7521 httpd
7522 httpd
7523 httpd
7524 httpd
7525 httpd
7526 httpd
//显示所有父、子进程的PID和进程名称

[root@localhost ~]# pgrep  -o httpd
7521
//显示httpd进程号最小的那个

[root@localhost ~]# pgrep  -n httpd
7526
//显示httpd进程号最大的那个(父进程)
kill killall pkill:杀死进程

    格式:kill 选项 PID

​ -l:列出已知信号名称

​ -a:当处理当前进程时,不限制命令名和进程号的对应关系

​ -u:指定用户

​ -w:等待进程死亡

[root@localhost ~]# kill -l
 1) HUP  	//终端断线
 2) INT 		//中断(同Ctrl+C)
 3) QUIT		//退出(同Ctrl+\) 
 9) KILL 	//强制终止
 15) TERM	//终止
 18) CONT	//继续  
 19) STOP	//暂停(同Ctrl+z) 

​ -9:直接强制杀死进程

​ -0:只看进程状态,不杀死进程

[root@localhost ~]# killall -0 httpd
[root@localhost ~]# echo $?
0
	//-0:只看进程状态,不杀死进程;用来判断进程是否启动
htop:用来监控软件

     默认支持图形界面的鼠标操作;

     可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行;

     杀进程时不需要输入进程号。

要使用htop,需要先安装epel 包:
[root@localhost yum.repos.d]# mv yum.repo bak
[root@localhost yum.repos.d]# ls
bak  CentOS-Base.repo
[root@localhost yum.repos.d]# yum clean all
[root@localhost yum.repos.d]# mount /dev/sr0 /media
[root@localhost yum.repos.d]# yum list |grep epel
epel-release.noarch                         7-11                       extras
[root@localhost yum.repos.d]# yum install epel-release -y
[root@localhost yum.repos.d]# yum install htop -y
vmstat:按照时间间隔显示服务器状态。

​ -V:显示 vmstat 版本信息

​ -n:只在开始时显示一次各字段名称

​ -a:显示活跃和非活跃内存

[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0   3848  72240     36 266396    0    0    40    27   43   62  1  1 99  0  0
 
procs:显示进程数
		r:等待执行的任务数
		b:等待的进程数

memory:(以 KB 为单位)
		swpd:虚拟内存或交换内存的数量
		free:可用物理内存的数量
		buff:用作缓冲区的内存数量
		cache:用作缓存的物理内存数量

swap:显示交换分区的活动(以 KB 为单位)
		si:将内存从磁盘交换回物理 RAM 的速率(当si数字显示不为零,说明内存不足,启用swap分区了。)
		so:将内存从物理 RAM 交换到磁盘的速率

io:显示输入输出活动(以块/秒为单位)
		bi:系统向块设备发送数据的速率
		bo     系统从块设备中读取数据的速率

system:显示系统相关活动
		in:每秒钟中断的进程数
		cs:每秒钟上下文切换的次数
		
CPU:显示CPU负载的信息
		us:用户进程执行程序消耗的时间
		id:空闲时间(包括等待时间)
		wa:等待io时间
		st:系统等待时间

三、程序优先级:0 - 139

1、优先级划分:

【0-139】:数字越小,优先级越高

         有效的实时优先级:0 - 99

         非有效实时优先级:【100 - 139】;

                     静态优先级(nice值:(-20)- 19 ; nice值越小,优先级越高,默认是0,0表示不做任何调整。它是对100-139段进行调整)

2、相对优先级 nice 值调整:
top:进程优先级查看和调整nice值

​ PR = 静态优先级 - 100(rt是负的静态优先级)

​ NI:是 nice 值,(-20) - 19

​ PRI:静态优先级 - 40

调整优先级:输入 字母 r-------Enter键-----输入pid号-----输入要改为多少(范围是nice的范围,超出按nice的最大和最小值计算)

[root@localhost ~]# ps axo pid,command,nice --sort=-nice
   PID COMMAND                      NI
    31 [ksmd]                        5
     1 /usr/lib/systemd/systemd --   0
//使用ps查看nice级别

[root@localhost ~]# ps -el
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 48393 ep_pol ?        00:00:05 systemd
renice:修改子进程(PPID)的nice值
[root@localhost ~]# renice 10 7708
7708 (process ID) old priority 0, new priority 10
htop:

     F7(nice-);F8(nice+)

四、Linux作业控制

1、进程与作业的区别:
     区别:进程时一个程序在一个数据集上的一次执行,而作业是用户提供给系统的一个任务。
     联系:一个作业通常包括几个进程,几个进程共同完成一个任务,即作业。

2、作业:
     一个前台只能运行一个进程组或一个作业,而一个后台可以运行多个进程组或者多个作业。

3、作业控制
     一个前台作业由多个进程完成,一个后台作业由多个进程完成。shell一次可以同时运行多个作业,包括前台作业和后台作业,这称为作业控制。

4、命令

egrep ===== grep -E

[root@localhost ~]# ps -ef |grep -E "ping|sleep"

&:将输出结果放到后台
jobs:查看后台作业;与终端有关系,不同终端上的作业要在对应终端上查看 。

[root@localhost ~]# jobs
[2]+  Running                 ping www.baidu.com > /dev/null 2>&1 &

fg %job编号:将作业从后端提到前端

​ (Ctrl+c:将进程杀死)

[root@localhost ~]# fg &2
ping www.baidu.com > /dev/null 2>&1
//百分号%可以不写

bg %job编号:当一个作业处于挂起状态,用 bg 命令可以让作业再次运行起来

​ (Ctrl+z:让进程处于挂起状态)

[root@localhost ~]# ping 192.168.239.200 >/dev/null 2>&1
^Z
[6]+  Stopped                 ping 192.168.239.200 > /dev/null 2>&1
(Ctr+z:让进程6挂起)

[root@localhost ~]# jobs
[3]   Running                 ping www.baidu.com > /dev/null 2>&1 &
[6]+  Stopped                 ping 192.168.239.200 > /dev/null 2>&1
(查看其是挂起状态:stopping)

[root@localhost ~]# bg 6
[6]+ ping 192.168.239.200 > /dev/null 2>&1 &

[root@localhost ~]# jobs
[3]   Running                 ping www.baidu.com > /dev/null 2>&1 &
[6]+  Running                 ping 192.168.239.200 > /dev/null 2>&1 &

kill %job编号:让进程先停止后杀死

ping 192.168.239.200 &:已经在后台运行,在前台输出结果;不影响前台作业执行(可以执行jobs和kill)。

[root@localhost ~]# kill %4

[root@localhost ~]# jobs
[3]   Running                 ping www.baidu.com > /dev/null 2>&1 &
[4]   Terminated              ping 192.168.239.200 > /dev/null 2>&1
[5]-  Running                 ping 192.168.239.200 > /dev/null 2>&1 &
[6]+  Running                 ping 192.168.239.200 > /dev/null 2>&1 &
(进程挂起)

[root@localhost ~]# kill %4
-bash: kill: %4: no such job
(进程被删除)

五、Linux系统结构

1、在x86平台的CPU是如何执行内核程序和用户程序?

​ ring从里到外依次为:ring0,ring1,ring2,ring3;从里到外越来越低级
         ring0:与硬件相关或与硬件寄存器,总线控制相关的程序----------(内核程序)

         ring1 - ring2:驱动程序或者与虚拟化相关的程序。

         ring3:用户态的程序

2、系统结构:(从里到外)

计算机底层资源(CPU、内存、硬盘)----负载、使用率
|
内核
|
命令解释器 shell
|
用户控件

3、/proc文件夹:正在运行的内核信息映射

       proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

       /proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)。

       /proc下数字命令的目录就是对于PID的进程目录。

(1)PID是不是文件? 是,/proc中

(2)资源使用情况是否以文件形式存放? 是,/proc中

(3)分区情况是否存放在文件中? 是,/proc中

(4)驱动程序的一切信息? 是,/sys中

[root@localhost proc]# cat meminfo
//内存信息,与 free -m 效果一样

[root@localhost proc]# cat cpuinfo
//CPU信息

[root@localhost proc]# cat mounts
//磁盘挂载信息

[root@localhost proc]# cat swaps
//查看磁盘分区信息

[root@localhost proc]# cd /proc/sys
[root@localhost sys]# ls
//与系统相关的

[root@localhost sys]# cd kernel/
//与内核相关

[root@localhost proc]# cd /sys
//内核驱动相关

[root@localhost sys]# cd power/
//电源相关

[root@localhost sys]# cd module/
//模块

[root@localhost sys]# cd kernel/
//内核中可调整的参数

[root@localhost sys]# cd hypervisor/
//虚拟化相关的模块

[root@localhost sys]#  cd fs
//系统模块

[root@localhost sys]# cd firmware/
//对固件对象
4、/sys文件夹:硬件设备的驱动程序信息
[root@localhost sys]# cd devices/
// 是/sys文件系统最重要的目录结构

[root@localhost sys]# cd dev
//含有字符设备和块设备两个子目录,里面全是以主次设备号命名的链接文件

[root@localhost sys]# cd class/
//按功能设备分类

[root@localhost sys]# cd bus/
//按照总线类型分类设备
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值