Linux进程管理和任务计划
一.进程相关概念介绍
1.操作系统内核的作用
1.1操作系统
- 操作系统一般具有下面两种意思:
- 表示包括管理计算机资源的核心软件和附带的标准软件工具,附带的标准软件如:命令行解释器、
GUI用户图形界面、文件工具及文编辑器等等。 - 更加狭义的维度上,只表示管理和分配计算机资源的核心软件。(管理计算机资源如:CPU管理、
RAM内存管理和设备管理等)
- 表示包括管理计算机资源的核心软件和附带的标准软件工具,附带的标准软件如:命令行解释器、
- 大多数人所说的操作系统一词一般指第一种意思,包括了附带的标准软件。
1.2内核
- 内核一般被认为是只表示管理和分配计算机资源的核心软件。是操作系统的核心部分。
- 内核主要负责以下工作
内核功能 | 解释 |
---|---|
进程调度 | 现在的计算机一般会有多个物理核心用来执行程序的指令。Linux系统是一个抢占式多任务(preemptive multitasking)的操作系统,多任务就意味着多个进程可以同时驻留在内存中得到CPU的处理,抢占式就意味着是哪个进程使用CPU或者使用多久的规则由内核进程调度器决定而不是CPU自己决定处理哪个进程 |
内存管理 | 目前内存已近越来越大,但是软件体积也同样在增长;计算机的物理内存仍然是比较稀缺的资源,这就需要内核合理的管理分配内存给系统的各个进程 |
提供文件系统功能 | 内核能够在磁盘上创建特定文件系统,以允许文件被创建,复制更新和删除等 |
创建和销毁进程 | 内核可以加载某个程序到内存,并为其分配其运行所需要的资源(CPU、内存、对文件的访问等),在内存中运行的某个程序的实例就叫做进程。当程序被内核销毁或者自己运行结束后,内核还需要保证其使用的资源被释放以便于后续进程重用 |
访问设备 | 连接到计算机上的设备(如:麦克风、显示器、键盘鼠标、磁盘和磁带、软盘等)是的计算机内部和计算机之间及计算机和外部世界可以进行信息交互,允许计算机进行输入、输出等操作。内核为每个上层应用程序提供了一个标准的接口来访问设备,同时仲裁多个进程对设备的访问 |
提供网络功能 | 内核代替用户进程收发网络数据。 |
提供系统调用应用程序编程接口 | 进程可以通过一个入口请求内核完成多种操作,该入口就是系统调用 |
提供虚拟个人电脑抽象功能 | 在linux系统,多个用户可以同时登陆系统并进行不同的操作,内核提供了一个抽象层来保证各个用户的操作和对设备的使用的隔离性 |
2.程序?进程?线程?
程序 | 一般程序以两种形式存在:源代码的形式和二进制可执行程序的形式。源代码是人类可以读的文本(包括一系列的使用列如C语言编写的语句)。程序要被CPU执行,必须编译链接为计算机可以识别的二进制机器码指令(windows内的.exe文件;linux下的.o文件等);二者被认为是同义词,都代表程序。 | |
进程 | 简单的说,一个进程就是一个正在执行的程序的实例。当一个程序被执行时,内核会将该程序的指令加载进内存,分配内存空间给程序变量并设置相应的数据结构来记录该进程的信息(Linux内核对该种数据结构的实现叫task list,保存有进程ID、退出状态、用户ID和组ID等)。因此,进程也可以描述为:运行的程序及其包括的数据和操作。 | |
线程 | 在现代的UNIX实现版中,每个进程可以有多个线程运行。一个理解线程比较好的表述是:共享同一块内存空间和其他属性的轻量级进程的集合。每个线程都执行同一个代码块并共享相同的数据区域和堆。然而,每个线程都有自己的栈空间(包含本地变量和函数调用连接信息)。线程之间可以通过其共享的全局变量进行通讯,进程亦可以通过IPC和同步机制进行通讯。 |
- 进程图示
3.Linux中的进程
-
task struct:Linux内核存储进程信息的数据结构格式
-
task list:多个任务的的task struct组成的链表
-
Linux进程的创建
- init:第一个进程为系统启动时创建的最重要的进程,其进程ID为1
- 除了init的其他进程:都由其父进程创建,使用fork()系统调用创建。
-
查看线程:cat /proc/PID/status |grep -i threads
-
Page Frame: 页框,用存储页面数据,存储Page 4k
-
物理地址空间和线性地址空间
-
MMU:Memory Management Unit 负责转换线性和物理地址的硬件
-
TLB:Translation Lookaside Buffer 翻译后备缓冲器
用于保存虚拟地址和物理地址映射关系的缓存,便于快速访问物理页
3.用户模式和内核模式概念
-
现代处理器架构一般都允许CPU在至少两个不同模式运行:用户模式(user mode)和内核模式
(kernel mode:内核模式有时候也被称为监管模式),CPU自带的硬件指令允许在两个模式之间切换。
相应地,虚拟内存的某部分可被标记为用户空间(user space)或内核空间(kernel space)。当在
用户模式运行某进程时CPU只可以访问标记为用户控件的内存区域,尝试访问被标记为内核空间的内存
将会导致一个硬件异常(hardware exception)错误。 -
用户空间和内核空间
- 用户模式和内核模式简单对比
用户模式 | 内核模式 |
---|---|
不能执行关机指令 | 执行关机指令来关闭当前系统 |
不可以访问内存管理硬件 | 可以访问用于内存管理的硬件 |
不能 | 初始化设备I/O操作 |
不能 | 执行大多数特权指令 |
4.进程的状态及状态之间的转换
- 在进程的整个生命周期中可能会经过一下状态:创建、运行、阻塞、就绪、终止。
- 图示如下:
- 各状态说明
创建状态 | 进程在创建时需要申请一个空白PCB(process control block进程控 制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完 成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态 |
就绪状态 | 进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行 |
执行状态 | 进程处于就绪状态被调度后,进程进入执行状态 |
阻塞状态 | 正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行进程受到阻塞。在满足请求时进入就绪状态等待系统调用 |
终止状态 | 进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行 |
- 状态之间转换的四种情况
运行to就绪 | 1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态 |
就绪to运行 | 运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU |
运行to阻塞 | 正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求 |
阻塞to就绪 | 进程所等待的事件已经发生,就进入就绪队列 |
5.Linux的进程状态
-
linux进程类型:
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化 -
linux进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断睡眠态:interruptable
不可中断睡眠态:uninterruptable
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
6.Linux的进程优先级
- centos进程优先级
- 系统优先级:数字越小,优先级越高
- 0-139:每个优先级有140个运行队列和过期队列
- 实时优先级: 99-0 值最大优先级最高
- nice值:-20到19,对应系统优先级100-139
6.进程间通信IPC
- IPC进程间通信(Inter Process Communication)
- 同一主机:pipe
管道
socket 套接字文件
signal 信号
shm
shared memory
semaphore
信号量,一种计数器
- 不同主机:socket IP和端口号
RPC
remote procedure call
MQ
消息队列,如:Kafka,RabbitMQ,ActiveMQ
二.Linux下进程相关的工具介绍
1.pstree命令
-
patree命令以树状结构显示当前系统进程
-
用法
SYNOPSIS
pstree [-a, --arguments] [-c, --compact] [-h, --highlight-all, -Hpid, --high‐
light-pid pid] [-g] --show-pgids] [-l, --long] [-n, --numeric-sort]
[-N, --ns-sortns [-p, --show-pids] [-s, --show-parents] [-S, --ns-changes]
[-t, --thread-names] [-T, --hide-threads] [-u, --uid-changes] [-Z, --security-con‐
text] [-A, --ascii, -G, --vt100, -U, --unicode] [pid, user]
pstree -V, --version
-p 显示每个进程的进程ID
-a 显示进程关联的命令及其所附带的运行参数,如例1
-A 使用ASCII码值画出树干,显示内容不变
-c 禁用相同的子进程折叠,pstree显示时默认折叠子进程
-h 高亮显示当前进程和其父进程,如果终端不支持高亮则不作任何操作,如例2
-H 高亮所指定的进程号所代表的进程,如果使用该选项而未指定pid,则pstree执行失败,如例3
-g 显示进程组ID号(PGID),如果PID也指定,那就先显示进程PID,格式(PID,PGID)
-l 使用长格式
-n 将同一个父进程的子进程按照进程ID大小从小到大排序显示
-s 显示所指定的进程的父进程,如例4
-t 如果可行就显示每个进程的线程全名,pstree默认将线程放在[{
...}]内。
-T 只显示进程,忽略线程
- 例1
[root@centos8 ~]#pstree -a
systemd --switched-root --system --deserialize 17
├─ModemManager
│ └─2*[{
ModemManager}]
├─NetworkManager --no-daemon
│ └─2*[{
NetworkManager}]
├─VGAuthService -s
├─abrt-dbus -t133
│ └─2*[{
abrt-dbus}]
├─abrt-dump-journ -fxtD
├─abrt-dump-journ -fxtD
├─abrtd -d -s
│ └─2*[{
abrtd}]
├─accounts-daemon
│ └─2*[{
accounts-daemon}]
├─alsactl -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf--initfile=/lib/als
├─atd -f
...
[root@centos8 ~]#pstree
systemd─┬─ModemManager───2*[{
ModemManager}]
├─NetworkManager───2*[{
NetworkManager}]
├─VGAuthService
├─abrt-dbus───2*[{
abrt-dbus}]
├─2*[abrt-dump-journ]
├─abrtd───2*[{
abrtd}]
├─accounts-daemon───2*[{
accounts-daemon}]
├─alsactl
├─atd
├─auditd─┬─sedispatch
│ └─2*[{
auditd}]
- 例2
[root@ce