进程,Vim编辑器

Linux进程与线程

教材笔记
概念
老师笔记

程序和进程

  • 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
  • 进程 (process):程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。

子进程和父进程

image

查看系统中的进程

ps :获取到某个时间点的程序运行情况(静态)

ps   aux   查看所有的进程信息,注意这里的 aux x选项没有短横线

选项与参数:
-A  :所有的 process 均显示出来,与 -e 具有同样的效用;
-a  :不与 terminal 有关的所有 process ;
-u  :有效使用者 (effective user) 相关的 process ;
x   :通常与 a 这个参数一起使用,可列出较完整信息。

输出格式:
l   :较长、较详细的将该 PID 的的信息列出;
j   :工作的格式 (jobs format)
-f  :做一个更为完整的输出。

ps aux 输出各字段意义

USER:  该 process 属于那个使用者帐号的?

PID :  该 process 的程序识别码。

%CPU:  该 process 使用掉的 CPU 资源百分比;

%MEM:  该 process 所占用的实体内存百分比;

VSZ :  该 process 使用掉的虚拟内存量 (KBytes)

RSS :  该 process 占用的固定的内存量 (KBytes)

TTY :  该 process 是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

STAT:  该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)

START: 该 process 被触发启动的时间;

TIME : 该 process 实际使用 CPU 运行的时间。

COMMAND:该程序的实际指令为何?

S:代表这个程序的状态 (STAT),主要的状态有:

  • R (Running):该程序正在运行中;
  • S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
  • D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
  • T :停止状态(stop),可能是在 jobs 控制(后台暂停)
  • Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。

什么是僵尸进程

我们必须要知道的是“僵尸 (zombie) ”程序是什么? 通常,造成僵尸程序的成因是因为该程序应该已经执行完毕,或者是因故应该要终止了, 但是该程序的父程序却无法完整的将该程序结束掉,而造成那个程序一直存在内存当中。 如果你发现在某个程序的 CMD 后面还接上 时,就代表该程序是僵尸程序啦,例如:


image

当系统不稳定的时候就容易造成所谓的僵尸程序,可能是因为程序写的不好啦,或者是使用者的操作习惯不良等等所造成。 如果你发现系统中很多僵尸程序时,记得啊!要找出该程序的父程序,然后好好的做个追踪,好好的进行主机的环境最优化啊! 看看有什么地方需要改善的,不要只是直接将他 kill 掉而已呢!不然的话,万一他一直产生,那可就麻烦了!
事实上,通常僵尸程序都已经无法控管,而直接是交给 systemd 这支程序来负责了,偏偏 systemd 是系统第一支执行的程序, 他是所有程序的父程序!我们无法杀掉该程序的 (杀掉他,系统就死掉了!),所以啰,如果产生僵尸程序, 而系统过一阵子还没有办法通过核心非经常性的特殊处理来将该程序删除时,那你只好通过 reboot 的方式来将该程序抹去了!

top 动态

top 命令
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。默认是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。

top - 19:55:28 up 11:10,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 160 total,   1 running, 159 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,
KiB Mem : 16251468 total, 15535360 free,   443400 used,   272708 buff/c
KiB Swap:  8257532 total,  8257532 free,        0 used. 15482496 avail

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+
 3711 root      20   0  157760   2324   1632 R   0.7  0.0   0:00.02
   10 root      20   0       0      0      0 S   0.3  0.0   0:13.99
    1 root      20   0  191188   4188   2516 S   0.0  0.0   0:01.91
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.12
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00
    7 root      20   0       0      0      0 S   0.0  0.0   0:00.03
    8 root      rt   0       0      0      0 S   0.0  0.0   0:00.16
    9 root      20   0       0      0      0 S   0.0  0.0   0:00.00
   11 root      rt   0       0      0      0 S   0.0  0.0   0:00.66
   12 root      rt   0       0      0      0 S   0.0  0.0   0:00.08
   13 root      rt   0       0      0      0 S   0.0  0.0   0:00.04
   14 root      20   0       0      0      0 S   0.0  0.0   0:00.00
   16 root       0 -20       0      0      0 S   0.0  0.0   0:00.00
   17 root      20   0       0      0      0 S   0.0  0.0   0:00.07
   18 root      rt   0       0      0      0 S   0.0  0.0   0:00.07
   19 root      rt   0       0      0      0 S   0.0  0.0   0:00.04

第一行

19:55:28 系统当前时间
up 11:10 系统开机到现在经过了 11 小时 10 分钟了
1 users : 当前 1 个用户在线
load average: 0.00, 0.01, 0.05 系统1分钟、5分钟、15分钟的CPU负载信息

第二行

Tasks: 任务
160 total, 总共160个任务,就是 160 个进程
1 running, 1 个进程是 运行状态
159 sleeping, 159 个进程是 休眠状态
0 stopped, 0 个进程是 停止状态
0 zombie, 0 个进程是僵死状态

第三行

