一、初始linuxshell
1.1 什么是Linux
Linux系统可华为为以下四部分:
Linux内核、GNU工具组件、图形化桌面环境、应用软件
1.1.1 Linux内核
1). 系统内存管理
内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内容。内核通过硬盘上的存储空间来实现虚拟内存,这块区域成为交换空间(swap space)。内核不断地在交换空间和物理内存之间反复交换虚拟内存存储单元中的内容。
内存存储单元会被按组分成很多块,这些块称之为页面(page)。内核会将每个内存页面放在物理内存或者交换空间。然后,页面会维护一个内存页面表,来指明那些页面位于物理内存内,那些页面被换到磁盘上。
内核会记录哪些内存页面正在使用中,并自动把一段时间未访问的内存页面复制到交换空间区域,称之为换出(swapping out)——即使还有可用内存。当程序要访问一个已被换出的内存页面时,内核必须从物理内存换出另外一个内存页面来给它让出空间,然后从交换空间换入请求的内存页面。显然,这个过程要花费时间,并使得运行中的进程变慢。只要Linux系统在运行,为运行中的程序换出内存页面的过程就不会停歇。
可以通过查看/proc/meminfo文件来观察Linux系统上虚拟内存的当前状态,Mem是物理内存,Swap是虚拟内存:
[root@localhost ~]# cat /proc/meminfo
MemTotal: 1001360 kB # 这个服务器有1GB的内存
MemFree: 268604 kB #大约有262MB的空闲空间
MemAvailable: 297736 kB #可用内存
Buffers: 40 kB
Cached: 129228 kB
SwapCached: 23224 kB
Active: 149184 kB
Inactive: 406964 kB
Active(anon): 115076 kB
Inactive(anon): 313696 kB
Active(file): 34108 kB
Inactive(file): 93268 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB #交换空间
SwapFree: 1764920 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 407576 kB
Mapped: 30988 kB
Shmem: 1892 kB
Slab: 74524 kB
SReclaimable: 28756 kB
SUnreclaim: 45768 kB
KernelStack: 13072 kB
PageTables: 31708 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2597828 kB
Committed_AS: 3562536 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 171736 kB
VmallocChunk: 34359563264 kB
HardwareCorrupted: 0 kB
AnonHugePages: 112640 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 104320 kB
DirectMap2M: 944128 kB
默认的情况下,运行在Linux系统上的每个进程都有各自的内存页面,进程不能访问其他进程正在使用的内存页面。内核维护着它的内存区域,用户进程不能访问内核进程使用的内存。
多个进程可在同一块共用内存区域(共享内存页面)进行读取和写入操作,内核负责维护和管理这块共用内存区域并控制每个进程访问这块共享区域。
ipcs命令专门用来查看系统上的当前共享内存页面:
[root@localhost ~]# ipcs
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 131072 root 600 524288 2 dest
0x00000000 163841 root 600 4194304 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
[root@localhost ~]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 131072 root 600 524288 2 dest
0x00000000 163841 root 600 4194304 2 dest
2). 软件程序管理
内核创建了第一个进程(init进程)来启动系统上所有其他进程,系统启动时候,会将init进程以及所有其他进程加载到虚拟内存中,对应的一块专有区域将用来存储该进程用到的数据和代码。
一般Linux系统会使用一个表来管理系统开机自动启动的进程,这个表位于/etc/inittab文件中。另外,一些系统则采用/etc/init.d目录,将开机时候启动或停止某个应用的脚本放在这个目录下。这些脚本通过/etc/rcX.d目录下的入口启动,这些入口实际上是到/etc/init.d目录中启动脚本的符号链接,这里的X代表运行级别。
[root@localhost etc]# ll init.d
lrwxrwxrwx. 1 root root 11 Jul 18 08:02 init.d -> rc.d/init.d
[root@localhost etc]# ll -a rc*
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc0.d -> rc.d/rc0.d
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc1.d -> rc.d/rc1.d
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc2.d -> rc.d/rc2.d
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc3.d -> rc.d/rc3.d
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc4.d -> rc.d/rc4.d
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc5.d -> rc.d/rc5.d
lrwxrwxrwx. 1 root root 10 Jul 18 08:02 rc6.d -> rc.d/rc6.d
lrwxrwxrwx. 1 root root 13 Sep 17 22:28 rc.local -> rc.d/rc.local
rc.d:
total 52
drwxr-xr-x. 10 root root 4096 Sep 17 22:28 .
drwxr-xr-x. 143 root root 8192 Sep 19 19:42 ..
drwxr-xr-x. 2 root root 4096 Sep 17 23:12 init.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:06 rc0.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:06 rc1.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:12 rc2.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:12 rc3.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:12 rc4.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:12 rc5.d
drwxr-xr-x. 2 root root 4096 Sep 17 23:06 rc6.d
-rw-r--r--. 1 root root 473 Sep 7 10:38 rc.local
使用ps命令可以查看当前运行在linux系统上的进程:
[root@localhost etc]# ps ax
PID TTY STAT TIME COMMAND
1 ? Ss 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 ? S 0:00 [kthreadd]
3 ? S 0:00 [ksoftirqd/0]
6 ? S 0:02 [kworker/u256:0]
7 ? S 0:00 [migration/0]
8 ? S 0:00 [rcu_bh]
9 ? S 0:00 [rcuob/0]
10 ? S 0:00 [rcuob/1]
11 ? S 0:00 [rcuob/2]
12 ? S 0:00 [rcuob/3]
.............................
995 ? S 0:00 avahi-daemon: chroot helper
1027 ? Ssl 0:00 /usr/lib/polkit-1/polkitd --no-debug
1034 ? S 0:00 /bin/bash /usr/sbin/ksmtuned
....................
1261 ? Ssl 0:01 /usr/bin/python -Es /usr/sbin/tuned -l -P
1263 ? Ss 0:00 /usr/sbin/cupsd -f
1265 ? Ss 0:00 /usr/sbin/sshd -D
1272 ? Ssl 0:00 /usr/sbin/libvirtd
1280 ? Ss 0:00 /usr/sbin/crond -n
1282 ? Ss 0:00 /usr/sbin/atd -f
1283 ? Ssl 0:00 /usr/sbin/gdm
1299 ? Ssl 0:17 /usr/local/redis/bin/redis-server 127.0.0.1:6379
上述代码第一列为进程号(Process ID, PID)。第一个进程即为init进程,PID值为1,之后其他进程PID都是按序分配,旧的PID数值在原进程结束后会被系统重新使用。
第二列 TTY ,是表示该 process 是在哪个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机。
第三列为进程的当前状态,S代表睡眠,SW代表在睡眠和等待,R代表在运行中。进程名字显示在最后一列,方括号中的进程([***])是由于不活动而被从内存中换出到磁盘交换空间的进程。