这种问题就要和ucos结合起来嘛。

程序和进程:

程序:存放在磁盘上的一些列代码和数据的可执行映像,是一个静止的实体。

进程:是一个执行中的程序,它是动态的实体。

linux进程的四要素:

1. 有一段程序供其执行。这段程序不一定是某个进程所专有,可以与其他进程共用。

2. 有进程专用的内核空间堆栈。

3. 在内核中有一个task_struct数据结构,即通常所说的“进程控制块”。有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。

4. 有独立的用户空间。

注:下图是根据用户控件去区分进程,用户线程,内核线程。

进程状态:

Ucos:

一个ucos进程有标准的三个状态:

Linux:

Linux的状态在基本的状态上又增加了几个:

1. TASK_RUNNING:进程正在被CPU执行,或者已经准备就绪,随时可以执行。当一个进程刚被创建时,就处于TASK_RUNNING状态。

2. TASK_INTERRUPTIBLE:处于等待中的进程,待等待条件为真时被唤醒,也可被信号或者中断唤醒。

3. TASK_UNINTERRUPTIBLE:处于等待中的进程,待资源有效时被唤醒,但不可以由其他进程通过信号或中断唤醒。

4. TASK_KILLABLE:linux2.6.25新引入的进程睡眠状态,原理类似于TASK_UNINTERRUPTIBLE,但是可以被致命信号(SIGKILL)唤醒。

5. TASK_TRACED:正处于被调试状态的进程。

6. TASK_DEAD:进程退出时(调用do_exit),所处的状态。

任务控制块:

Ucos:

通过os_tcb来控制任务状态。比较重要的数据结构有:指向任务堆栈栈顶的指针,OS_TCB双向链表的前后链接的指针,指向事件控制块的指针,指向邮箱的指针,指向事件标志节点的指针,就绪态标志,延时剩余节拍记录,任务状态字,任务优先级等等。

Linux:

Linux的进程,线程都使用task_struct来表示,他包含了大量进程/线程的信息,其中比较重要的有:

Pid_t pid;  //进程号

Long state;  //进程状态

Int prio;     //进程优先级

而在ucosii里,优先级就是进程的id了,最多有64个任务,最多有64个优先级,每两个任务的优先级都不相同。

调度策略:

Ucos:

ucos不支持时间片轮番调度法,应用程序中各任务优先级不能相同。

Linux:

先说一下普通进程优先级和实时进程优先级:进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。任何时候,实时进程的优先级都高于普通进程,实时进程只会被更高级的实时进程抢占,同级实时进程之间是按照FIFO(一次机会做完)或者RR(多次轮转)规则调度的。

Linux几种常见的调度策略:

vSCHED_NORMAL(SCHED_OTHER):普通的分时进程

vSCHED_FIFO :先入先出的实时进程

vSCHED_RR:时间片轮转的实时进程

vSCHED_BATCH:批处理进程

vSCHED_IDLE: 只在系统空闲时才能够被调度执行的进程

调度时机:

Ucos:

1. 中断返回。

2. 申请不到资源主动挂起。

3. 释放一个资源,比如信号量。

4. 主动时延。

注意:超时而继续的进程不会再次任务调度了,因为超时之后会进入就绪态,当它转换为运行态的时候就已经证明它是优先级最高而得到调度的了。

Ucos的任务调度可能会陷入优先级反转,高优先级任务的优先级会被拉低到占用资源的优先级,解决方式为提升占用资源任务的优先级,如果内核自动改变任务的优先级就叫优先级继承,ucos没有优先级继承的功能。

Linux:

Linux的抢占分为用户抢占和内核抢占。

用户抢占发生在:

1. 从系统调用返回用户空间。

2. 从中断处理程序返回用户空间。

内核抢占发生在:

1. 中断处理程序完成,返回内核空间之前。

2. 党内和代码再一次具有可抢占性的时候,如解锁及使能软中断等。

下列时机不允许发生抢占:

1. 内核正在运行中断处理。

2. 内核正在进行中断上线文的bottom half(中断的底半部)处理,硬件终端返回前会执行软中断,此时仍然处于中断上下文中。

3. 进程正持有spinlock自旋锁、writelock/readlock读写锁等,当持有这些锁时,不应该被抢占,否则由于抢占将可能导致其他进程长期得不到锁,而让系统处于死锁状态。

