操作系统
程序 进程 线程
1 程序
- 程序是含有指令和数据的文件,是静态的代码
2 进程
- 进程是 程序及其数据 在处理器上运行的过程,是资源分配和调度的基本单位(线程引入之前)
- 引入: 为了描述 程序动态执行过程的性质,并更好的支持并发,引入了进程
3 线程
- 引入: 解决了1、进程同一时间只能做一件事、2、进程执行时某部分阻塞了,与此部分无关的工作也被阻塞
- 调度: 线程是独立调度的基本单位、进程是资源拥有的基本单位
- 并发: 进程与线程都可以并发
- 系统开销: 进程撤销时开销大、线程撤销时开销小、且同一进程间的线程共享资源,线程间的同步与通信容易
进程间的通信方式 7种
- 管道pipe 半双工通信方式 数据只能单向流动。 非命名管道只能父子进程通信 命名管道FIFO可以用于非父子进程
- 信号 signal 通知接收进程某个事件已经发生 一种同步手段
- 信号量 semophore 计数器 控制多个进程对共享资源的访问 不能传递复杂消息 仅用于同步
- 消息队列 message queue 消息的链表 放在内核中
- 共享内存 shared memory
- 套接字 socket
线程间的通信方式
- 锁: 互斥锁 条件变量 读写锁
- 信号量机制
- 信号机制
协程
- 协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
- 协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显。
- 不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程。对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。
死锁
- 死锁是指多个进程竞争资源造成的一种互相等待的僵局,若无外力作用,这些进程都无法向前推进
用户态和内核态
系统资源是固定的,为了有效利用有限的系统资源,要给不同的操作赋予不同的权限,因此就有了用户态和内核态两个权限等级,给不同的操作分别不同的权限等级
- 用户态切换到内核态的3种方式
- 系统调用 如 malloc调用brk() mmap()系统调用分配内存
- 异常:如缺页异常
- 外围设备中断:如硬盘读写完成,系统会切换到硬盘读写中断程序进入内核态