操作系统的组成
操作系统是一个软件,内部由很多模块组成
操作系统的组成
1.内核
2.系统调用 system call
3.应用程序 (例如:mkdir, vim, ls命令就相当于应用程序)
4.共享库
5.shell解析器
内核的作用
内核是操作系统内部最核心的软件,主要是使用c语言编写的,是开源并且免费的软件
1.对CPU进行管理
2.对内存进行管理
3.对磁盘进行管理 ——》 文件系统
4.对进程进行管理
5.对网络进行管理
查看linux内核版本
[root@lier ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
[root@lier ~]# uname -r
3.10.0-1160.62.1.el7.x86_64
[root@lier ~]#
Linux和Windows的区别
Linux 系统内核是开源的;Windows系统是付费的
Linux 系统更专业;Windows 具有交互性,入门容易
Linux 的用户比 Windows 用户少,Windows适合小白用户,所以用户多一点
Linux中有开源并且免费的系统,如 centos / Ubuntu ;Windows都要付费,但是有些需要付费的 Linux 系统费用比 Windows 高很多
Linux 系统跟 Windows 系统安全性相当,但是由于 Linux 系统大多是专业人士使用,所以很少有人会攻击
进程
进程的组成
进程是由PCB(进程控制块)、程序段和代码段组成
操作系统通过PCB来管理进程,因此PCB中存放操作系统对程序进行管理所需的各种信息,如进程描述信息、进程控制和管理信息、资源分配清单、处理机相关信息;
程序段存放程序代码;
数据段存放程序运行时使用、产生的运算数据,如全局变量、局部变量、宏定义的常量;
PCB: 存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block).
内核通过对PCB的掌控来感知进程是否存在。
PCB一般包括:
1.程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整形数字
2.特征信息:一般分系统进程、用户进程、或者内核进程等
3.进程状态:运行、就绪、阻塞,表示进程现有的运行情况
4.优先级:表示获得CPU控制权的优先级大小
5.通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道
6.现场保护区:保护阻塞的进程用 --》上下文切换
7.资源需求、分配控制信息
8.进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
9.其他信息:工作单位,工作区,文件信息等用户、pid、状态、优先级、内存空间的地址
身份证:
系统调用: 名词,动词
是内核给应用程序的接口,它也是一个程序,然后会帮助应用程序调用内核里的相关代码,去执行,完成相关的操作
用户是捆绑到进程里,然后进程去做事情,携带了用户的标识。
用户–》执行命令–》启动进程–》做各种操作–》权限的检查
程序: 实现某个功能的代码,不运行的情况下,放在磁盘里
进程: 正在运行的程序,在内存和cpu里
ps
查看Linux中的进程,ps命令查看的是Linux系统中一瞬间的所有进程
ps 是命令
ps - report a snapshot of the current processes. 将当前所有的进程快照报告给我看看
ps aux
a 显示所有用户的进程(show processes for all users) u 显示用户(display the process’s user/owner) x 显示无控制终端的进程(also show processes not attached to a terminal)
[root@lier ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 46080 6628 ? Ss 07:09 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 07:09 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 07:09 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 07:09 0:01 [kworker/u256:0]
1、USER 哪个用户启动了这个命令
2、PID 进程ID
3、 CPU占用率
4、MEM 内存使用量
5、VSZ 如果一个程序完全驻留在内存的话需要占用多少内存空间
6、RSS 当前实际占用了多少内存
7、TTY: 终端的次要装置号码 (minor device number of tty)
8、STAT 进程当前的状态(“S”:中断 sleeping,进程处在睡眠状态,表明这些进程在等待某些事件发生–可能是用户输入或者系统资源的可用性;“D”:不可中断 uninterruptible sleep;“R”:运行 runnable;“T”:停止 traced or stopped;“Z”:僵死 a defunct zombie process)
9、START 启动命令的时间点
10、TIME 进程执行起到现在总的CPU暂用时间
11、COMMAND 启动这个进程的命令
ps -ef
e 显示所有用户的进程(all processes)此参数的效果和指定"a"参数相同 f 用ASCII字符显示树状结构,表达程序间的相互关系(ASCII art forest)
[root@lier ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:16 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 09:16 ? 00:00:00 [kthreadd]
root 4 2 0 09:16 ? 00:00:00 [kworker/0:0H]
root 5 2 0 09:16 ? 00:00:01 [kworker/u256:0]
1、UID 用户号
2、PID 进程ID
3、PPID 父进程号
4、C CPU占用率
5、TTY 终端的次要装置号码 (minor device number of tty)
6、TIME 进程执行起到现在总的CPU暂用时间
7、COMMAND 启动这个进程的命令
top
动态的显示当前系统里的进程的使用情况(cpu,内存,进程信息),类似于Windows系统中的任务管理器
[root@lier ~]# top
top - 17:10:27 up 7:53, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 113 total, 1 running, 112 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1862996 total, 1152184 free, 283440 used, 427372 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1408316 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10175 root 20 0 162084 2224 1556 R 0.7 0.1 0:00.03 top
9 root 20 0 0 0 0 S 0.3 0.0 0:08.35 rcu_sched
50 root 20 0 0 0 0 S 0.3 0.0 0:41.19 kworker/0:1
1771 mysql 20 0 971000 88324 7148 S 0.3 4.7 1:10.44 mysqld
1869 root 20 0 89788 2200 1164 S 0.3 0.1 0:00.68 master
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
htop 有颜色的动态显示 top 命令的内容
如何杀死进程
kill
NAME
kill - terminate a process
kill -l
查看系统中的信号
[root@lier ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
常见的信号
SIGHUP signal hup 挂起信号,告诉一组进程的leader(session的第一个进程),如果leader挂了,会给下面的进程发HUP信号,收到HUP信号的进程都会被kill掉
SIGIN signal interrupt 中断信号,终止正在运行的进程
SIGKILL signal kill 强制杀死进程的信号
SIGTERM signal terminate 自我终结信号 --》信号可以被屏蔽的 --》默认的信号
[root@lier ~]# su - lyl
上一次登录:三 6月 1 08:44:41 CST 2022pts/0 上
[lyl@lier ~]$ vim sc.txt
再另起一个终端查看进程
[root@lier ~]# ps aux|grep sc.txt
lyl 10769 0.1 0.2 149576 5256 pts/0 S+ 09:20 0:00 vim sc.txt
root 10771 0.0 0.0 112824 1000 pts/1 S+ 09:20 0:00 grep --color=auto sc.txt
使用kill -9 强制杀死10769这个进程
[root@lier ~]# kill -9 10769
已杀死
[lyl@lier ~]$
默认kill直接接进程使用的是15信号,让进程自我终结
[lyl@lier ~]$ vim sc.txt
[root@lier ~]# ps aux|grep sc.txt
lyl 10780 0.2 0.2 149576 5256 pts/0 S+ 09:37 0:00 vim sc.txt
root 10784 0.0 0.0 112824 1000 pts/1 S+ 09:37 0:00 grep --color=auto sc.txt
[root@lier ~]# kill 10780
[lyl@lier ~]$ vim sc.txt
Vim: Caught deadly signal TERM
Vim: Finished.
已终止
实验
在 lyl 用户中创建一个脚本
[lyl@lier ~]$ cat while.sh
#!/bin/bash
trap "echo i am busy" 15 2 1 9 # 当捕捉到15、2、1信号时输出i am busy
i=1
# while :
while true
do
echo $i
((i++))
sleep 1
done
[lyl@lier ~]$ bash while.sh
另起一个终端
[root@lier ~]# ps aux|grep while.sh
lyl 10885 0.0 0.0 113284 1436 pts/0 S+ 09:43 0:00 bash while.sh
root 10891 0.0 0.0 112824 1004 pts/1 S+ 09:43 0:00 grep --color=auto while.sh
[root@lier ~]# kill -1 10885
#
57
58
59
60
i am busy
61
62
63
64
[root@lier ~]# kill -2 10885
#
118
119
120
121
122
123
i am busy
124
125
126
127
[root@lier ~]# kill -15 10885
#
170
171
172
i am busy
173
174
175
176
177
[root@lier ~]# kill -9 10885
#
198
199
200
已杀死
trap
捕捉信号的命令
[lyl@lier ~]$ cat while.sh
#!/bin/bash
trap "echo i am busy" 15 2 1 9
i=1
# while :
while true
do
echo $i
((i++))
sleep 1
done
当捕捉到 15、2、1信号时输出 i am busy
但是设置捕捉9这个信号的时候没有用,因为9信号会强制杀死进程
nohup
NAME
nohup - run a command immune to hangups, with output to a non-tty
nohup 运行的程序可以屏蔽hup信号
[lyl@lier ~]$ cat while.sh
#!/bin/bash
trap "echo i am busy" 15 2 1 9
i=1
# while :
while true
do
echo $i
((i++))
sleep 1
done
[lyl@lier ~]$ cat nohup.out
[lyl@lier ~]$ nohup bash while.sh
nohup: 忽略输入并把输出追加到"nohup.out"
已杀死
先尝试使用1信号杀死进程,再用9信号强制杀死进程
[root@lier ~]# ps aux|grep while.sh
lyl 11327 0.0 0.0 113284 1440 pts/0 S+ 10:01 0:00 bash while.sh
root 11335 0.0 0.0 112824 1000 pts/1 S+ 10:01 0:00 grep --color=auto while.sh
[root@lier ~]# kill -1 11327
[root@lier ~]# kill -9 11327
查看nohup.out文件中的内容
[lyl@lier ~]$ cat nohup.out
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
文件中没有i am busy ,说明没有捕获到1信号,使用nohup执行脚本时1信号被屏蔽了
刚刚是在两个终端中进行操作,现在在一个终端中操作
[lyl@lier ~]$ nohup bash while.sh &
[1] 11357
[lyl@lier ~]$ nohup: 忽略输入并把输出追加到"nohup.out"
[lyl@lier ~]$ ps aux|grep while.sh
lyl 11357 0.0 0.0 113284 1436 pts/0 S 10:07 0:00 bash while.sh
lyl 11374 0.0 0.0 112824 1004 pts/0 S+ 10:07 0:00 grep --color=auto while.sh
[lyl@lier ~]$
& 将这条命令在后台执行,不需要占前端的终端,进程仍然存在