1. 操作系统考察点
大部分企业应用跑在 Linux server 上,因此需要具备以下几点:
- 熟练在 Linux 服务器上操作
- 了解 Linux 工作原理和常用工具
- 需要了解查看文件、进程、内存相关的一些命令,用来调试和排查
查询 Linux 命令用法
- man 命令,晦涩难懂
- help 命令
- man 的替代品,tldr pip install tldr(tldr 命令)
1.1 文件/目录操作命令
- chown、chmod、chgrp
- ls、rm、cd、cp、mv、touch、rename、ln(软连接、硬链接)
- locate、find、grep 定位查找和搜索
文件或日志查看工具
- 编辑器 vi/nano
- cat 、head、tail 查看文件
- more、less 交互式查看文件
1.2 进程操作命令
- ps 查看进程
- kill 杀死进程(以及kill 的原理)
- top 、htop 监控进程
1.3 内存操作命令
- free 查看可用内存
- 了解每一列的具体含义
- 排查内存泄露问题
1.4 网络操作命令
- ifconfig 查看网卡信息
- lsof 、netstat 查看端口信息
- ssh、scp 远程登录 、赋值 tcpdup 抓包
1.5 用户、组操作命令
- useradd、usermod
- groupadd、groupmod
1.6 线程与进程区别
- 进程是对运行时程序的封装,是系统资源调度和分配的基本单位
- 线程是进程的子任务, cpu调度和分配的基本单位, 实现进程内并发
- 一个进程可以包含多个线程, 依赖于进程存在, 共享进程内存
什么是线程安全
一个线程的修改被另一个线程的修改覆盖了,加锁保证不被修改
Python 哪些操作时线程安全的?
- 一个操作可以在多线程环境中安全使用,获取正确结果
- 线程安全的操作比线程是顺序执行而不是顺序执行的 i+= 1,原子操作时安全的。
- 设计到写操作就要设计到线程安全
线程同步方式
- 互斥量(锁):通过互斥机制放置多个线程同时访问公共资源(同一时间只能一个线程)
- 信号量 semphare :控制同时时刻多个线程访问同一个资源的线程数
- 事件(threading。Event):通过通知的方式保证多个同步
进程间通讯方式
- 管道、匿名管道、有名管道 pipe- 信号 signal:比如用户 ctrl+c 产生 SIGINT 程序终止信号
- 消息队列 Message: RabbitMQ
- 共享内存:share memory
- 信号量
- 套接字 socket:最常用的方式
1.7 Python 多线程和多进程
- threading 模块
- Thread 类来创建多线程
- start() 启动线程
- 用 join 等待线程结束
多进程
- multiprocessing 模块
- Process 类创建
- cpu 密集型程序里使用多进程,避免GIL 影响
[图片上传失败...(image-6498a-1593095732636)]
2. 操作系统内存管理机制常见考题
2.1 什么是分页机制
是为了减少内存碎片、高效机制 ,逻辑地址和物理地址分离的内存分配管理方案
- 程序的逻辑地址划分为固定大小的 Page
- 物理地址划分为同样大小的帧 Frame
- 通过页表对应逻辑地址和物理地址
[图片上传失败...(image-d72a7e-1593095732636)]
2.2 分段机制
- 满足代码的一些立即需求
- 数据共享,数据保护,动态链接等
- 通过段表实现逻辑地址和物理地址的映射关系
- 每个段内部是连续内存分配,段和段之间是离散分配的
[图片上传失败...(image-60fcc7-1593095732636)]
分页和分段区别
- 出于内存利用率的角度提出的离散分配机制
- 出于用户角度,用于数据保护、数据隔离等用途的管理机制
- 页的大小固定,操作系统决定,段的大小不确定,用户程度决定
2.3 虚拟内存
把一部分暂时不用的内存信息放在硬盘:程序运行时只有部分必要的信息放内存
- 内存暂时不需要的内容放硬盘上
- 系统似乎提供比实际内存大得多的容量,称为虚拟内存
2.4 内存抖动(颠簸)产生的原因
- 频繁的页调度,进程不断产生缺页中断
- 置换一个页,又不断再次需要这个页
- 运行程序太多,页面替换策略不好,终止进程或增加物理内存
2.5 Python 垃圾回收机制原理
Python 不需要像 C 语言手动回收内存,它会自动回收内存:
- 引用计数为主(缺点:循环引用无法解决)
- 引入标记清除和分代回收解决引用计数的问题
-
引用计数为主+标记清除和分代回收为辅
image
当引用计数为 0,就会回收掉。
# 查看引用计数,调用也会增加
import sys
a= [1, 2]
sys.getrefcount(a)
2
b= 1
sysgetrefcount(1)
2900
循环引用
当两个对象互相引用之后,引用计数无法清零即循环引用,这种情况可能会导致内存泄露,我们可以使用 标记清除 的方式解决循环引用的问题。


线程练习题
- 某些多线程爬虫
- threading 模块
- 要求1:该类可以传入最大线程数和需要抓取的网站列表
- 要求2:该类可以通过继承的方式提供一个处理 response 的方法。
3. 面试题
1、讲一下你常用的Linux/git命令和作用
- ls:查看目录中所有文件
- ifconfig:查看 ip
- ps:查看进程
- kill:杀死进程
- apt-get install:安装软件
- git init:初始化版本库
- git add .:添加所有更新
- git commit:提交
- git push remote origin xxx:与远程库关联
- git pull -u origin master:推送
2、查看当前进程是用什么命令,除了文件相关的操作外,你平时还有什么操作命令
ps -ef | grep redis
mv a.txt /home/hj/b.txt
vim a.txt
cp a.txt /b.txt
rm -r
cat。。。
pwd
cd
mkdir
find / --name a.txt
1、讲一下你常用的Linux/git命令和作用
- ls:查看目录中所有文件
- ifconfig:查看 ip
- ps:查看进程
- kill:杀死进程
- apt-get install:安装软件
- git init:初始化版本库
- git add .:添加所有更新
- git commit:提交
- git push remote origin xxx:与远程库关联
- git pull -u origin master:推送
2、查看当前进程是用什么命令,除了文件相关的操作外,你平时还有什么操作命令
ps -ef | grep redis
mv a.txt /home/hj/b.txt
vim a.txt
cp a.txt /b.txt
rm -r
cat。。。
pwd
cd
mkdir
find / --name a.txt
3、Git
个分布式版本控制系统,两个重要功能:版本控制和协作开发
常用命令:
git init # 初始化
git add . # 添加所有,添加到暂存区
git commit -m # 提交到版本库
git status # 查看工作区状态
git log --pretty=oneline # 查看提交记录
git reset --hard HEAD^ # 回到上一个版本
git reset --hard 8e882b # 实际只需要前 6 位即可
git branch # 查看所有分支,带星号的为当前分支
git checkout master # 切换到 master 分支
git merge 分支名 # 合并分支
将本地推送到远程:
# github 新建仓库
# 切换到要推送的文件夹中
git init # 初始化版本库
git add . # 添加到暂存区
git commit -m 'xxx' # 提交到版本库
git remote add origin https://github.com/xxx # 与 github 上仓库关联
git pull --rebase origin master # 拉取远端最新的代码(其实是将远端的 readme.md 文件与本地的合并在一起,解决冲突)
git push -u origin master # 推送
网友评论