进程
1)进程相关概念
2)进程工具和系统性能相关工具
https://blog.youkuaiyun.com/wdirdo/article/details/100008565
3)作业管理、并发执行和计划任务
https://blog.youkuaiyun.com/wdirdo/article/details/100019036
进程
进程概念
-
进程(Process): 运行中的程序的一个副本,是被载入内存的一个指令集合
-
进程的特征:
正在运行的程序
①会消耗资源
占用的资源:比如一段独立的内存空间等
②有生命周期
进程开始至进程结束,中间有许多进程状态
③进程ID(Process ID,PID)号码被用来标记各个进程
PID在进程运行期间唯一,进程结束就被回收
④UID、GID、和SELinux语境决定对文件系统的存取和访问权限
Linux安全上下文
⑤通常从执行进程的用户来继承 -
程序:磁盘文件(/usr/sbin等下的文件)
-
守护进程:随着计算机启动而运行,随着计算机的关闭而关闭
-
task struct:Linux内核存储进程信息的数据结构格式
①系统分配
②记录进程相关属性 -
task list:多个任务的的task struct组成的链表
-
Linux进程创建:
(centos6第一个进程:init)(centos7第一个进程:systemd(1))
进程:都由其父进程创建,fork(),父子关系,CoW
centos6以前第一个进程均是init
centos7上/usr/sbin/init是system的软链接
[root@centos7 ~]# ll /usr/sbin/init
lrwxrwxrwx. 1 root root 22 Jul 17 16:54 /usr/sbin/init -> ../lib/systemd/systemd
CoW :copy on write 写时复制
意思是当子进程创建时不会立即创建内存空间,可能与其父进程指向相同的内
存空间,一旦当子进程涉及到数据的修改时,此时会立即复制父进程的内存空
间,创建一块独立的内存空间,将子进程指向此空间,只有发生变化时,才会
发生复制。----以便节约内存空间
进程、线程、协程
-
-
进程是一个独立运行占用资源的单位,进程执行最终表现位线程执行,有可能只有一个。
-
线程:真正处理数据的单位、执行单位
-
线程和进程是由操作系统进行调度的,由操作系统进行分配的。进程和线程的管理等资源分配都是有操作系统完成的
-
协程:针对某种开发语言来说例如:Python,协程可以理解为一个线程里独立执行的语句块。协程调度使用有程序员分配、协程的执行顺序由程序员完成
复杂的任务一般会涉及线程
一个进程中开启的多个线程:{}
├─polkitd(6195)─┬─{polkitd}(6223)
│ ├─{polkitd}(6251)
│ ├─{polkitd}(6252)
│ ├─{polkitd}(6261)
│ ├─{polkitd}(6278)
│ └─{polkitd}(6296)
这种进程就不涉及线程
─sshd(6635)───sshd(11534)───bash(11540)───pstree(12376)
进程的相关概念
-
查看线程:cat /proc/PID/status |grep -i threads
-
1)Page Frame: 页框,用存储页面数据,存储Page 4k
在Linux中进程要运行必不可少的需要分配内存空间,内存空间的分配是通过以页为单位进行分配的,(例如磁盘的读取是以block为单位,此处的页则是分配内存空间的单位) Page 大小固定4K -
2)物理地址空间和线性地址空间
进程在运行时有一个特性:每个进程在运行时都以为自己拥有整个内存空间
在Linux中,进程拥有的地址空间被称为虚拟内存或者线性内存,
虚拟内存与物理内存空间存在映射–>MMU。 -
3)MMU:Memory Management Unit 负责转换线性和物理地址。MMU属于CPU固件,硬件
-
4)TLB:Translation Lookaside Buffer 翻译后备缓冲器
用于保存虚拟地址和物理地址映射关系的缓存
TLB放置于CPU中
-
综上 1)2) 3) 4):用户和内核空间
假设4G内存空间:3G属于用户空间+1G属于内核空间
进程的线性空间:可以分成5个部分
①代码段:程序运行的二进制程序
②数据段:进程运行过程中可能用到的一些变量,这些变量已经被初始化的
③BSS(以符合开始的块):存放没有初始化的变量
④堆:存放系统中需要使用的内存一部分空间,这部分空间可以动态变化
⑤栈:跟堆的区别,栈可以存放一些函数中使用的变量,栈的特点:先进后出 -
LRU:Least Recently Used 近期最少使用算法,释放内存
LRU算法:近期最少使用算法,考察最近2分钟,某个资源的访问最少,使用频率最少,就淘汰,节省空间。
IPC进程间通信的基本概念
- IPC: Inter Process Communication
同一主机:
pipe 管道 ---- 单工
socket 套接字文件 ---- 双工
signal 信号
shm shared memory
semaphore 信号量,一种计数器
不同主机:
socket IP和端口号
RPC :remote procedure call
MQ 消息队列,如:Kafka,RabbitMQ,ActiveMQ
进程优先级
-
进程有优先级之分,Linux系统进程优先级分为实时优先级和非实时优先级
①实时优先级的进程称为实时进程(realtime:实时进程)对应系统优先级0-99
②系统大部分进程都是非实时进程:对应系统优先级100-139
③相同优先级的进程执行的两种执行机制:FIFO(先执行正在执行的进程) RR(轮询)
注意: 不同命令和系统优先级的对应关系 -
进程优先级:
系统优先级:数字越小,优先级越高
0-139:各有140个运行队列和过期队列
实时优先级: 99-0 值最大优先级最高
nice值:-20到19,对应系统优先级100-139
nice优先级是按时间片次序分配资源的,时间片一到比较优先级,运行下一进程,涉及比较的问题(怎么排序?)
排序解决:准备0-139个比较队列,比较的逻辑如下图:
这样比较的优势:不管进程有多少个,比较所花费的时间是一样的 -
Big O:时间复杂度,用时和规模的关系
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
进程的基本状态和转换
-
-
创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
-
就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
-
执行状态:进程处于就绪状态被调度后,进程进入执行状态
-
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
-
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
状态之间转换六种情况
- 运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占
用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态 - 就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
- 运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
- 阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
- 注意: 进程状态的切换是由一定的前提条件的,以下两种状态是不可能发生的:
- 阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
- 就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态
进程状态
-
Linux内核:抢占式多任务
按照时间片分配资源的,时间一到,内核将CPU抢占过来,分配给下一进程使用。不会导致某一个程序崩溃,导致系统崩溃。
-
进程类型:
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
前台进程:跟终端相关,通过终端启动的进程,依赖终端
注意: 两者可相互转化 -
进程状态:
运行态:running
就绪态:ready
睡眠态:大多数程序处于可中断的睡眠态
可中断:interruptable
不可中断:uninterruptable
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
僵尸态进程还占据着一定的资空间,一般处于僵尸的程序只能重启计算机才能释放资源,处于异常状态
系统管理工具
-
进程的分类:
CPU-Bound:CPU密集型,非交互
IO-Bound:IO密集型,交互
-
Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup
-
pstree命令:
pstree display a tree of processes -
ps: process state
ps report a snapshot of the current processes
Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中