入手内核的前篇之进程和计划任务
[root@magedu6 ~]# pstree #以进程树的形式显示当前进程 init─┬─NetworkManager─┬─dhclient │ └─{NetworkManager} ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─automount───4*[{automount}]
....
而在CentOS 7上第一个进程是systemd
systemd─┬─NetworkManager─┬─2*[dhclient] │ └─2*[{NetworkManager}] ├─auditd───{auditd} ├─automount───4*[{automount}] ├─crond ├─dbus-daemon───{dbus-daemon} ├─login───bash ├─master─┬─pickup │ └─qmgr
...
Process: 运行中的程序的一个 副本,是被 载入内存的一个指令集合
进程ID (Process ID ,PID )号码被用来标记各个进程
UID 、GID 、和SELinux 语境决定对文件系统的存取和 访问权限,
通常 从执行进程的 用户来继承
存在生命周期
task struct :Linux 内核存储进程信息的数据结构格式
task list :多个任务的的task struct 组成的链表
进程:都由其父进程创建,CoW #CoW写时复制技术
fork(), clone()
过程这样的
1、系统先以fork的方式复制一个与服进程相同的进程,这个进程与服进程唯一的差别就是PID不同,但是这个进程还会多一个PPID的参数,PPID就是父进程的程序识别PID。
2、然后新产生的进程开始加载实际要运行的程序进行执行。#只有进行写入操作的时候才会这样。
进程间通信
1.主机上的进程通信可以通过signal(信号指令)、shm(共享内存空间)、semerphor(旗语)
2.两个主机间的通信通过rpc(远程过程调用)、socket(套接字)
进程优先级:
系统优先级: 数字越小,优先级越高
0-139 (CentOS4,5) )
各有140 个运行队列和过期队列
0-98 ,99 (CentOS6) )
实时优先级: 99-0 :值最大优先级最高
nice 值:-20 到19 ,对应 系统优先级100-139 或99
Big O :时间复杂 度 ,用时和规模 的 关系
O(1), O(logn), O(n) 线性, O(n^2) 抛物线, O(2^n)
进程状态
linux内核:抢占式多任务 #在以前操作系统中是协作式多任务,意思是一个任务得到了CPU时间,除非它自己放弃使用CPU,否则将完全霸占CPU,而抢占式多任务系统的控制权在操作系统这,操作系统会轮询的问每个任务是否需要CPU的使用权,而过一段时间后会收回CPU使用权,将它放在最后,在去询问下一个任务,这样的好处是不会造成任务锁死
[root@localhost ~]# ps -A -e #-A和 -e 效果是一样的。 PID TTY TIME CMD 1 ? 00:00:03 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:02 ksoftirqd/0 7 ? 00:00:00 migration/0 8 ? 00:00:00 rcu_bh
[root@localhost ~]# ps a PID TTY STAT TIME COMMAND 2180 tty1 Ss+ 0:00 -bash 6810 pts/0 Ss 0:00 -bash 7231 pts/0 R+ 0:00 ps a
选项 | 说明 |
---|---|
-d | 指定每两次屏幕信息刷新之间的时间间隔 |
-i | 不显示限制或者僵死的进程信息 |
-c | 显示进程的整个命令路径,而不是只显示命令名称 |
-s | 使top命令在安全模式下运行。此时top的交互式指令被取消,避免潜在危险 |
-b | 分屏显示输出信息,结合“-n”选项可以将屏幕信息输出到文档 |
-n | top输出信息更新的次数,完成后将退出top命令 |
还有一些交互式命令
- 01:34:10:表示当前系统时间。
- up 14:20:表示系统已经运行的时间
- 2 users:当前登录系统的用户数
- load average :表示系统平均负载,三个数值分别表示1分钟 5分钟 15分钟到现在的系统平均负载值。
第二行和第三行分别是进程和CPU信息
- Tasks:113 total:进程的总数。
- 2 running:正在运行的进程。
- 111 sleeping:处于休眠状态的进程。
- 0 stopped:停止的进程数。
- 0 zombie:僵死的进程数。
- %Cpu(s):0.0us:表示用户进程占用CPU的百分比。
- 0.3 sy:系统进程占用CPU的百分比。
- 0.0 ni:用户进程空间内改变过优先级的进程占用CPU的百分比。
- 99.7 id:空闲CPU占用的百分比。
- 0.0 wa:等待输入、输出的进程占用CPU的百分比。
最后 两行输出的是内存信息
- KiB Mem:483856 total:系统的物理内存大小。
- 64972 free:目前空余内存大小。
- 115984 used:已经使用的物理内存大小。
- 302900 buff/cache:用作内核缓冲区的内存大小。
- KiB Swap:2097148 total:交换分区内存大小。
- 2096352 free:空闲的交换分区大小。
- 796 used:已经使用的交换分区大小。
- 309652 avail Mem:缓存大小。
进程信息区
进程信息区显示了每个进程的运行状态,我们先来看一下每列输出的含义。
- PID:进程的ID。
- USER:进程所有者的用户名。
- PR:进程优先级。
- NI:nice值。负值表示高优先级,正值表示低优先级。
- VIRT:进程使用的虚拟内存总量,单位KB. VIRT=SWAP+RES。
- RES:进程使用的、未被患处的物理内存大小,单位KB。RES=CODE+DATA,其中,CODE为执行代码占用的物理内存大小,DATA为数据占用的内存大小。
- SHR:共享内存大小,单位KB。
- S:进程状态,D表示不可终端的睡眠状态,R表示运行状态,S表示睡眠状态,T表示跟踪/停止,Z表示僵死进程。
- %CPU:上次更新到现在的CPU时间占用百分比。
- %MEM:进程占用的物理内存百分比。
- TIME+:进程总计使用的CPU时间,单位为1/100秒。
- COMMAND:正在运行进程的命令名或者命令路径。
[root@localhost ~]# vmstat 1 3 #一秒显示依次,3次后结束 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 1340 90868 0 253020 0 0 5 4 40 53 0 0 100 0 0 0 0 1340 90852 0 253020 0 0 0 0 122 173 0 1 99 0 0 0 0 1340 90852 0 253020 0 0 0 0 121 164 0 0 100 0 0 [root@localhost ~]#
[root@localhost ~]# cat /proc/1/maps 7fd420000000-7fd420029000 rw-p 00000000 00:00 0 7fd420029000-7fd424000000 ---p 00000000 00:00 0 7fd42778b000-7fd42778c000 ---p 00000000 00:00 0 7fd42778c000-7fd427f8c000 rw-p 00000000 00:00 0 7fd427f8c000-7fd427f8d000 ---p 00000000 00:00 0 7fd427f8d000-7fd42878d000 rw-p 00000000 00:00 0 7fd42878d000-7fd428791000 r-xp 00000000 fd:00 67235606 /usr/lib64/libuuid.so.1.3.0 7fd428791000-7fd428990000 ---p 00004000 fd:00 67235606 [root@localhost ~]# pmap 1 1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21 00007fd420000000 164K rw--- [ anon ] 00007fd420029000 65372K ----- [ anon ] 00007fd42778b000 4K ----- [ anon ] 00007fd42778c000 8192K rw--- [ anon ] 00007fd427f8c000 4K ----- [ anon ] 00007fd427f8d000 8192K rw--- [ anon ] 00007fd42878d000 16K r-x-- libuuid.so.1.3.0 00007fd428791000 2044K ----- libuuid.so.1.3.0
dstat 命令:系统资源统计, 代替vmstat,iostat dstat [-afv] [options..] [delay [count]] -c: 显示cpu 相关信息 -C #,#,...,total -d: 显示disk 相关信息 -D total,sda,sdb,... -g :显示page 相关统计数据 -m: 显示memory 相关统计数据 -n: 显示network 相关统计数据 -p: 显示process 相关统计数据 -r: 显示io 请求相关的统计数据 -s: 显示swapped
[root@magedu6 ~]# cat /etc/rc.d/init.d/atd #命令状态确认 CentOS 6 #!/bin/sh # # atd Starts/stop the "at" daemon # # chkconfig: 345 95 5 # description: Runs commands scheduled by the "at" command at the time \ # specified when "at" was run, and runs batch commands when the load \ # average is low enough. ...省略 [root@magedu6 ~]# runlevel #确认是否启动 3 5 [root@magedu6 ~]# service atd status #查看当前状态 atd (pid 1913) 正在运行... [root@magedu6 ~]# chkconfig --list atd atd 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 [root@localhost ~]# cat /lib/systemd/system/atd.service #CentOS 7上的状态确认 [Unit] Description=Job spooling tools After=syslog.target systemd-user-sessions.service [Service] EnvironmentFile=/etc/sysconfig/atd ExecStart=/usr/sbin/atd -f $OPTS ... [root@localhost ~]# systemctl is-enabled atd #确认开机是否启动 enabled [root@localhost ~]# systemctl status atd.service # #确认是否启动,.service可以省略 ● atd.service - Job spooling tools Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) Active: inactive (dead) [root@localhost ~]# at 09:28 #默认交互模式,echo这类终端打印 命令没打印的原因是他以邮件方式发送给root。只要标准输出命令都要输出到/dev/null避免太多垃圾邮件 at> echo at is starting at> <EOT> job 3 at Wed May 10 09:28:00 2017 [root@localhost ~]# at -l #可以看到没执行的计划任务,相当于atq命令 2 Wed May 10 09:24:00 2017 a root 3 Wed May 10 09:28:00 2017 a root at命令关机也不会丢 因为会放在 /var/spool/at/... 文件里 [root@localhost ~]# getent passwd daemon #系统用户,查看情况 daemon:x:2:2:daemon:/sbin:/sbin/nologin