%Cpu(s): 表示这一行显示CPU总体信息 ,单位是百分比
0.0 us, 用户态进程占用CPU时间百分比,不包含renice值为负的任务占用的CPU的时间。
0.0 sy, 内核占用CPU时间百分比
0.0 ni, 改变过优先级的进程占用CPU的百分比
99.9 id, 空闲CPU时间百分比
0.0 wa, 等待I/O的CPU时间百分比
0.0 hi, CPU硬中断时间百分比
0.0 si, CPU软中断时间百分比
注:这里显示数据是所有cpu的平均值,如果想看每一个cpu的处理情况,按1即可;收起,再次按1;

第四行

KiB Mem : 内存信息
16251468 total, 物理内存总容量
15535360 free, 空闲物理内容容量
443400 used, 已使用的物理内存
272708 buff/c 用作内核缓存的物理内存量

第五行

KiB Swap: 交互分区
8257532 total, 总共
8257532 free, 空闲
0 used. 已用
15482496 avail 有效提供给程序使用的内存,这个并不是 Swap 分区的容量

需要注意的是,free表示的是当前完全没有被程序使用的内存;而cache在有需要时,是可以被释放出来以供其它进程使用的(当然,并不是所有cache都可以释放,比如当前被用作ramfs的内存)。而available才真正表明系统目前可以提供给应用程序使用的内存

第六行

PID:进程的ID
USER:进程拥有者
PR:Priority 的简写,进程的优先级别,越小越优先被执行
NI:Nice 的简写,与 Priority 有关,也是越小越早被执行;
VIRT:进程占用的虚拟内存
RES:进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:进程占用CPU的使用率
%MEM:进程使用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。

top 常用交互命令

q:退出top命令
:立即刷新
s:设置刷新时间间隔
c:显示命令完全模式
t::显示或隐藏进程和CPU状态信息
m:显示或隐藏内存状态信息
l:显示或隐藏uptime信息
f:增加或减少进程显示标志
S:累计模式,会把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+
P:按%CPU使用率排行
T:按MITE+排行
M:按%MEM排行
u:指定显示用户进程
r:修改进程renice值
kkill:进程
i:只显示正在运行的进程
W:保存对top的设置到文件~/.toprc,下次启动将自动调用toprc文件的设置。
h:帮助命令。
q:退出

pstree 进程树

pstree
选项与参数:
-A  :各程序树之间的连接以 ASCII 字符来连接;
-U  :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p  :并同时列出每个 process 的 PID;
-u  :并同时列出每个 process 的所属帐号名称。
[root@kvm-docker ~]# pstree -A -p -u

进程的管理

进程之间是可以互相控制的!举例来说,你可以关闭、重新启动服务器软件,服务器软件本身是个进程, 你既然可以让她关闭或启动,当然就是可以控制该进程。

如何控制进程?

通过给予该进程一个信号 (signal) 去告知该进程你想要让她作什么。

都有哪些信号?

命令
kill  -l

输出

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

主要的讯号代号与名称对应及内容是:


image.png

一般来说,你只要记得1, 9, 15 这三个号码的意义即可。那么我们如何传送一个讯号给某个程序呢?就通过 kill 或 killall 。下面分别来看看:

kill    -信号代号     进程的PID号
或者
kill    -信号名称     进程的PID号

killall   -信号   命名名称

Vim编辑器

老师笔记

image.png

一、移动光标

h,j,k,l 上,下,左,右
ctrl-e 移动页面
ctrl-f 上翻一页
ctrl-b 下翻一页
ctrl-u 上翻半页
ctrl-d 下翻半页
w 跳到下一个字首,按标点或单词分割
W 跳到下一个字首,长跳,如end-of-line被认为是一个字
e 跳到下一个字尾

E 跳到下一个字尾,长跳
b 跳到上一个字
B 跳到上一个字,长跳
0 跳至行首,不管有无缩进,就是跳到第0个字符
^ 跳至行首的第一个字符
$ 跳至行尾
gg 跳至文首
G 调至文尾
5gg/5G 调至第5行
gd 跳至当前光标所在的变量的声明处
fx 在当前行中找x字符,找到了就跳转至
; 重复上一个f命令,而不用重复的输入fx
- 查找光标所在处的单词,向下查找
# 查找光标所在处的单词,向上查找

二、删除复制

dd 删除光标所在行
dw 删除一个字(word)
d/D删除到行末x删除当前字符X删除前一个字符yy复制一行yw复制一个字y/Y 复制到行末
p 粘贴粘贴板的内容到当前行的下面
P 粘贴粘贴板的内容到当前行的上面

三、插入模式

i 从当前光标处进入插入模式
I 进入插入模式,并置光标于行首
a 追加模式,置光标于当前光标之后
A 追加模式,置光标于行末
o 在当前行之下新加一行,并进入插入模式
O 在当前行之上新加一行,并进入插入模式
Esc 退出插入模式

