Linux工作流程 :
1.POST加电自检
2.加载BIOS, BIOS 加载 CMOS , 取得硬件信息和自我检测,取得第一个可启动设备
3.读取第一个启动设备内 MBR(MasterBoot Record,主引导分区) 的 Boot Loader
4.Boot Loader(主引导程序,识别操作系统的文件格式,决定装载哪个内核)
5.加载内核,内核检测硬件和加载驱动程序
6.内核驱动成功后,调取 init 进程,init 取得 run-level 信息
7.init 执行 /etc/rc.d/rc.sysinit 准备软件执行的环境, /etc/inittab
8.init 执行 run-level 的各个服务的启动
9.init 执行 /etc/rc.d/rc.local 文件
10.init 执行终端模拟程序mingetty启动login进程,等待用户登录
有2种方式查看内核引导和运行诊断信息:
1.查看内核系统日志文件,/var/log/kern.log
2.执行dmesg 命令
内核初始化的顺序如下:
1.检查cpu
2.检查内存
3.发现设备总线
4.发现设备
5.辅助内核子系统启动
6.挂载根目录
7.用户空间启动
文件 /proc/cmdline 记录了内核启动参数
查看运行级别:
who -r //run-level 3 2017-11-27 18:00
用户空间启动顺序:
1.init
2.必要的底层服务,如 :udevd 和 syslog
3.网络配置
4.中高层服务,如 cron, printing
5.登录提示,图形界面以及其他高层次应用
天字第一号进程:
init(initialization 的缩写)是Unix和类Unix系统中用来产生其他所有进程的程序。它也守护进程的方式存在,其进程号为1.Linux系统
开机时加载Linux内核后,便由Linux内核加载init程序,由init程序完成剩余的开机过程,比如加载运行级别,加载服务,引导shell/图形化界面等等。
在Linux发行版中,init有3种主要的实现形式:
1.System V init : 传统的
System V init 存在一个启动序列,同一时间只能启动一个任务,在这种架构下,很容易解决依赖问题,但性能方面要受到一些影响。
2.systemd : 所有主流Linux发行版中标准的init
Systemd is goal oriented : 针对System V init 的不足,systemd 所有的服务都并发启动。systemd 基于目标的,需要定义要实现的目标,
以及它的依赖项。systemd 将所有的过程都抽象为一个配置单元,即unit。可以认为一个服务是一个配置单元,一个挂载点是一个配置单元。
3.Upstart : Ubuntu
Upstart 是基于事件的,Upstart的事件驱动模型允许它以异步方式对生成的事件作出回应。
内存管理:
内存是计算机中与cpu进行沟通的桥梁,用于暂时存放cpu中的运算数据。在早期的Unix系统中,fork启动新进程的时候,由于父进程
往子进程复制内存信息需要消耗一定的时间,因此启动多个进程存在性能瓶颈。现在的Linux内核则通过'写时复制'等机制提高了创建进程
的效率;也正是因为如此,关于Linux内存分配,计算,空闲判断有一些特别需要注意的地方。
内存异常:out of memory(OOM) killer
最常见的内存管理异常就是 Out of memory 问题。通常是因为某个应用程序大量请求内存导致系统内存不足造成的,触发内核里的
Out of memory killer, OOM killer 会杀掉某个进程以释放内存给系统内核用。它实际上是一种保护机制,不至于让系统立即崩溃。
内核检测到内存利用不足,就会选择杀掉某个 'bad'进程。如何判断和选择一个'bad'进程呢?算法和思路非常简单:最bad的那个及承诺函就是
占用内存最多的进程。
我的内存利用率为什么特别高?
1.内存利用率(概括):free
2.内核利用率(进程):top
内存空闲率 = (total - used)/total
'真实的'内存空闲率 = (free + shared + buffers + cached)/total
按照用户,内存可以划分为 '内核内存'和'用户内存'(用户进程及磁盘高速缓存),包括内核本身在内,程序在访问物理内存时,并不直接指定物理地址,
而是指定逻辑地址。cpu上搭载的硬件MMU(memory management unit)会参照物理--逻辑地址对应关系表实现对映射后物理地址上的数据访问。
Linux内存的分类:
用户内存的分类有2组概念比较重要:匿名内存和file-backed 内存;active 和 inactive。它们的区别如下:
1.匿名内存:用来存储用户进程计算过程中间的数据,与物理磁盘的文件没有关系
2.file-backed内存:用作磁盘高速缓存,其物理内存与磁盘上的文件是对应的
3.active:刚刚被使用过的数据的内存空间
4.inactive:包含有长时间未被使用过的数据的内存空间
shmem(shared memory) 指的就是 tmpfs 所使用的内存---一个机遇内存的文件系统,提供可以接近于零延迟的快速存储区域。Linux可以将空闲内存用于缓冲,
并且在应用程序需要的时候回收。
'/ + buffers/cache' : 提供了关于内存利用率更加准确的数值。
buffers:buffer cache,用于块设备IO
cached : page cache,用于文件系统
Linux内存的计算:
各类内存的计算公式如下:
shmem = 磁盘高速缓存(buffers/cached) - File-backed内存(file) = 匿名内存(anon) - AnonPages 用户内存 = Active(file) + inactive(file) + active(anon) +inactive(anon) + unevictable = buffers + cached + AnonPages
内核内存 = Memtotal - (MemFree + Active + Inactive + unevictable)
Linux 进程的内存:
执行 'ps aux' 后输出的各个进程的RSS(resident set size),表示进程占用内存的大小,单位是kb。需要注意的是,RSS值实际上是基于 pmap命令,表示'该进程正在使用
的物理内存的总和'。pmap提供了进程的内存映射,也可以支持多个额进程的内存状态显示。与 ldd 命令类似,pmap 命令可以查看到程序调用的路径。如果查看一个已经运行,但是
又不知道路径的程序,使用pmap更快捷。
/proc/PID/status 支持的选项有:
1.VmData: data 段大小
2.VmExe: text 段大小
3.VmLib : 共享库的使用量
4.VmRSS : 物理内存的使用量
5.VmSwap : 交换空间的使用量