写在前面
这篇文章是参考了CyC2018大大的总结这篇文章,结合面试中常问的问题提取了部分,相当于是我自己的笔记吧,方便之后查看。
进程和线程
1.什么是进程?
进程是系统进行资源分配和调度的基本单位。进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
2.什么是线程?
线程是系统调度和分派的基本单位。
3.两者的区别
- 拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,同一进程中的线程共享进程中的资源。 - 调度
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。 - 系统开销
进程的开销大:
1.当创建或撤销进程时,系统都要为之分配或回收资源;
2.当切换进程时,要保存当前执行进程CPU环境的保存及新调度进程CPU环境的设置。
线程的开销小:
只需保存和设置少量寄存器内容。 - 通信
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。
进程的状态
-
活动就绪->执行:
- 运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU。
-
执行->活动就绪:
- 主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的。
- 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。
-
执行->活动阻塞:
- 正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求。
-
引起挂起状态:
- 终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态称为挂起状态。
- 父进程请求。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。
- 负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
- 操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
进程调度算法
-
批处理系统
- 先来先服务 first-come first-serverd(FCFS)
- 短作业优先 shortest job first(SJF)
- 最短剩余时间优先 shortest remaining time next(SRTN)
-
交互式系统
- 时间片轮转
- 优先级调度
- 多级反馈队列
-
实时系统
- 软实时:必须满足绝对的截止时间
- 硬实时:可以容忍一定的超时
进程同步
-
临界区
- 对临界资源进行访问的那段代码称为临界区。
- 为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。
-
同步和互斥
- 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
- 互斥:多个进程在同一时刻只有一个进程能进入临界区。
-
信号量
- PV操作
- 使用信号量解决生产者-消费者问题
- 管程
进程间通信
-
管道
- 管道是通过调用 pipe 函数创建的,fd[0] 用于读,fd[1] 用于写。
- 只支持半双工通信
- 只能在父子进程或者兄弟进程中使用
-
FIFO
- 也称为命名管道,去除了管道只能在父子进程中使用的限制。
- 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
-
消息队列
- 消息队列可以独立于读写进程存在,从而避免了FIFO中同步管道的打开和关闭时可能产生的困难。
- 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法。
- 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
-
共享存储
- 允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。
- 需要使用信号量用来同步对共享存储的访问。
- 多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。
-
套接字
- 可用于不同机器间的进程通信。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。