这种问题就要和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. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_02-Eureka注册中心-搭建Eureka单机环境

    我们先搭建单机环境 govern是治理的意思, 这样就把工程创建好了 创建包 创建SpringBoot的启动类. 在父工程里面已经确定了Spring Cloud的版本了.相当于锁定了版本 接下里只需要 ...

  2. web手工项目01-系统组织框架-测试流程-需求评审-测试计划与方案

    回顾 SVN(定义,作用,使用操作) 软件缺陷(定义,表现形式,原因和根源,基本内容,跟踪流程) JIRA(基本介绍,使用者,工作流,问题,使用) 学习目标 掌握WAMP的环境搭建 掌握熟悉项目的步骤 ...

  3. kafka shell file

    1. start kafka and schema_registry #!/bin/sh export KAFKA_HOME=/home/lenmom/workspace/software/confl ...

  4. PAT 甲级 1033 To Fill or Not to Fill (25 分)(贪心,误以为动态规划,忽视了油量问题)*

    1033 To Fill or Not to Fill (25 分)   With highways available, driving a car from Hangzhou to any oth ...

  5. Node.js使用MySQL连接池示例

    下面是一个封装好的工具类: var fs = require('fs'); var mysql = require('mysql'); var pool = mysql.createPool({ ho ...

  6. SmartCode

    SmartCode(https://github.com/Ahoo-Wang/SmartCode) SmartCode = IDataSource -> IBuildTask -> IOu ...

  7. NASA HEG tool安装心得

    自从NASA对MRT工具停止支持后,这个工具的官网也随之打不开无法下载.处理数据当然还是需要官方的工具好一些. 现在NASA推荐使用HEG工具来处理MODIS系列产品,除此之外工具对ASTER, MI ...

  8. java基础系列(二):java数据结构及常用方法

    1.数组Array (1)创建数组 dataType[] arrayName = new dataType[length];必须指定大小,否则会报错:如果不想指定大小,应采用声明数组变量的方式 dat ...

  9. 提高.NET应用性能

    提高.NET应用性能的方法 写在前面 设计良好的系统,除了架构层面的优良设计外,剩下的大部分就在于如何设计良好的代码,.NET提供了很多的类型,这些类型非常灵活,也非常好用,比如List,Dictio ...

  10. Nginx+PHP(FastCGI)高性能服务器加载redis+memcache模块

    1)Nginx+FastCGI安装配置: yum install  openssl openssl-devel pcre-devel pcre zlib zlib-devel –y #下载Nginx源 ...