进程分类:
1. 交换式进程 interactive processes
交互式进程是经常与用户进行交互,因此需要花很多的时间等待键盘和鼠标操作,当接受输入后,进程必须被很快唤醒,不然就会出现系统反应迟钝。典型的交互式程序是SHELL命令、文本编辑和图像应用程序
2. 批处理进程 batch process
不必与用户交互,经常在后台运行的程序,这样的程序不必很快的响应,典型的应用是,数据库索引引擎和科学计算等等。
3.实时进程 real-time processes
需要快速的响应能力,响应变化很小,不会被低优先级的进程阻塞,典型的应用程序为视频、音频以及需要实时收集数据的程序。
调度器: 进程管理子系统的核心功能 专为进程调度
有这样一种情况
为了描述一个数据的特征,进程查看需要知道进程名,进程号,由哪个进程启动的,打开哪个文件,子进程号 ,与共享资源等等。在操作系统上有N个进程同时运行
对内核来说如何识别每一个进程呢? 所以我们要用一个数据结构来描述这些特征,存储一个进程的这些信息叫做数据结构表,每一个结构体在32位系统中占17K 用于描述一个进程的状态信息,所有 的进程组合起来,就形成链表,这个链表是一个双向链表 ,当我们创建新进程的时候就是实现在现有的连接中插入或添加一个条目,当然这个过程比我们描述的远远要复杂
内核2.6 以后引入了 O(1) 调度器
O(1) |O(log n) | O(n) | O(n^2) | O(2^n)
衡量算法 / 队列的关系
随机挑一个 执行程序长短的对应关系
调度器 随着队列长度的增加 随机挑选出一个时间长度的变化
O(1) 最大的缺点 完全平均 浪费执行时间
O(1)算法 每一次扫描 140次 调用一个执行
active活动队列 等待执行
按照进程优先级分组 级别最高开始运行 L0
Deadline 死亡期限 维护3个队列
新增一个队列 里面增加一个死亡期限 倒数死亡计时器交互式进程应用 最佳应用于数据库 仅仅是参照
O(1) 调度算法 最常见的是 CFS 完全公平算法
为每一个进程分配一个 时间占用比例
进程调度策略:
静态优先级: 数字越小 优先级越高
0-99, 100-139
动态优先级 只能调整 100--139 调整后表现为NICE值调整
1--140
实时调整优先级状态
120--> 120(interactive) --> 115, NICE(-5)
nice值:
-20-19
100-139
实时优先级 : 数字越大优先级越高
0--99
调度策略:
SCHED FIFO [1-99]
SCHED_RR 轮询 不能用RR调度
posix :SCHED_NORMAL other(100-139) 调度传统常见的分时的进程 /动态优先级 CFS
SCHED_FIFO 先进先出
chrt -f [1-99] /path/to/program arguments
SCHED_RR 时间片轮转
chrt -r [1-99] /path/to/program arguments
查看CPU性能:
1.平均负载 进程个数 同时等待超过3就是CPU速度慢了
2.CPU利用率
w
过去一分钟内的平均长度
uptime
top
yum install sysstat
sar -q 1 2 每一秒中取一次 一个取两次vmstat 1 5 正在队列中执行的个数
查看利用率
mpstat
sar -P ALL 1
CPU 缓存是如何实现的:
类别:
直接映射
完全附属缓存:
yum install x86info
x86info
valgrind --tool=cachegrind ls
多个CPU访问均衡:
ps axo comm,pid,psr | grep httpd
实现进程与CPU绑定:
taskset -c -p CPU list PID
isolcpus=cpu nmuber..
调度域:
将进程绑定到指定的CPU上
CPU --> 指定在调度域中
调度域会指派到CPU中 运行完后 就把进程放在后续态中
一个cpu集合表示一个调度域
numa 调度域中还可以由子调度域
Create a mount point at /cpus
Add an entry to /etc/fstab
cat mems
echo 0 > mems
echo 6918 tasks
echo 6918 > tasks
cat tasks
cat cpu_exlusive 该cpu是否属于多个调度域/子域
0 ;不独占
1 :cpu唯一属于这个域
cpuset