首页 > 系统相关 >进程和任务

进程和任务

时间:2024-04-26 17:34:11浏览次数:24  
标签:选项 用户 命令 任务 内存 进程 CPU

进程和任务

目录

一、程序和进程的关系

1、程序

执行特定任务的一串代码,静态,存在硬盘中

2、进程

运行中的程序叫做进程,动态,存在内存中有生命周期

2.1 进程具有的特征

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是系统进行资源分配和调度的一个独立单位;
  • 结构性:进程由程序、数据和进程控制块三部分组成。

2.2 线程和进程的关系

2.2.1 线程:程序执行的最小单位
  • 线程 是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。
  • 一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
  • (一个线程挂掉会影响其他线程,而进程之间是互相隔离的,互不影响)
2.2.2 进程:资源分配的最小单位
  • 进程 是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。
  • 从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位
2.2.3 查看单线程还是多线程

image-20240417183112387

image-20240417183638574

另一个方法:

image-20240417183906300

2.3 进程使用内存的问题

  • 内存泄露:指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态

  • 内存溢出:指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出,类似红杏出墙

  • 内存不足:“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到类似下面的提示:

    *Jul 10 10:20:30 kernel: Out of memory: Kill process 9527 (java) score 88 or sacrifice child**
    

    当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,因为这个问题已经严重到不足以被应用处理)。

2.3.1 解决方法
  • 限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用

  • 给系统增加swap空间

2.4 进程状态

基本状态 描述
创建状态 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
就绪状态 进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
执行状态 进程处于就绪状态被调度后,进程进入执行状态
阻塞状态 在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态 进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

如图:

image-20240417164829698

还有几个其他的状态:

  • 运行态:running
  • 就绪态:ready
  • 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
  • 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
  • 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程
2.4.1 过滤僵尸进程

首先创建一个僵尸进程

image-20240417171155870

过滤僵尸进程

image-20240417171327220

2.5 进程分类

操作系统分类:

  • 协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用
  • 抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务

进程类型:

  • 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
  • 前台进程:跟终端相关,通过终端启动的进程

注意:两者可相互转换

二、查看进程信息

1、查看静态进程信息——ps

1.1 常用选项

命令 作用
a 显示当前终端下的所有进程信息,包括用户的进程
u 使用以用户为主的格式输出进程信息
x 显示当前用户在所有终端下的进程信息
-e 显示系统内的所有进程信息
-l 使用长格式显示进程信息
-f 使用完整的格式显示进程信息
k|--sort 对属性排序,属性前加-表示倒序 ps aux k -%cpu
o属性 选项显示定制的信息pid、cmd.....

实例:

ps -aux

image-20240417185814729

ps -ef

image-20240417185857840

ps aux k -pid

image-20240417190436095

1.2字段分析

image-20240417190650075

表头 含义
USER 该进程是由哪个用户产生的。
PID 进程的 ID。
%CPU 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。
%MEM 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。
VSZ 该进程占用虚拟内存的大小,单位为 KB。
RSS 该进程占用实际物理内存的大小,单位为 KB。
TTY 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?代表和终端无关,系统进程
STAT 进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从 2.6 内核开始无效)。
-X:死掉的进程(应该不会出现)。
-Z:僵尸进程。进程已经中止,但是还是占用硬件资源。
-<:高优先级(以下状态在 BSD 格式中出现)。
-N:低优先级。
-L:被锁入内存。
-s:包含子进程。
-l:多线程(小写 L)。
-+:位于后台。
START 该进程的启动时间。
TIME 该进程占用 CPU 的运算时间,注意不是系统时间。
COMMAND 产生此进程的命令名。

image-20240417190755768

表头 含义
F 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限;
S 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致;
UID 运行此进程的用户的 ID;
PID 进程的 ID;
PPID 父进程的 ID;
C 该进程的 CPU 使用率,单位是百分比;
PRI 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改
NI 进程的优先级,数值越小,该进程越早被执行;可以人为修改
ADDR 该进程在内存的哪个位置;
SZ 该进程占用多大内存;
WCHAN 该进程是否运行。"-"代表正在运行;
TTY 该进程由哪个终端产生;
TIME 该进程占用 CPU 的运算时间,注意不是系统时间;
CMD 产生此进程的命令名;

2、查看动态信息 ——top

2.1常用选项

命令 作用
-d秒数 指定top命令每隔几秒更新。默认是3秒
-b 使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
-n 指定 top 命令执行的次数。一般和"-"选项合用;
-p 进程PID:仅查看指定 ID 的进程;
-s 使 top 命令在安全模式中运行,避免在交互模式中出现错误;
-u 用户名:只监听某个用户的进程;

