linux系统编程
2021-01-12 14:29:25 0 举报
AI智能生成
linux系统编程
作者其他创作
大纲/内容
高级进程管理
进程调度
多任务操作系统
协同式
进程会一直运行到自己结束,其他进程才能再处理器运行
抢占式 主流
内核会给所有就绪的进程分配一个时间片,进程消耗完时间片,内核会挂起该进程,开始运行另一个进程
固定时间片
问题:时间片大小合理分配各系统期望不一致
即使存在优先级,优先级低的进程只需要等待优先级高的进程消耗完时间片就有机会执行
所有进程都必须运行
完全公平调度器
公平入队,对竞争进程采取公平访问资源的策略
给每个进程分配了处理器的时间比例,优先级调整比例,把该比例划分固定的周期
该周期即目标延迟,调度延迟
最小粒度
任一进程所运行的时间长的基准值
进程分类
I/O约束性进程
多数时间处于阻塞状态等待资源的进程,阻塞后越快被唤醒,就可以调度越多的I/O
发起或等待文件或网络I/O
阻塞键盘输入
等待用户移动鼠标
处理器约束性进程
一直消耗完所有可用时间片的进程,消耗调度器分配的全部cpu
时间局部性原理,最大化缓存命中率
区别:其相应最佳调度器的行为不同
让出处理器
支持进程主动让出处理器,并通知调度器选择新的进程来运行
Thread.sleep(0)
处理器亲和力
多cpu
如果一个进程曾在某一个cpu上运行,后面在运行时,调度器尽量把它放到同一个cpu上
避免处理间的进程迁移带来新能损失
进程不能再访问缓存数据
原处理器缓存中的数据必须标记无效
缓存效应
每个处理器的缓存是独立的,互不相同,多处理器间缓存不共享
任意数据仅在一个处理器的缓存中有效(假设该数据有缓存)
缓存读入新的一块内存数据时会标记其他缓存无效
缓存读入新的一块内存数据时会标记其他缓存无效
硬亲和力
期望进程绑定到特定处理器
实时系统调度策略
先进先出策略
无时间片
只要没有更高的优先级进程,就会一直运行
进程阻塞后,调度器会将其一处队列,重新就绪时,会被插到相同优先级的进程队列末尾
轮询策略
给每个轮询类型的进程分配一个时间片
轮询类型的进程消耗完时间片,调度器会把该进程放到其所在优先级队列的末尾
普通调度策略
所有普通类的进程的静态优先级为0
任何一个FIFO或轮询类型的进程都会抢占它们
批调度策略
系统中没有其他就绪的进程时才会运行
线程
概念
二进制程序
保存在存储介质上的程序,以给定操作系统和计算机体系结构可访问的格式编译生成,可以运行但未开始
进程
操作系统对运行的二进制程序的抽象,包括:加载的二进制程序、虚拟内存、内核资源如打开的文件、关联的用户等
分配资源
线程
进程内的执行单元,线程是操作系统调度器可以调度的最小执行单元
线程切换,保存当前线程的执行指令位置,以及数据,切换回去,程序计数器恢复线程执行
资源有限,需要操作系统调度分配
jvm起一个线程需要从用户态(jvm)切换到内核态系统调用开启系统线程,需要大约1M的资源
纤程
指令寄存存+存线程临时数据栈
线程里面的线程,jvm内部模拟的轻量级线程
不经过操作系统,jvm分配控制
为啥效率高
jvm控制,不用经过切换到内核态
切换到内核态申请系统调用0x80中断
1.app发出0x80中断或者调用系统sysenter原语
2.os进入内核态
3.在中断向量表中查找处理的例程
4.保存硬件现场 CS IP等寄存器的值
5.保存程序现场 堆栈和寄存器的值
6.执行中断例程system_call
根据参数与编号寻找对应的例程
执行并返回
7.恢复现场
8.返回用户态
9.程序继续执行
Fiber,java第三方类库,字节码代理
一般用在回调函数,异步编程
Callable+Future
Guava扩展的ListenableFuture
RxJava响应式编程
Quasar库 (java agent)
程序本质
一堆指令+一堆数据
线程执行指令的位置
cpu 寄存器
数据存在内存 堆栈
虚拟内存
和进程相关,与线程无关
每个进程有独立的内存空间,进程中的所有线程共享这份空间
虚拟处理器
和线程相关,与进程无关
每个线程都是可独立调度的实体,支持单个进程每次“处理”多个操作
多线程
并发性
线程数小于处理器数量时,可以同时运行多个线程
提高响应能力
单线程的进程,一个长时间运行的任务会影响应用对用户输入的响应,导致应用看起来“僵死”
多线程,至少有一个线程可以响应用户输入并执行其他操作
I/O阻塞
单线程,I/O阻塞会影响整个进程
多线程,一个线程因为I/O阻塞,其他线程可以继续执行
上下文切换
同一个进程中的线程切换代价要小于进程间的线程切换
线程模式
每连接对应每线程
事件驱动模式
并发性、并行性和竞争
并发性
两个或多个线程可以在重叠的时间周期内执行
并发是在一段时间内宏观上多个程序同时运行,多个任务之间是互相抢占资源的
并行性
可以同时运行两个或多个以上的线程
并行是在某一时刻,真正有多个程序在运行,多个任务之间是不互相抢占资源的
0 条评论
下一页