操作系统
常用的Linux命令
mkdir cd touch cp mv
ls chmod cat tail rm
ps kill top
硬链接和软链接的区别
它们都是实现文件共享的方式
- 硬链接通过ln来创建,软链接通过ln -s来创建
- 删除软链接不会影响源文件,删除源文件会导致所有软链接都失效,软链接相当于windows的快捷方式
- 删除硬链接会使连接数减1,当连接数减为0时,硬链接才会被删除
线程,进程,协程的区别
- 进程是资源分配的最小单位,当可执行程序被装载到内存中运行就会生成进程.
- 进程拥有自己独立的内存空间
- 线程是CPU调度的最小单位,一个进程可以拥有多个线程
- 线程拥有自己独立的栈空间和寄存器上下文,共享进程的堆空间和代码段空间
- 线程切换由系统调度,在内核态完成.
- 协程是一种用户态线程,多个协程可以绑定一个或多个内核线程
- 协程切换由协程调度器在用户态完成,所以切换速度很快
多线程,多进程的优缺点
多线程:
-
优点:
- 共享内存空间,只需通过全局变量就可实现线程间通信
- 创建,销毁,切换 开销较小
-
缺点:
- 一个线程崩溃可能导致整个进程崩溃
- python的多线程不能充分利用多核CPU
多进程
- 优点:
- 内存隔离,进程间不会相互影响,可靠性高
- 可以实现多台机器上的分布式应用
- 缺点:
- 创建,销毁,切换 开销较大
- 进程间通信较为复杂
进程间通信的方式
- 套接字 (socket)
- 管道 (Pipe)
- 队列 (Queue)
- 信号
- 共享内存
分段和分页机制
分段: 把 虚拟内存空间 映射到 物理内存空间, 还把 虚拟内存地址划分为代码段,数据段,堆栈段等,从而决定了一个虚拟内存地址能否被写入,能否被执行,分段机制 实现了不同进程间的地址空间隔离和数据保护
分页: 把内存段继续细分为一个个内存页,进程运行时只把必要的页装入内存,而把暂不需要的内容放到硬盘,分页机制充分利用的程序的局部性原理,提高了内存的使用率
局部性原理
主要分为时间局部性和空间局部性。
时间局部性: 如果程序中某个数据被访问,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据结构在内存中都是连续存储的)
孤儿进程 与 僵尸进程
-
孤儿进程: 当父进程退出,子进程还在运行,子进程就成了孤儿进程,会被init进程收养,ppid变为1
-
僵尸进程: 当子进程退出时,父进程没有调用wait()或waitpid()获取子进程状态,那么子进程的pid等资源仍会保留在系统中,成为僵尸进程
- 解决: 子进程退出时,父进程会收到一个SIGCHLD信号,我们应该拦截这个信号,调用一下wait()或waitpid()函数
死锁是什么? 如何避免?
死锁是指 两个或两个以上的进程,互相等待对方手里的不可剥夺资源而造成的阻塞现象
- 当进程获取不到所需全部资源时,释放已占有的资源 (破坏不可剥夺条件)
- 使用银行家算法,在资源分配前预先判断本次分配是否会导致系统进入不安全状态
内存抖动
进程不断产生缺页中断,导致刚换出硬盘的页面又换入内存,刚换入内存的页面又要换出到硬盘. 可通过增大物理内存,终止一些进程,优化页面置换算法等方式解决