首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式,进程简析

嵌入式,进程简析

进程,

资源分配

的最小单位。线程,

度的最小单位


        进程四要素:有一段程序可供执行,有专用的内核空间堆栈,有一个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
继承事业,薪火相传
返回列表