进程(Process)是计算机中已运行程序的实体,是程序的一个具体实现。每个 Linux 进程在被创建的时候,都被分配给一段内存空间,即系统给该进程分配一定的逻辑地址空间。
每个程序都能看到一片完整连续的地址空间,这些空间并没有直接关联到物理内存,而是操作系统提供了内存的一种抽象概念,使得每个进程都有一个连续完整的地址空间,在程序的运行过程,再完成虚拟地址到物理地址的转换。我们同样知道,进程的地址空间是分段的,存在所谓的数据段,代码段,bbs段,堆,栈等等。
每个进程都有一个唯一的进程 ID (PID),用于追踪该进程。
任何进程都可以通过复制自己地址空间的方式(fork)创建子进程,子进程中记录着父进程的 ID(PPID)。第一个系统进程是 systemd,其他所有进程都是其后代。
进程的 CPU 资源(时间片)分配就是指进程的优先级(priority);优先级高的进程有优先执行权利;配置进程的优先级对多任务环境下的 Linux 很有用,可以改善系统性能。
使用 ps 命令查看进程
openEuler 中使用 CFS 调度器来调度进程
PRI,即进程的优先级,表示程序被CPU执行的先后顺序,值越小进程的优先级别越高;NI,即 nice 值 ,表示进程可被执行的优先级的修正数值,可理解为“谦让度”;进程的 nice 值不是进程的优先级,但是可以通过调整 nice 值可以影响进程的优先值。
PRI 值越小越快被执行,那么加入nice值后,PRI变为:PRI(new)=PRI(old)+nice
当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
内核使用一些简单的数值范围0~139表示内部优先级, 数值越低, 优先级越高。从0~99的范围专供实时进程使用, nice的值[-20,19]则映射到范围100~139
openEuler 中使用 nice 和 renice 调整进程的 nice 值,进而影响进程优先级
nice 命令语法,优先序(adjustment 取值范围 -19 ~ 20):
nice [-n adjustment][command][arg...]]
例如,将 vi 运行的优先级设置为 -18:
nice -n -18 vi &
renice 命令语法,优先序范围同 nice,作用对象有程序群组 -g、进程 -p、用户-u,语法格式:
renice [-n adjustment][-]<pid>
例如,将 vi 运行的优先级设置为 10:
# renice -n 12 -p 9700
9700(process ID) old priority -18, new priority 12
查看 nice 说明:nice –help
查看 renice 说明:renice –h
也可以使用 top 更改进程的 NI 值:
进入top后按“r”–>输入进程PID–>输入nice值
后台进程几乎不和用户交互,优先级略低。Linux 的守护进程(Daemon)是一种特殊的后台进程,其独立于终端并周期性地执行任务或等待唤醒。
前台进程和用户交互,需要较高的响应速度,优先级较高。前台进程就是用户使用的有控制终端的进程。
opneEuler 中常用以下命令管理进程,包括前后台切换及启停:
使用ps或top命令查看每个进程的详细信息。
ps 命令可以显示当前进程,并列出详细的进程信息,字段含义如下表。常用 ps aux
或 ps -ef
查看进程信息。
ps 命令用于显示特定时间点的进程信息,top 命令可以实时显示进程信息。
openEuler 中,进程之间通过信号来通信,常见信号见表格。
进程的信号是预定义好的一个消息,进程能识别它并决定是忽略还是做出反应。系统管理员需要知道如何向一个进程发送何种信号,以管理进程。
openEuler 中使用 kill 和 killall 命令向进程发送信号;发送的前提是,当前用户必须是进程的属主或 root 用户;kill 通过 PID 向进程发信号,默认发送 TERM 信号,使用 –s 参数指定其他信号,例:
# kill 3389
# kill -s HUP 3389
killall 通过进程名向进程发信号,且支持通配符,例:
killall python*