四、编辑

image.png

五、查找替换

/pattern 向后搜索字符串pattern
?pattern 向前搜索字符串pattern
"\c" 忽略大小写
"\C" 大小写敏感
n 下一个匹配(如果是/搜索,则是向下的下一个,?搜索则是向上的下一个)
N 上一个匹配(同上)
:%s/old/new/g 搜索整个文件,将所有的old替换为new
:%s/old/new/gc 搜索整个文件,将所有的old替换为new,每次都要你确认是否替换

六、退出编辑器

:w 将缓冲区写入文件,即保存修改
:wq 保存修改并退出
:x 保存修改并退出
:q 退出,如果对缓冲区进行过修改,则会提示
:q! 强制退出,放弃修改

七、多文件编辑

vim file1.. 同时打开多个文件
:args 显示当前编辑文件
:next 切换到下个文件
:prev 切换到前个文件
:next! 不保存当前编辑文件并切换到下个文件
:prev! 不保存当前编辑文件并切换到上个文件
:wnext 保存当前编辑文件并切换到下个文件
:wprev 保存当前编辑文件并切换到上个文件
:first 定位首文件
:last 定位尾文件
ctrl+^ 快速在最近打开的两个文件间切换
:split[sp] 把当前文件水平分割
:split file 把当前窗口水平分割, file
:vsplit[vsp] file 把当前窗口垂直分割, file
:new file 同split file
:close 关闭当前窗口
:only 只显示当前窗口, 关闭所有其他的窗口
:all 打开所有的窗口
:vertical all 打开所有的窗口, 垂直打开
:qall 对所有窗口执行:q操作
:qall! 对所有窗口执行:q!操作
:wall 对所有窗口执行:w操作
:wqall 对所有窗口执行:wq操作
ctrl-w h 跳转到左边的窗口
ctrl-w j 跳转到下面的窗口
ctrl-w k 跳转到上面的窗口
ctrl-w l 跳转到右边的窗口
ctrl-w t 跳转到最顶上的窗口
ctrl-w b 跳转到最底下的窗口

八、多标签编辑

:tabedit file 在新标签中打开文件file
:tab split file 在新标签中打开文件file
:tabp 切换到前一个标签
:tabn 切换到后一个标签
:tabc 关闭当前标签
:tabo 关闭其他标签
gt 到下一个tab
gT 到上一个tab
0gt 跳到第一个tab
5gt 跳到第五个tab

九、执行shell命令

1、在命令模式下输入":sh",可以运行相当于在字符模式下,到输入结束想回到VIM编辑器中用exit,ctrl+D返回VIM编辑器
2、可以"!command",运行结束后自动回到VIM编辑器中
3、用“Ctrl+Z“回到shell,用fg返回编辑
4、:!make -> 直接在当前目录下运行make指令

十、VIM启动项

-o[n] 以水平分屏的方式打开多个文件
-O[n] 以垂直分屏的方式打开多个文件

十一、自动排版

在粘贴了一些代码之后,vim变得比较乱,只要执行gg=G就能搞定

十二、如何在vim中编译程序

在vim中可以完成make,而且可以将编译的结果也显示在vim里,先执行 :copen 命令,将结果输出的窗口打开,然后执行 :make
编译后的结果就显示在了copen打开的小窗口里了,而且用鼠标双击错误信息,就会跳转到发生错误的行。

十三、buffer操作

1、buffer状态
- (非活动的缓冲区)
a (当前被激活缓冲区)
h (隐藏的缓冲区)
% (当前的缓冲区)
# (交换缓冲区)
= (只读缓冲区)
- (已经更改的缓冲区)

十四、 VIM 操作目录

1.打开目录
vim .
vim a-path/

2.以下操作在操作目录时生效
p,P,t,u,U,x,v,o,r,s
c 使当前打开的目录成为当前目录
d 创建目录
% 创建文件
D 删除文件/目录
- 转到上层目录
gb 转到上一个 bookmarked directory
i 改变目录文件列表方式
^l 刷新当前打开的目录

mf - 标记文件
mu - unmark all marked files
mz - Compress/decompress marked files
gh 显示/不显示隐藏文件( dot-files)
^h 编辑隐藏文件列表
a 转换显示模式, all - hide - unhide
qf diplay infomation about file
qb list the bookmarked directories and directory traversal history
gi Display information on file

mb
mc
md - 将标记的文件(mf标记文件)使用 diff 模式
me - 编辑标记的文件,只显示一个,其余放入 buffer 中
mh
mm - move marked files to marked-file target directory
mc - copy
mp
mr
mt

vim 中复制,移动文件
1, mt - 移动到的目录
2, mf - 标记要移动的文件
3, mc - 移动/复制

R 移动文件

打开当前编辑文件的目录
:Explore
:Hexplore
:Nexplore
:Pexplore
:Sexplore
:Texplore
:Vexplore

你可能感兴趣的:(进程,Vim编辑器)