2.2交互操作选项

命令 作用
?/h 显示交互模式的帮助;
c 按照 CPU 的使用率排序,默认就是此选项;
M 按照内存的使用率排序;
N 按照 PID 排序;
T 按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
k 按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
r 按照 PID 给某个进程重设优先级(Nice)值;
q 退出 top 命令;

2.3 字段分析

image-20240417191825778

行列名称 各字段涵义
第一行任务队列信息 14 : 09 : 16(系统时间)up 5:31(系统已运行时长)2user(当前登录用户数)oad average: 0.00, 0.01, 0.05(系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值)(Load Average的值应该小于CPU个数核数0.7)
第二行为进程信息 Tasks(总进程数)running(正在运行的进程数 )sleeping(休眠的进程数) stopped(中止的进程数) zombie(僵死的进程数)
第三行为CPU信息 us(用户占用)sy(内核占用)ni(优先级调度占用)id(空闲CPU,要了解空闲的CPU百分比,主要看%id 部分)wa(I/O等待占用)hi(硬件中断占用)si(软件中断占用)st(虚拟化占用)
第四行为内存信息 total(总内存空间)free(空闲内存)used(已用内存)buff/cache(物理内存和交换内存的缓冲区总和)
第五行为交换空间信息 total(总交换空间)free(空闲交换空间)used(已用交换空间)avail Mem(可用物理空间)

3、 查看进程信息——pgrep

3.1格式

pgrep “进程名”   #默认只输出PID号,相似的命令"pidof"

3.2常用选项

选项 功能
-l 显示进程名
-U 指定特定用户
-t 指定终端

实例:

pgrep:

image-20240418135411439

pidof:

image-20240418140739885

4、 查看进程树——pstree

4.1 格式

pstree [选项] 

4.2常用选项

命令 作用
-a 显示完整信息
-u 列出对应用户名
-p 列出对应的PID号

image-20240418140308126

5、查看系统中已被打开的文件

5.1 格式

lsof[选项]

5.2 常用选项

命令 作用
-c 字符串 只列出以字符串开头的进程打开的文件。
+d 目录名 列出某个目录中所有被进程调用的文件。
-u 用户名 只列出某个用户的进程打开的文件。
-p pid 列出某个 PID 进程打开的文件。

实例:

image-20240418142620561

image-20240418142730559

image-20240418144941847

三、进程的启动方式

1、手工启动

1.1 前台启动:用户输入命令,直接执行程序

image-20240418145531269

1.2 后台启动:在命令行尾加入"&"

image-20240418145844923

四、进程的前后台调度

1、Ctrl +Z组合键

将当前进程挂起,调入后台并停止执行

2、jobs 命令

查看处于后台的任务列表

3、fg命令

将后台进程恢复到前台运行,可指定任务序号

实例:

image-20240418150526474

五、结束进程

1、Ctrl + c 组合键

中断正在执行的命令

2、kill、killall命令

kill用于终止指定pid号的进程

killall用于终止指定名称相关的所有进程

2.1格式

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

2.2 常用选项

信号编号 信号名 含义
0 EXIT 程序退出时收到该信息。
1 HUP 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2 INT 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。
3 QUIT 退出。
9 KILL 杀死进程,即强制结束进程。
11 SEGV 段错误。
15 TERM 正常结束进程,是 kill 命令的默认信号。

六、计划任务管理

1、at命令

一次性计划任务

1.1格式:

at [HH:MM] [yyyy-mm-dd]                #指定时间设置任务(不加年月日表示当天)ctrl+D退出 

atq                                    #查看未执行的任务列表 

atrm [任务序号]                        #删除第一条任务

image-20240418152438757

image-20240418152621502

2、crontab命令

周期性计划任务

2.1 格式

crontab -e [-u 用户名]         #编辑计划任务,-u缺省时表示当前用户
crontab -l [-u 用户名]         #查看计划任务
crontab -r [-u 用户名]         #删除计划任务

2.1 常用选项

选项 功能
-u user 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。
-e 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i 在删除用户的 crontab 文件时,给确认提示。

实例:

image-20240418161147000

image-20240418160752703

字段解析:

