进程是加载到内存中的指令集,进程有进程 ID 加以标示
程序与进程
1)进程的定义
进程”是操作系统的最基本、最重要的概念之一。但迄今为止对这一概念还没有一个确切的统一的描述。下面给出几种对进程的定义描述。进程是程序的一次执行。进程是可以并行执行的计算。进程是一个程序与其使用的数据在处理机上顺序执行时发生的活动。进程是程序在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。
2)进程的特征
动态性:是程序的一次执行;并发性:进程是可以并发执行;独立性:是系统进行资源分配和调度的一个独立单位;异步性:进程间的相互制约,使进程执行具有间隙;结构性:进程是具有结构的。
3)进程与程序的主要区别:
(1)程序是永存的;进程是暂时的,是程序在数据集上的一次执行,有创建有撤销,存在是暂时的;
(2)程序是静态的观念,进程是动态的观念;
(3)进程具有并发性,而程序没有;
(4)进程是竞争计算机资源的基本单位,程序不是。
(5)进程和程序不是一一对应的: 一个程序可对应多个进程即多个进程可执行同一程序; 一个进程可以执行一个或几个程序
进程和线程
1)定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
2)关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
3)区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
(1)简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
(2)线程的划分尺度小于进程,使得多线程程序的并发性高。
(3)另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
(4)线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
(5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4)优缺点
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
进程状态
R运行中的进程
S睡眠 网络类的守护进程,可自动睡眠
T挂起(暂停)
D不可中断进程,一般是 I/O 申请失败的进程
Z僵尸进程 停止执行的进程,未被从进程列表中清楚
N低优先级进程
L某些页被缩进内存(网络时钟服务)
S父进程
Ss睡眠中的父进程
l多线程
+后台进程
进程管理工具
1 ps 查看当前终端的活跃进程
[root@localhost ~]#ps aux (a 显示所有进程 u 显示进程拥有者信息 x 显示守护进程)
user 进程的拥有者
pid进程号
· USER 运行此进程的用户名
· PID 该 process 的号码。
· %CPU 该 process 使用掉的 CPU 资源百分比;
· %MEM 该 process 所占用的物理内存百分比;
· VSZ 该 process 使用掉的虚拟内存量 (Kbytes)
· RSS 该 process 占用的固定的内存量 (Kbytes)
· TTY 该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外,tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
· STAT 该程序目前的状态,Linux 进程有 5 种基本状态:
R (正在运行或在运行队列中等待) ;
S 该程序目前正在睡眠当中 ,但可被某些讯号 (signal) 唤醒。
T 该程序目前暂停了
【例】 vim a.txt 按下: ctrl+z
ctrl-c是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。
Z 该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程
序的状态
D 不可中断状态.
< 高优先级的
N 低优先级的
s 包含子进程
l 多线程
+ 前台程序
·START 该 process 被触发启动的时间;
· TIME 该 process 实际使用 CPU 运作的时间。
· COMMAND 该程序的实际指令
pstree 打印进程的家谱
[root@localhost ~]# pstree -p |more
init(1)-+-abrt-dump-oops(2149)
|-abrtd(2141)
|-acpid(1857)
|-anacron(4142)
|-atd(2206)
|-auditd(2440)---{auditd}(2441)
|-automount(1932)-+-{automount}(1933)
|
|-{automount}(1934)
显示目录树形结构
[root@localhost ~]#tree出错,因为系统未安装tree,我们安装一下
[root@localhost ~]# mount /Dev/cdrom /mnt
[root@localhost ~]#rpm -ivh /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm
[root@localhost ~]#tree /boot/
/boot/
├── config-3.10.0-514.el7.x86_64
├── efi
│ └── EFI
│ ├── BOOT
│ │ ├── BOOTX64.EFI
│ │ └── fallback.efi
│ └── centos
│ ├── BOOT.CSV
│ ├── fonts
│ │ └── unicode.pf2
│ ├── gcdx64.efi
│ ├── grub.cfg
│ ├── grubenv
│ ├── grubx64.efi
│ ├── MokManager.efi
│ ├── shim-centos.efi
│ └── shim.efi
├── grub
│ └── splash.xpm.gz
├── grub2
│ ├── grubenv -> /boot/efi/EFI/centos/grubenv
│ └── themes
│ └── system
├── initramfs-0-rescue-d5c175b4421d4188ac7c786631009476.img
├──initramfs-3.10.0-514.el7.x86_64.img
├──initramfs-3.10.0-514.el7.x86_64kdump.img
├──initrd-plymouth.img
├──symvers-3.10.0-514.el7.x86_64.gz
├──System.map-3.10.0-514.el7.x86_64
├──vmlinuz-0-rescue-d5c175b4421d4188ac7c786631009476
└──vmlinuz-3.10.0-514.el7.x86_64
9 directories, 22 files
pgrep 按预定义模式查找
[root@localhost ~]# pgrep -U root 搜索全部属于 root 用户的进程,只打印进程号 PID
[root@localhost ~]# pgrep sshd 搜索 sshd 进程
pidof 按确切的进程名查找
pidof vim 查看 yes 的 pid
kill -9 `pidof vim`直接杀死 yes 进程
扩展:yes 命令:无限打印指定内容
yes kklkl
top 动态查看进程
作用:统计信息区前五行是系统整体的统计信息。
动态进程图
1.第一行是任务队列信息
同 uptime 命令的执行结果:
[root@localhost ~]# uptime
13:22:30 up 8 min, 4 users, load average: 0.14, 0.38, 0.25
对上面的动态进程图解释一下,如下
14:16:02 当前时间
up 57 min 系统运行时间,格式为时:分
5 users 当前登录用户数
load average: 0.00, 0.01, 0.05 系统负载,即任务队列的平均长度。 三个数值分别为1 分钟、5 分钟、15 分钟前到现在的平均值
一般来说,每个 CPU 内核当前活动进程数不大于 3,则系统运行表现良好!当然这里说的是每个 cpu 内核,也就是如果你的主机是四核 cpu 的话,那么只要 uptime 最后输出的一串字符数值小于 4*3=12 即表示系统负载不是很严重.
2.第二、三行为进程和 CPU 的信息
Tasks: 154 total 进程总数
1 running 正在运行的进程数
153 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s):0.0% us系统用户进程使用 CPU 百分比。 不包括调高优先级的进程。 CPU%是由每个用律之和算出来 的。如果你是 4 核 CPU,核 1,CPU 使用率为 100%,核 2,CPU 使用率为 100%。 则会出会 CPU 高于 100%的现象,最终为 200%
0.0% sy 内核中的进程占用 CPU 百分比
0.0% ni 用户进程空间内改变过优先级的进程占用 CPU 百分比
0.0% id 空闲 CPU 百分比
3.第四五行为内存信息。
Mem: 1883272 total 物理内存总量
369496 used 使用的物理内存总量
815180 free 空闲内存总量
698596 buff 用作内核缓存的内存量。和 free –k 一个意思
Swap: 2097148 total 交换区总量
0k used 使用的交换区总量
2097148 free 空闲交换区总量
进程信号
1 sighup 重新读取配置文件
9 sigkill 立即终止进程
15sigterm 整洁终止
19 sigstop 暂停执行
控制进程
1.按 pid
kill -9 PID
2.按进程名称
killall -15 vim
3.查看后台进程情况
jobs
[root@localhost ~]# firefox &
[root@localhost ~]# jobs
[1]+ Running firefox &
fg:恢复后台进程到前台并运行
了解:
ps -ef
ps -aux 是用 BSD 的格式来显示进程。
ps -ef 是用标准的格式显示进程
进程信息
PID 进程 id
USER 进程所有者的用户名
NI 进程优先级。 nice 值。负值表示高优先级,正值表示低优先级
RES 实际使用内存大小。
S 进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
%CPU 上次更新到现在的 CPU 时间占用百分比
%MEM 进程使用的物理内存百分比
TIME+ 进程使用的 CPU 时间总计,单位 1/100 秒
COMMAND 命令名/命令行
1.top 快捷键
默认 3s 刷新一次
空格 :立即刷新。
q 退出
M 按内存排序
P 按 CPU 排序
<> 翻页
补充 htop 比 top 更强大
安装:要使用 epel 源
yum install htop
测试负载:
dd if=/dev/zero of=/dev/null
2 控制(关闭)进程
kill 给进程发送信号(停止进程)
常用信号:
1 HUP 重新加载配置文件。类似重启。
2 INT 和 ctrl+c 一样 一般用于通知前台进程组终止进程
9 KILL 强行中断
19 STOP 和 ctrl+z 一样
语法:kill -9 pid
[root@localhost ~]# ps -axu | grep top
root 7678 1.0 0.1 15088 1292 pts/0 S+ 22:11 0:00 top
root 7682 0.0 0.0 103300 848 pts/1 S+ 22:11 0:00 grep top
[root@localhost ~]# kill -9 7678
killall 通过程序的名字,直接杀死所有进程
[root@localhost ~]#killall httpd
[root@localhost ~]# ps -axu | grep httpd
或者:
[root@localhost ~]#pkill httpd
3 优先级控制
nice 值 -20 ~ 19 越小优先级越高 普通用户 0-19
nice
作用:以什么优先级运行进程 。默认优先级是 0
语法: nice -n 优先级数字
扩展:
vim a.txt #出现以下情况
E325: ATTENTION
Found a swap file by the name ".a.txt.swp"
owned by: root dated: Tue Jan 27 22:19:53 2015
[root@localhost ~]# rm -rf .a.txt.swp
【例】
# nice -n -5 vim a.txt vim 进程以-5 级别运行
查看:
ps -axu | grep a.txt
[root@localhost ~]# ps -axu | grep b.txt
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 24318 0.0 0.2 143624 3280 pts/4 S+ 17:00 0:00 vim b.txt
[root@localhost ~]# top -p 24318
PID USER PR S+ 17:00 0:00 vim b.txt 24318 NI VIRT RES SHR S %CPU %MEM TIME+
COMMAND
24219 root 15 -5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
renice #修改正在运行的进程的优先级
# renice -n 5 PID 修改进程优先级
【例】
#renice -n 5 24318
[root@localhost ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+
COMMAND 24219 root 15 5 140m 3336 2200 S 0.0 0.3 0:00.08 vim
4 前后台进程切换
jobs 列出所有后台进程
[root@localhost ~]#vim a.txt &
[1] 9714
[root@localhost ~]# jobs
[1]+ Stopped im a.txt [1] 后台进程序列号
fg 后台程序改成前台
用法: fg 后期进程序列号
例:
[root@localhost ~]#fg 1
5 free 查看系统内存量
-m 按照 MB 显示
[root@localhost ~]# free
[root@localhost ~]# free
total used free shared buff/cache available
Mem: 1883272 395664 744196 24300 743412 1251388
Swap: 2097148 0 2097148
buffers #缓存从磁盘读出的内容
cached #缓存需要写入磁盘的内容
清空缓存:
频繁的文件访问会导致系统的 Cache 使用量大增
释放缓存前最好 sync 下,防止数据丢失
/proc 是一个虚拟文件系统,我们可以通过对它的读写操作作为与 kernel 实体间进行
通信的一种手段。也就是说可以通过修改/proc 中的文件,来对当前 kernel 的行为做出调
整。也就是说我们可以通过调整/proc/sys/vm/drop_caches 来释放内存
0 – 不释放
1 – 释放页缓存-->用来清空最近放问过的文件页面缓存
2 – 释放 dentries 和 inodes-->用来清空文件节点缓存和目录项缓存
3 – 释放所有缓存-->用来清空 1 和 2 所有内容的缓存。
[root@pagoda63 ~]# echo >3 /proc/sys/vm/drop_caches
课后作业:仔细推敲所讲的知识点。多练习。有问题随时留言!我会及时回复。明天我们实战:screen 后台实时执行命令备份命令。