进程状态
创建、终止
就绪:资源全部准备就绪,正在等待CPU调度
运行:占有CPU,执行任务
阻塞:等待某一事件(比如输入输出)的发生或完成,即使有CPU也无法运行
线程状态
创建、终止
可运行:包括运行和就绪
等待:需要等待其他线程做出一些特定动作(通知或中断)
超时等待:在指定时间内
阻塞:需要等待锁释放
线程和进程的相同点
- 独享程序计数器、栈、寄存器
- 线程同样具有就绪、阻塞、运行三种基本状态,同样具有状态之间的转换关系
- 都共享CPU,一个CPU在同一时刻只能执行一个进程或线程
- 顺序执行
- 可以创建子进程/子线程
线程和进程的区别
- 进程是资源(包括内存、打开的文件等)分配的单位,线程是 CPU 调度的单位;
- 进程独立拥有系统资源,而线程共享进程的地址空间;
- 线程并发执行的时间和空间开销更小(切换开销、数据传递开销);
- 线程之间不相互独立,会相互影响,有安全问题
线程的优点
- 一个进程中可以同时存在多个线程;
- 并发性:各个线程之间可以并发执行;
- 资源共享:各个线程之间可以共享地址空间和文件等资源;
- 轻量级:相比进程,切换开销小
线程能减少开销
- 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;
- 线程的终止时间比进程快,因为线程释放的资源相比进程少很多;
- 同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间,这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,页表的切换过程开销是比较大的;
- 由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;
进程间通信
- 管道:FIFO,大小有限,阻塞,流传输。匿名:单向传输,只能用于存在父子关系的进程间通信;命名管道:可以用于不同的进程,可以双向传输
- 消息队列:保存在内核中的消息链表,大小有限,读写需要切换内核态和用户态,可随机查询消息(非fifo)
- 共享内存:相同的物理内存,多进程竞争资源
- 信号量:互斥和同步,避免竞争
- 信号:异步通信,通知接收进程某个事件已经发生
- socket:不同网络主机进程间的通信,也可以同主机
多线程竞争
锁:忙等待 自旋锁,无忙等待 加入阻塞队列
信号量:PV操作
生产者消费者模型
死锁
多个线程互相等待对方释放资源,导致所有进程或线程都无法继续执行下去。
虚拟地址
程序中使用的逻辑地址,通过MMU可以将虚拟地址映射到内存的物理地址
每个进程有独立的一套「虚拟地址」,虚拟地址为程序提供了一个独立的地址空间,使得每个程序可以在自己的虚拟地址空间中运行,而不会相互干扰
虚拟内存的作用
分配和回收内存
内存扩展(可以使运行内存大于物理内存,局部性原理,不常用的内存会被换出到硬盘)
防止进程相互影响,解决了多进程之间地址冲突的问题
非连续内存分配
分段:按照程序的逻辑进行划分;段是逻辑单位,大小不一致;有外部碎片,交换效率低
分页:页是物理单位,内存划分,大小一致;有内部碎片,占用内存空间大(可以使用多级页表,n级页表可以在需要时才创建,或者根据局部性原理暂时换出到硬盘)
TLB:在CPU中存储经常访问的页表项,提高访问速度
内存满了会发生什么
如果虚拟内存没有映射到物理内存,就发生了缺页中断,进程会从用户态切换到内核态去处理中断
如果有空闲的物理内存,就直接分配空间,并映射
如果没有,就回收内存(异步和同步)(换出到磁盘,需要时再调回,页面置换)
如果还是没有,OOM
文件系统结构
目录项, 索引节点(存储文件元信息)、数据块、超级块
软硬链接
硬链接:多个目录项中的「索引节点」指向一个文件
软链接:独立的 索引节点,但是这个文件的内容是另外一个文件的路径