项目 含义 范围
第一个"*" 一小时当中的第几分钟(minute) 0~59
第二个"*" 一天当中的第几小时(hour) 0~23
第三个"*" 一个月当中的第几天(day) 1~31
第四个"*" 一年当中的第几个月(month) 1~12
第五个"*" 一周当中的星期几(week) 0~7(0和7都代表星期日)
特殊符号 含义
*(星号) 代表任何时间。比如第一个"*"就代表一小时种每分钟都执行一次的意思。
,(逗号) 代表不连续的时间。比如"0 8,12,16***命令"就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠) 代表连续的时间范围。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线) 代表每隔多久执行一次。比如"/10***命令",代表每隔 10 分钟就执行一次命令。

标签:选项,用户,命令,任务,内存,进程,CPU
From: https://www.cnblogs.com/shijunan2/p/18160529

相关文章

  • gdb 根据c语言二进制文件进程号查看内部多线程任务
    C语言二进制文件a编译时添加了-g(gdb调试),但是gdba这种方式有时不容易复现一些场景。这时可以先正常启动a,然后根据a的进程号启动gdb调试。#1.找到程序进程号psaux|grepa#2.使用GDB附加到该进程sudogdb-p[PID]#3.使用infothreads命令来列出......
  • 一个比 Celery 轻量好用的异步任务工具
    转载自:https://mp.weixin.qq.com/s/w579duXw7dHIBQuUhD7VfgRQ 是Python中一个基于Redis的简单的,轻量级的异步任务工具。通过 RQ,您可以将耗时的任务放入队列中异步执行,而不会阻塞主应用程序的执行。# 1、安装通过pip可以直接安装它$ pip install rq# 2、核心概念......
  • 多进程编程:原理、技术与应用
    title:多进程编程:原理、技术与应用date:2024/4/2612:14:47updated:2024/4/2612:14:47categories:后端开发tags:多进程并发编程网络服务分布式系统任务处理进程池线程对比第一章:进程与线程进程与线程的概念及区别:进程:进程是操作系统中的一个程序执行......
  • 进程线程基础知识
    进程线程基础知识pcb包含的具体信息进程描述信息(进程标识符,用户标识符)进程管理状态(进程当前的状态,进程的优先级)资源分配清单cpu信息pcb通过链表的方式来进行组织,把具有相同状态的进程链在一起组成队列。进程的上下文切换一个进程切换到另一个进程运行,称为进程的上下文切......
  • dotnet 简单方法在一个进程内同时跑起 WPF 和 ASP.NET Core 框架
    从设计架构上,无论是WPF还是ASP.NETCore框架,都是在dotnet运行时上层的应用,两个框架处于平级的结构。理论上讲,两个平级的框架只要不存在特殊的情况,都是能够相容存在的。本文将和大家介绍一个非常简单的方法,在一个进程内同时跑起WPF和ASP.NETCore框架在一个进程内同时跑......
  • PEcmd是一个命令行工具,用于执行各种操作系统和文件系统相关的任务。通常,它用于在Windo
    PECMD命令帮助-PECMD技术社区:www.pecmd.netPEcmd是一个命令行工具,用于执行各种操作系统和文件系统相关的任务。通常,它用于在Windows操作系统上执行各种文件和目录操作,例如文件复制、移动、删除等。PEcmd提供了一种简单而强大的方式来管理文件和目录,尤其是在自动化和批处......
  • docker.from_env() 获取docker守护进程时出现 TypeError: load_config() got an unexp
    某天使用python重启docker容器时,出现了一个令人费解的BUG,我的代码为1defrestart_docker(container_name):2#连接到docker守护进程3client=docker.from_env()4try:5#获取容器对象6container=client.containers.get(containe......
  • 【python】pyqt中使用多线程处理耗时任务
    在PyQt中使用多线程通常是为了避免界面冻结,特别是在执行耗时的任务时。PyQt本身是基于Qt的,而Qt不允许在除主线程之外的线程中直接操作GUI元素。因此,任何涉及GUI更新的操作都应该在主线程中执行。importsysimportthreadingfromPyQt5.QtWidgetsimportQApplic......
  • 使用dolphinscheduler调度flink实时任务
    1.在“项目管理”>>"工作流定义"里边创建工作流2.选择flink_stream3.选择安装flink服务的节点worker分组程序类型选择sql4.在“脚本”编写框输入flink-sql主代码5.选择flink版本,指定任务名称,配置资源参数最后点击确认保存6.在任务定义>>实时任务列表找到刚......
  • 2024.04.24 完成的任务
    今天在菜鸟教程学了这些内容。。。具体内容如下:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>我的联通</title><head></head></head><body><......