1、进程管理
1)进程、线程的区别
区别 | 进程 | 线程 |
---|---|---|
根本区别 | 资源管理的基本单位 | 任务执行、调度的基本单位 |
切换 | `慢 | 快 |
资源 | 独立内存空间 | 同进程下的线程共享本进程地址空间与资源 |
开销 | 创建、销毁是开销大 | 比进程小 |
执行 | 有程序入口、程序出口、执行顺序 | 不能独立执行,须在应用程序中 |
关系 | 一个进程可有多个线程 | 进程的一部分 |
健壮性 | 健壮 | 相对不健壮 |
2)进程线程、协程的区别
区别 | 进程、线程 | 协程 |
---|---|---|
机制 | 同步 | 异步 |
调度 | 抢占式、分时调度 | 非抢占式 (同一时间只有一个协程有运行权) |
关系 | 进程、线程均可以有多个协程 | |
控制 | 不被内核管理, 完全由程序控制 | |
状态 | 能保留上一次调用时的状态 | |
资源 | 线程是被分割的CPU资源 | 协程是组织好的代码流程 线程是协程的资源 协程 不直接使用线程 协程直接利用的是 执行器关联任意线程或线程池 。 |
3)进程、线程的切换流程
- 切换
页表
以使用新的地址空间 - 切换
内核栈
和硬件上下文
进程两步都需要,线程只要第二步
4)并发、并行的区别
- 并发:一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。
- 并行:在同一时刻,有多个任务在执行。
5)进程通信方式
管道
:度慢,容量有限;信号
:可以在任何时候发给某一进程,而无需知道该进程的状态。Socket
:可用于不同机器间的进程通信
。但速度慢
。消息队列
:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题;信号量
:不能传递复杂消息
,只能用来同步;共享内存
- 映射一段能被其他进程所访问的内存,由一个进程创建,但多个进程都可以访问。
- 常与信号量等通信机制配合使用
6)进程、线程同步方式
临界区
:只能用来同步本进程内的线程
互斥量
:只有一个互斥对象
,拥有互斥对象的线程才具有访问资源的权限。信号量
:允许多个线程在同一时刻访问同一资源
,但是需要限制在同一时刻访问此资源的最大线程数目。- 适用于对 Socket: 套接字 程序中线程的同步
- 必须有公共内存,不能用于分布式操作系统
- 对信号量的操作分散
事件
:用来通知线程有一些事件已发生,从而启动后继任务的开始.
7)线程分类
内核级线程
依赖内核
,创建、撤销和切换都由内核实现。
用户级线程
- 不依赖于操作系统核心
- 应用进程利用线程库来完成其创建和管理,速度比较快,操作系统
内核无法感知用户级线程
的存在。
8)进程调度策略
先来先服务
:非抢占式的调度算法,按照请求的顺序进行调度。短作业优先
:非抢占式的调度算法,按估计运行时间最短的顺序进行调度。最短剩余时间优先
高响应比优先
优先级调度
时间片轮转
9)什么是临界区,如何解决冲突
临界区定义
每个进程中访问临界资源的那段程序
,一次仅允许一个进程使用的资源称为临界资源。
冲突解决办法
一次仅允许一个进程
进入空闲的临界区有限时间内退出
- 如果进程不能进入自己的临界区,则应
让出CPU
,避免进程出现“忙等”现象。
10)死锁
- 死锁:两个或多个进程无限期的阻塞、相互等待的一种状态。
产生的条件
互斥条件
:一个资源一次只能被一个进程使用请求与保持条件
:一个进程因请求资源而阻塞时,对已获得资源保持不放不剥夺条件
:进程获得的资源,在未完全使用完之前,不能强行剥夺循环等待条件
:若干进程之间形成一种头尾相接的环形等待资源关系
如何避免死锁
- 一次请求所有资源
- 顺序访问
- 主动释放锁
如何解决死锁
- 抢占资源
- 终止(或撤销)进程
- 终止所有的死锁进程
逐个终止进程
(采用最优策略来选择一个“代价最小”的进程)
2、内存管理
1)虚拟内存
- 使用
部分加载
的技术 - 具有
请求调入和置换功能
- 在逻辑上对内存容量进行扩充的存储技术
- 从而能够加载更多的进程,这部分内存包含了磁盘或者硬盘。
2)逻辑地址、虚拟地址(线性地址)、物理地址
-
逻辑地址:用来表示指令或是数据的地址。
硬件平台段式管理转换前地址
段标识符: 段内偏移量
-
虚拟地址:逻辑地址到物理地址变换之间的中间层。
硬件页式内存的转换前地址
线性地址 = 段基地址 + 段内偏移量
Linux中:逻辑地址与线性地址是一致的
-
物理地址
物理地址 = 页基地址 + 页偏移量
3)分页
- 分页系统:内存数据需要
两次内存访问
- 从内存中
访问页表
,从中找到指定的物理块号,加上页内偏移得到实际物理地址; - 根据第一次得到的物理地址
访问内存取出数据
。
- 从内存中
- 页表来记录映射关系,以实现从页号到物理块号的映射。
4)分段
- 满足一些逻辑需求
- 地址是二维的,一维是段号,二维是段内地址;
- 其中每个段的长度是不一样的
- 每个段内部都是从0开始编址的。
5)分页、分段的区别
分页 | 分段 |
---|---|
对程序员是透明的 | 需要程序员显式划分每个段。 |
一维地址空间 | 二维地址空间 |
页大小不可变 | 可以动态改变 |
主要用于实现虚拟内存 ,从而获得更大的地址空间 | 主要是为了使程序和数据可以被划分为逻辑上独立的地址空间,并且有助于共享和保护。 |
6)交换空间
当
内存资源不足
时,Linux把某些页
的内容转移至硬盘
上的一块空间上,以释放内存空间
。
硬盘上的那块空间叫做交换空间
(swap space),而这一过程被称为交换(swapping)。
物理内存和交换空间的总容量就是虚拟内存的可用容量。
7)页面替换算法
- 先进先出
FIFO
- 最近最久未使用
LRU
- 最近最少未使用
LFU
- 时钟算法
CLOCK
8)抖动
在请求分页存储管理中,从主存(DRAM)中刚刚换出(Swap Out)某一页面后(换出到Disk),根据请求马上又换入(Swap In)该页,这种反复换出换入的现象,称为系统颠簸,也叫系统抖动。
原因:分配给进程的存储块数量小于进程所需要的最小值
9)中断、轮询、异常
中断
程序执行过程中,遇到急需处理的事件
时,暂时中止CPU上现行程序
的运行,转去执行相应的事件处理程序,待处理完成后再返回原程序被中断处或调度其他程序执行的过程
中断是由系统中某事件引起
的,该事件与现行指令无关
-
时钟中断:靠
晶振
实现,频率恒定。- 维持系统时间
- 促使
环境的切换
,以保证所有进程共享CPU - 利用时钟中断进行
记帐
监督系统
工作- 确定未来的调度优先级
-
外中断:是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
-
内中断
:就是异常
,由CPU本身原因引起
。
异常
由于执行现行指令所引起
的。由于系统调用引起的中断
属于异常
轮询
系统定时对各种设备轮流询问一遍是否有处理要求
。有要求的,则加以处理。轮询占据了CPU相当一部分处理时间,是一种效率较低的 方式。
中断、轮询的区别
区别 | 中断 | 轮询 |
---|---|---|
CPU利用率 | 高 | 低 |
效率 | 高 | 低 |
问题 | 容易遗漏一些问题 | 等待时间长 |
3、文件管理
1)什么是缓冲区溢出?有什么危害?
-
缓冲区溢出是指当计算机向缓冲区
填充数据
时超出缓冲区本身容量
,溢出数据覆盖在合法数据上
。 -
危害:
- 程序崩溃,导致拒绝服务
- 跳转并且执行一段恶意代码
-
主要原因:程序中没有仔细检查用户输入。
2)磁盘调度算法
- FCFS:
先进先出
- SSTF:
最短寻道时间优先
。可能会出现饥饿现象 - SCAN:
扫描算法
- C-SCAN:
循环扫描算法
4、I/O管理
1)IO多路复用(Linux环境)
用户空间 / 内核空间
内核空间
:最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)。- 可以访问受保护的内存空间
- 也有访问底层硬件设备的所有权限。
用户空间
- 较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
进程切换
- 定义:挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。
- 包含的操作
- 保存处理机上下文,包括程序计数器和其他寄存器
- 更新PCB信息
- 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列
- 选择另一个进程执行,并更新其PCB
- 更新内存管理的数据结构
- 恢复处理机上下文
进程阻塞
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态
。
文件描述符
索引值,指向内核为每一个进程所维护的该进程打开文件的记录表
。
缓存I/O
数据会先被拷贝到操作系统 内核的缓冲区
中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
IO多路复用:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力。
阻塞IO、非阻塞IO
- 阻塞IO:发起一次IO操作后
一直等待成功或失败之后才返回
,在这期间程序不能做其它的事情。 - 非阻塞IO:发起IO时,通过对文件描述符
设置 O_NONBLOCK flag
来指定该文件描述符的IO操作为非阻塞。
select缺点
select会等待多个I/O事件(比如读就绪,写)的任何一个发生
只要有一个网络事件发生,select线程就会执行
。
如果没有任何一个事件发生则阻塞。
- 单个进程所打开的
FD是有限制的
,通过FD_SETSIZE 宏定义,大小不可改变(限制为1024) - 每次调用select,都需要把fd集合从
用户态拷贝到内核态
,在fd很多时开销很大
- 对socket扫描时是线性扫描,采用
轮询
的方法,效率较低
(高并发时)
poll缺点
- 没有fd的限制,其它基本一样
epoll
- epoll
只能在linux下
工作 - 水平触发LT是
默认模式
,边缘触发ET是“高速”模式
。- LT:只要fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作
- ET:只会提示一次,直到下次再有数据流入之前都不会再提示了,无论fd中是否还有数据可读。所以在ET模式下,read一个fd的时候一定要
把buffer读完
,或者遇到EAGAIN
错误
select、poll、epoll区别
2)零拷贝
mmap内存映射
- 采用操作系统中的底层内存映射方式:
调用Linux mmap()实现
的。
- 采用操作系统中的底层内存映射方式:
sendfile
- Sendfile With DMA Scatter/Gather Copy
- splice