- 进程和程序区别(所含区域,所含内容不同)
程序:指令集+数据,程序装入内存后就可以运行了:在指令指针寄存器的控制下,不断的将指令取至CPU运行。
进程实体由三个独立的部分组成:(1)正文段(text):存放被执行的机器指令。这个段是只读的(所以,在这里不能写自己能修改的代码),它允许系统中正在运行的两个或多个进程之间能够共享这一代码。
(2)用户数据段(user segment):存放进程在执行时直接进行操作的所有数据,包括进程使用的全部变量在内。
(3)系统数据段(system segment):该段有效地存放程序运行的环境。事实上,这正是程序和进程的区别所在。
- 程序,进程与线程:程序>进程>线程
Linux中没有的线程是由进程来模拟实现的(又称作:轻量级进程)
进程是资源管理的最小单元,是处于执行期的程序
线程是程序执行的最小单元,是进程中活动的对象
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.
内核调度的对象是线程,而不是进程
#创建进程的步骤:
申请空白PCB(进程控制块);
为新进程分派资源;
初始化PCB;
将新进程插入就绪队列;
- 新创建的进程与父进程关系:
fork()函数
(1)运行相同的代码
a) 代码段相同
b) 其他数据是否都相同?副本
c) 地址空间是否相同?不同
(2)运行另一个程序
d) 拷贝或共享打开的文件、文件系统信息、信号处理函数、进程地址空间和命名空间等。所有各个进程之间不同的信息,都拷贝出来以便自己修改。 - 写时拷贝
a) 传统的fork()系统调用直接把所有的资源复制给新创建的进程,这种实现简单且效率低下,因为拷贝的数据也许并不共享。
b) 如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。
c) 写时拷贝(copy-on-write)是一种可以推迟甚至免除拷贝数据的技术,先让父进程与子进程共享同一份拷贝。
d) 只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。
e) 实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。 - Linux的0号进程、1号进程的名称与作用
idle进程(PID = 0):没事闲逛的0号进程,idle进程由系统自动创建, 运行在内核态
init进程(PID = 1)从无到有诞生的第一个线程,执行cpu_idle()函数(省电又少热);
既是内核线程也是1号用户进程的init。init进程诞生后就不愿意死亡了,它创建和监控操作系统外层所有进程的活动; - 什么是僵死状态?
Linux中子进程运行直至其终止,它立即从内存中移除,但进程描述符仍然保留在内存中(进程描述符占有极少的内存空间);
一个进程的僵死状态存在于其终止到父进程调用 wait 等函数这个时间的间隙,一般很快就消失; - 进程处于僵死状态时,是由什么进程来处置?
子进程的状态变成EXIT_ZOMBIE,并且向父进程发送SIGCHLD 信号,父进程此时应该调用 wait() 系统调用来获取子进程的退出状态以及其它的信息;在wait 调用之后,僵尸进程就完全从内存中移除; - 进程的结构体里包含了哪些亲属关系?
Linux的进程PCB里要记录的亲属关系有父进程、养父进程、兄弟进程、最小的儿子进程; - 等待队列中的进程处于什么状态?
等待队列中的进程处于睡眠状态; - 为什么使用等待队列的时候要用lock自旋锁?
防止资源被被别的进程使用 - 内核线程与普通进程的区别
内核线程运行在内核态,经常在后台进行操作,通过内核线程完成,可以被调度,也可以被抢占。
普通进程就是资源管理的最小单元,是计算机中的程序关于某数据集合上的一次运行活动
内核线程没有独立的地址空间(实际上指向地址空间的mm指针被设置为NULL);它们只在内核空间运行,从来不切换到用户空间去。 - 什么是CPU消耗型、IO消耗型进程?
CPU消耗型——大部分时间用在使用CPU进行计算,通常计算时间长(算术运算,数据处理)
IO消耗型——大部分时间消耗在I/O请求和等待I/O上,真正使用CPU的时间很少(vim,shell,跟人交互的进程)
CPU消耗型:优先级低,时间片短
IO消耗型:优先级高,时间片长 - 进程调度算法要考虑的因素以及要实现的几个互相冲突的目标?
因素:
面向用户
周转时间=结束时间-提交时间
响应时间=等待时间+运行时间
截止时间(实时,暂不讨论)
优先权准则
避免饿死:
面向系统
吞吐量:使单位时间内处理的进程数量尽可能多。
利用率:使CPU保持忙碌状态,即总是有进程在CPU上运行。
各类资源的平衡利用(暂不讨论):保证每个进程得到合理的CPU时间
目标:
1、进程响应时间尽可能快;
2、后台作业的吞吐量尽可能高;
3、尽可能避免进程的饥饿现象;
4、低优先级和高优先级进程的需要尽可能调和 - 哪几种进程调度算法?
时间片轮转调度算法 (分时系统)
优先权调度算法
多级反馈队列调度
实时调度 - 进程调度的时机?
进程状态转换的时刻:进程终止、进程睡眠
进程运行需要等待某种资源或等待其他进程的运行而转入等待时
运行态进程在程序执行完毕后用do-exit()终止进入僵死态
处于等待状态的进程被重新唤醒变成运行态
当前进程的时间片用完时;
设备驱动程序运行时;
从内核态返回到用户态时; - 时间片的分配是否可以动态调整?什么是静态优先级和动态优先级?
Nice值 静态优先级
反应一个进程优先级状态的值
取值范围是 -20 ~ 19, 默认0,40个级别
nice值越小,优先级越高,获得处理器时间越长
Priority 动态优先级
优先级值,数值越小优先级越高
linux上实现了140个优先级范围,取值是从0~139
0 ~ 99表示实时进程;100 ~ 139表示非实时进程 - Linux进程调度的三种类型
将进程用优先级队列连起来
通过遍历来查找优先级最高的进程——O(n)
大内核锁BKL ( Linux 2.6.39 开始正式彻底踢出内核),内核不允许抢占 - CFS调度算法与基于时间片的调度算法的区别及其优点
公平调度CFS:允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,不再采用分配给每个进程时间片的做法。
区别:没有直接分配时间片到进程,而是将处理器的使用比例划分给了进程,进程所获得的处理器时间其实是和系统负载密切相关的。
当一个进程进入可运行态,是否被准许投入运行时,时间片的调度算法是看进程优先级以及是否还有剩余的时间片,而CFS是处理器消耗使用比
优点:nice值对时间的作用不再是算术加权,而是几何加权。能确保给每个进程公平的处理器使用比,CFS调度算法近乎完美。 - Linux调度器有哪几类?
Linux调度器:主调度器、周期性调度器 - 调度器类的种类?
当前内核支持两种调度器类:CFS,RT
支持5种调度策略:
SCHED_nomal:CFS
SCHED_batch:适合批处理
SCHED_idle:CFS
SCHED_RR:RT
SCHED_FIFO:RT