Linux 服务器
操作系统版本
- Linux操作系统分类详解
- Linux和UNIX的关系及区别
- 服务器操作系统可以分为三类:
- 商业公司维护的发行版本(Redhat最著名)
- RHEL:Redhat商用版本
- CentOS:Redhat 系列,RHEL的社区克隆版本, 免费
- 社区组织维护的发行版本(Debian最著名)
- Debian:最遵循 GNU 规范的 Linux系统
- Ubuntu:基于 Debian 的 unstable 版本加强而来
- 其他版本
- OpenSUSE:德国公司资助的社区计划
- FreeBSD:稳定和高效, 服务器的最佳选择,源于商业化之前的开源Unix
- 商业公司维护的发行版本(Redhat最著名)
- Linux 和 Unix
- Unix系统目前常见的有:Oracle Solaris、FreeBSD、macOS、IBM-AIX、HP-UX等(macOS内核是darwin)
- Linux系统版本见上面提到的服务器操作系统(除了FreeBSD)
- Linux 的四个分支
- Linux的分类
- 四个分支:Arch系、Redhat系、Debian系、SUSE系
- SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。
进程间通信IPC (InterProcess Communication)
- System V IPC和POSIX IPC之间的区别
- 进程间通信IPC (InterProcess Communication)
- 进程间通信方式总结
- 管道:管道是半双工的,数据只能向一个方向流动;
- 匿名管道:只能用于父子进程或者兄弟进程之间
- 有名管道:去除了管道只能在父子进程中使用的限制
- 消息队列:调用方式有三种,ipc()系统调用、System V IPC函数、Posix API调用
- 共享内存:调用方式有三种,mmap()系统调用、System V IPC函数、Posix API调用
- 信号(Signal):SIGKILL、SIGHUP等
- 信号量(semaphore):有三种:Posix有名信号量(使用Posix IPC名字标识)、Posix基于内存的信号量(存放在共享内存区中)、System V信号量(在内核中维护)
- 套接字(socket)
线程间通讯
- 线程间的通信、同步方式与进程间通信方式
- 进程间、线程间通信方式
- 多线程共享地址空间和数据空间,严格讲线程之间通信是不需要程序员干预的,程序员需要干预的是线程之间的同步。
- 全局变量(需要处理同步问题)
- 管道、消息队列、共享内存
- 线程间的同步方式:
- 锁机制:包括互斥锁、条件变量、读写锁
- 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
- 信号机制(Signal):类似进程间的信号处理
- PS:线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
进程的信号机制
- 信号是操作系统中进程间通讯的一种有限制的方式,是一种异步的通知机制,用来提醒进程一个事件已经发送
- SIGHUP:控制台操作
- SIGINT:终止进程,Ctrl + C
- SIGKILL:终止进程,kill -9
- SIGSTOP:停止进程的执行
- SIGCONT:恢复进程的执行
什么是进程、线程、协程
- 进程线程协程区别
- 进程:正在运行中的程序的一个抽象,操作系统资源分配和调度的基本单位
- 线程:操作系统进行CPU调度运行的最小单位。一个进程可以包含多个线程
- 协程:协程是一种用户态的轻量级线程,又称微线程,英文名 Coroutine,协程的调度完全由用户控制
进程的调度算法
- 进程调度算法
- 批处理系统:先来先服务、短作业优先、最短剩余时间优先
- 交互式系统:时间片轮转、优先级调度、多级反馈队列(前面两种的结合)
- 实时系统:要求一个请求在一个确定时间内得到响应,可分为硬实时和软实时
Linux 网络 I/O 模型
- Linux IO模式及 select、poll、epoll详解
- python之IO多路复用(二)——select、poll、epoll详解
- 阻塞 I/O(blocking IO),socket默认情况下是阻塞 I/O
- 非阻塞 I/O(nonblocking IO),需要用户进程需要不断的主动询问
- I/O 多路复用(IO multiplexing)
- select,有文件描述符的数量限制(1024),内核准备好数据后通知用户,用户轮询获取
- poll,不常使用
- epoll,没有文件描述符的数量限制,内核准备好数据以后会通知用户哪个连接有数据了
- 信号驱动 I/O(signal driven IO),不常使用
- 异步 I/O(asynchronous IO),kernel会给用户进程发送一个signal,告知read操作完成。
- 前四种是同步IO,怎样理解阻塞非阻塞与同步异步的区别?
Epoll 相关
- 普通文件为什么不能使用epoll,内核源码搜索grep -r '.poll\s' fs/ | uniq
- go的线程何时会阻塞,Linux用epoll,BSD/Drawin用kqueue,Windows用IOCP
- golang 系统调用与阻塞处理,用户态和内核打交道2种方案:自己封装或依赖glibc等运行库
- Epoll的lt、et模式和惊群
- epoll惊群效应深度剖析
- 劫起|再谈Linux epoll惊群问题的原因和解决方案
- lt水平触发:读写事件没有结束就一直触发;et边缘触发:只触发一次
- 以tcpServer建立了listenFd等待connectFd事件为例(A、B两个进程使用同一个epoll):
- lt的问题是A在epoll_wait到accept的时间间隔内,可能会继续给B发触发事件
- et没有这个问题,但是epoll_wait到accept的时间间隔内有新的客户端进来就被忽略了,解决办法是每次都要循环处理完
- 惊群效应:nginx多进程监听epollFd,事件会触发所有的进程,nginx 1.11 之前采用et+锁
- linux 3.9 解决方案:socket提供SO_REUSEPORT标志,允许多个进程监听同一个ip+port
- linux 4.5 解决方案:epoll提供EPOLLEXCLUSIVE标志,这样事件只会触发一个进程
用户态、内核态
- 理解Linux用户态和内核态
- 用户态,程序运行在最低特权级(3级)的状态。执行不了危险操作,比如改系统配置文件、杀掉其他用户的进程、重启系统等。
- 内核态,程序运行在0级特权级上时。
- 从用户态到内核态切换可以通过三种方式
- 系统调用
- 不可知的异常,比如缺页异常
- 外设中断,比如硬盘读写完成,系统会切换到硬盘读写的中断处理程序中执行后续操作
Linux 常用命令
- 记一次丢包网络故障
- vmstat 5:r第一列是cpu忙的个数,id是空闲cpu,us是用户cpu,sy是用户cpu
- iostat -dx 5:磁盘的读写速度
- sar -n DEV:查看网卡流量
- lsof -i:3306:查看端口进程
- lsof | grep mysql 查看mysql进程打开的文件
- strace -T -p
:查看进程的trace和耗时 - strace -c php 1.php:进程trace的统计图表,一次简单的php请求redis会有哪些开销
- tcpdump -i eth0 port 3306 and host 10.146.56.180 -w tcpdump.log:linux抓包
inode 是什么
每一个文件都有对应的 inode,除了文件名以外的所有文件信息,都存在inode之中
硬链接和软链接
- 硬链接:ln 源文件 链接名
- 软链接:ln -s 源文件 链接名
- 区别:若将源文件删除,硬链接依旧有效,而软链接会无效,即找不到源文件
孤儿进程和僵尸进程
- 孤儿进程:父进程退出了,被init进程收养
- 僵尸进程:ps -ef|grep defunc 可以查看。进程死了,但是没有被父进程通过 wait() 或 waitpid() 释放。