进程,
资源分配
的最小单位。线程,
调
度的最小单位
进程四要素:有一段程序可供执行,有专用的内核空间堆栈,有一个task_struct数据结构(进程控制块),有独立的用户空间
有用户空间:
用户线程。无用户空间:
内核线程
task_struct结构:
pid_t pid 进程号
进程状态:
TASK_RUNNING 执行或就绪状态
TASK_INTERRUPTIBLE 可中断阻塞,等待资源唤醒,或中断唤醒
TASK_UNINTERRUPTIBLE 不可中断阻塞,不能被中断或信号唤醒
TASK_STOPPED 终止状态,接收到SIGSTIOP/SIGTSTP进入该状态,接收到SIGCONT后唤醒
TASK_KILLABLE 不可中断睡眠,可被SIGKILL唤醒
TASK_TRACED 调试状态
TASK_DEAD 进程退出
EXIT_ZOMBIE 僵死状态,进程已死亡,但父进程还没收集到结束信息
EXIT_DEAD 最终死亡状态,资源被回收
进程描述:struct mm_srtuct *mm 进程用户空间描述指针,内核线程该指针为空
unsigned int policy 进程调度策略
int prio 优先级,数值越大优先级越小。
int static_prio 静态优先级
struct sched_rt_entity rt 时间片
调度:从就绪的进程中选出最适合的一个来执行。调度策略,调度时机,调度步骤
调度方式:主动式,内核直接调用schedule(),进程需要等待资源,主动要求系统调度
抢占式,用户抢占(2.4和2.6内核) 从内核空间返回用户空间时,发生用户抢占
内核抢占(2.6内核)
在支持内核抢占的系统中,有下列情况不可抢占
内核正在进行中断处理,内核正在进行中断上下文处理,进程持有spinlock自旋锁、以及读写锁,内核正在执行调度
抢占式内核使用变量preempt_count,称为内核抢占计数,他设置在进程的thread_info结构中,内核进入以让状态后preempt_count会加1,退出后会减1
调度流程:清理当前进程,选出下一个进程,设置新进程运行环境,进程上细纹切换
系统调用:一般情况下用户进程不能访问内核空间的,系统调用除外。linux还提供了一些库函数来对系统调用进行封装
系统调用
工作原理;应用程序将一个适当的值填人寄存器,然后调用一个特殊指令跳转到内核某一固定位置,内核根据填充的数据来调用函数
适当的值:在unist.h中为每一个系统调用设一个编号,系统调用号
特殊的指令:在intel中由中断0x80实现,ARM中由SWI实现
固定的位置;在ARM体系中,应用程序跳转到固定内核位置ENTRY(vector_swi)
相应的函数:根据系统调用号,从系统调用表sys_call_table找到对应函数
增加系统调用
添加新的内核函数
更新头文件unist.h
更新系统调用表calls.s