4. 内核正在执行调度程序Scheduler。抢占的原因就是为了进行新的调度,没有理由将调度程序抢占掉再运行调度程序。

调度步骤:

Ucos:

1. 保存当前寄存器。

2. 在当前任务控制块中保存当前任务的堆栈指针。

3. 寻找到最高优先级的任务。

4. 从新任务的堆栈恢复处理器所有寄存器的值。

Linux:

Schedule函数工作流程如下:

1). 清理当前运行中的进程;

2). 选择下一个要运行的进程;

3). 设置新进程的运行环境;

4). 进程上下文切换。

从linux和ucos的比较中来看进程这个概念的更多相关文章

  1. linux暂停一个在运行中的进程【转】

    转自:https://blog.csdn.net/Tim_phper/article/details/53536621 转载于: http://www.cszhi.com/20120328/linux ...

  2. Linux学习笔记12——Unix中的进程

    通过调用fork和exec函数都能创建新的进程,但两者有着本质的区别:fork函数拷贝了父进程的内存映像,而exec函数用用新的映像来覆盖调用进程的进程映像的功能. 一  fork函数 #includ ...

  3. node.js中process进程的概念和child_process子进程模块的使用

    进程,你可以把它理解成一个正在运行的程序.node.js中每个应用程序都是进程类的实例对象. node.js中有一个 process 全局对象,通过它我们可以获取,运行该程序的用户,环境变量等信息. ...

  4. [linux]top命令详解-实时显示系统中各个进程的资源占用状况

    简介 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按 ...

  5. 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...

  6. [转帖]C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义

    C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义 https://blog.csdn.net/willyang519/article/d ...

  7. Linux、JDK、Netty中的NIO与零拷贝

    一.先理解内核空间与用户空间 Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级分为4个,Linux 使用 Ring 0 和 Ring 3. 内核空 ...

  8. Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸.配图源 ...

  9. [Linux] Linux指令汇总(持续更新中...)

    写在前面: 以前真心没有玩过Linux系统,总感觉整天摆弄Linux的同学都是大牛.如今,在公司里实习需要远程登录Linux服务器,所有的代码都要在开发板上完成,所以被逼无奈也不得不定下心来好好学学L ...

随机推荐

  1. [Feature] Feature selection - Embedded topic

    基于惩罚项的特征选择法 一.直接对特征筛选 Ref: 1.13.4. 使用SelectFromModel选择特征(Feature selection using SelectFromModel) 通过 ...

  2. nginx多个if条件并且查询

    set $flag 0; if (!-e $request_filename){    set $flag "${flag}1"; } if ($uri ~* "^(.* ...

  3. Redis高级功能 - 慢查询日志

    转自 https://segmentfault.com/a/1190000009915519

  4. 动态PHP电商网站伪静态的 Nginx反向代理Cache缓存终极设置

    转自: http://www.ttlsa.com/nginx/dynamic-php-nginx-cache/

  5. 第五章 编码/加密——《跟我学Shiro》

    转发地址:https://www.iteye.com/blog/jinnianshilongnian-2021439 目录贴:跟我学Shiro目录贴 在涉及到密码存储问题上,应该加密/生成密码摘要存储 ...

  6. python:python2与python3共存时,pip冲突,提示Fatal error in launcher: Unable to create process using '"d:\python27\python2.exe" "D:\Python27\Scripts\pip2.exe" '

    问题背景: 机器上同时装了python2.和python3后,导致只能用pip3了,使用pip2时提示:Fatal error in launcher: Unable to create proces ...

  7. 高级UI-DrawerLayout侧滑

    侧滑的方案有很多种,早期的开源SliddingMenu,以及后来的DrawerLayout以及NavigationView等都可实现侧滑效果,这里介绍的是DrawerLayout,下一节将介绍Navi ...

  8. tab页签

    <div class="fl" id="newsBox"> <div class="tab1 grayBar"> & ...

  9. 给引入页面的js和css资源加上版本号,防止浏览器缓存资源

    最近因为在做前端开发的相关工作,每次发布新版本以后,不到5分钟,测试童鞋一个接一个的抱怨说BUG根本就没有修改,这个时候你说的最多的话就是“清缓存!!清页面缓存!!你没有清缓存!!你清理了页面缓存就对 ...

  10. Spring jsp 验证 form:errors标签

    1 在model层添加验证规则 @NotNull @Size(min=2,max =30,message="姓名在2-30个字符之间") private String userna ...