系统八股

147 阅读5分钟

Linux命令

查看进程的命令:ps命令,后面能接很多后缀,查看进程信息。top命令也可以查看进程信息、CPU使用情况等。

image.png

查看后5000行:tail -n 5000。实时查看最新的:tail -f。

cd或者.. 切换目录
ls或ll 查看有哪些文件

mkdir 创建文件夹
touch或vi 可以创建文件

cp 复制文件
mv 移动文件

chmod 文件权限修改
pwd 查看当前路径

cat文件名 查看文件内容
more/less文件名 分页查看

tail/head文件名 查看头部尾部
grep命令 是一种强大的搜索工具,三军刀

wc命令 文件内容统计
awk命令 查看文件中的某行,三军刀

找到指定一个线程的信息(ps aux | grep 线程名)
找到指定文件后缀的文件(ls | grep *.文件后缀)
输出一个文本数据的第三列(awk)

ps 查看当前进程
ps -ef 查看所用进程
ps -ef | grep pid 查看指定线程
kill pid

job -l 查看后台任务

netstat 查看网络是否联通
ifconfig 查看ip地址

image.png

image.png

Linux命令查看网络情况

socket信息查看:netstat或ss。包含:socket 的状态(State)、接收队列(Recv-Q)、发送队列(Send-Q)、本地地址(Local Address)、远端地址(Foreign Address)、进程 PID 和进程名称(PID/Program name)等。

网络吞吐率和PPS:sar命令。

连通性和延时:ping命令。

Linux命令查看进程运行情况

当系统运行缓慢时,需要查看是哪部分造成的,一般从CPU、内存、IO、系统负载等方面分析。

blog.csdn.net/weixin_3950…

www.bjhee.com/linux-statu…

juejin.cn/post/690443…

查看日志

慎用cat:cat查看日志文件,日志文件有多少读多少,这肯定是不合适的。而less命令可以先加载一小部分,往下看继续加载。也可以用tail命令,查看尾部的几行。使用 tail -f 命令,这样你看日志的时候,就会是阻塞状态,有新日志输出的时候,就会实时显示出来。

查看有多少条日志记录:wc -l

image.png

网络系统

I/O之零拷贝技术

xiaolincoding.com/os/8_networ…

image.png

I/O之Socket编程

image.png

image.png

socket编程由开始的单线程变为后期的多线程来处理多个请求,那么多线程是如何做的呢?

image.png

image.png

I/O之多路复用

一个线程处理多个请求,Linux操作系统通过select/poll/epoll供用户态多路复用来调用,即一个线程通过一个系统调用函数从内核获取多个事件。

image.png

image.png

epoll:xiaolincoding.com/os/8_networ…

进程管理

进程间的通信

(一)管道

Linux命令中会用到管道,比如cat xxx.txt | grep -E ""这个之前用过的命令,这个 | 竖线就是一个管道。管道传输数据是单向的,前一个命令的输出是下一个命令的输入。

管道是一段内存缓存空间,两个进程间用子线程来读取,还挺复杂。

(二)共享内存

Java采用的就是共享内存的机制来通信的,用synchronized和lock去锁住共享内存来保证线程安全。

(三)信号量

就是P、V操作,主要用于进程的互斥与同步

(四)信号

信号和信号量的区别就是java和javascript的区别。

信号是进程通信机制中唯一的异步通信机制。

(五)消息队列

不太知道具体情况

(六)Socket

不同主机上的进程通信,就用Socket了。

看这个还是会有基本的了解的 www.cnblogs.com/swordfall/p… 。还是网络那三个协议,也没别的啥。

死锁

(一)死锁的概念

A线程拿到了A资源去请求B资源,B线程拿到了B资源去请求A资源。

死锁满足的四个条件:

互斥条件:多个线程不能同时持有同一个资源。

持有并等待条件:线程A请求B的同时,是不会释放A的。

不可剥夺条件:线程A的A资源是不会被其他线程获取的。

环路等待条件:多个线程请求资源的顺序形成一个环。

(二)死锁避免、检测

破坏上述四个条件中的任意一个就可以避免死锁!

最常见的一种是:资源有序分配法,破坏环路等待条件

死锁检测采用银行家算法,推一下是否会有死锁。

(三)锁的类型

遇到冲突要不要加锁:悲观锁和乐观锁。

加锁失败要不要释放CPU:互斥锁和自旋锁。

synchronized自旋锁:无锁、偏向锁、轻量级锁、重量级锁。

读操作要不要加锁:互斥锁和读写锁。

(四)死锁的场景

Java死锁场景:比较简单的一个就是A在sync了o1之后,要sync o2;而B呢,在sync了o2之后,再sync o1。

MySQL的死锁场景:发生在两个事务A和B之间,事务A先update id=5再update id=6;而B呢,先update id=6再update id=5。这样就可能有死锁。

Golang死锁场景:缓存为0的通道就会死锁。itcn.blog/p/180847515…

进程基础

xiaolincoding.com/os/4_proces…

调度算法

在操作系统中,由三种调度,进程调度算法、内存页面调度算法、磁盘调度算法。

xiaolincoding.com/os/5_schedu…

多线程冲突

多线程之间需要互斥同步

xiaolincoding.com/os/4_proces…

多线程互斥与同步的实现:两种方式,一种是用锁(互斥嘛),一种是用信号量(同步嘛)。

同步中用到了P、V操作,还有经典的生产者消费者问题。