精华内容
下载资源
问答
  • Ucos操作系统任务优先级分配原则

    千次阅读 2019-08-12 12:24:16
    ucos操作系统任务的优先级使用一个8位整型数据来表示的。比如我们的0,1,2,3这些数,UCOS任务优先级的取值范围为 0 - OS_LOWEST_PRIO之间,数字越小,优先级越大。 静态优先级  这个优先级被分配以后,它在任务...

    ucos是一个可剥夺性内核的操作系统。所以每一个任务都必须有一个优先级。ucos操作系统中任务的优先级使用一个8位整型数据来表示的。比如我们的0,1,2,3这些数,UCOS任务优先级的取值范围为 0 - OS_LOWEST_PRIO之间,数字越小,优先级越大。
    静态优先级
      这个优先级被分配以后,它在任务的运行过程中,或者说在这个系统的运行过程中,它的优先级就不能变了,比如说,我们把这个优先级分配为2,那这个任务在运行过程中就一直为2,没办法变成其他的优先级。
    动态优先级
      在任务的运行过程中,它本身是2这个优先级,但是在运行过程中,它还可以变成3,变成4,变成n这个数,那这个过程就被称为动态优先级,也就是说这个优先级在系统的运行过程中,会出现一个可以变化的过程,ucos是一个支持动态优先级的一个系统,也就是说,我们的ucos可以在系统运行的过程中,来更改一个任务的优先级,这点我们需要注意。
      对任务优先级分配首先需要做的有哪些事情呢?
      假设系统中有1,2,3,4,5,这5个任务,第一个任务对我们开关的输入信号进行扫描,第二个任务处理我们的按键,第三个任务处理我们的串口通信,第四个任务进行我们的系统逻辑处理,比如我们的开关量输出,第五个任务运行我们的LCD屏显示,假设我们对这5个任务分配优先级怎么分配呢?
      第一个我们必须把前3个任务的分配优先级要比后两个要高,为什么呢?
      因为从逻辑上来说,我们是首先进行开关量扫描,进行按键处理,进行串口通信,接下来,才进行逻辑处理,因为在逻辑处理当中,我们有可能用到开关量扫描,按键处理,和串口等等这些信息,所以说我们分配优先级的时候前3个任务的分配优先级要比后两个要高,对于这个输出和LCD屏显示,我们来看看这两个怎么处理,首先一般来说LCD屏显示是一个比较缓慢的过程,因为LCD屏显示是一个慢速的设备,那第四个逻辑处理和开关量输出运行速度比较快,那我们就把第四个的优先级要比第五个的高一点,那也就是说,对于一个任务,它运行的时间越短,分配的优先级越高,这是为什么呢?
      非常简单,因为我们刚刚说了ucos是一个可剥夺性内核,也就是说,如果有高任务在运行,那么这个低任务它是没办法运行的,那如果这个任务占用的时间比较少,我们就把它放到一个较高的任务上,那它就能很快的执行完毕,这样我们的CPU就可以较快的执行一些其他的任务了,这个是我们在使用优先级分配的一个问题,优先级的分配不是那么容易的,我们对一个比较好的操作系统要好好来考虑这个优先级的分配,如果优先级的分配的不好,就可能出现——优先级反转。
    任务优先级分配的原则
      1、对于实时性要求高的任务应该分配较高的优先级。
      比如我们刚刚举例的串口运行任务,我们都知道当串口接收到一个数据以后,它需要在一定的时间内把这个数据处理完,并且返回到上位机,上位机是不可能一直等待这个数据的,所以说我们对这个串口的执行它就有一个时间的要求,也就是实时性要求较高,那对于这个任务,我们就要分配一个较高的优先级。
      2、对于运行速度较快的任务应该分配较高的优先级。
      3、任务在逻辑之前的要分配较高的优先级。
    就是我们刚刚说的,我们首先是扫描开路,扫描按键,接下来我们才能进行逻辑的处理。所以说我们的扫描开路,扫描按键要比逻辑处理的优先级要高,否则的话,我们还没有进行开关量扫描,已经开始处理逻辑了,这个时候,就发生了一个错误。

    展开全文
  • Linux是一个多用户多任务的操作系统

    万次阅读 2016-04-24 15:25:01
    Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。  操作系统管理多个用户的请求和多...
    Linux是一个多用户多任务的操作系统。多用户是指多
    个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。
    
       操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主存,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当您提出一个请求时,给您造成一种假象,好象系统只被您独自占用。而实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户作业、操作系统任务、邮件和打印作业等。操作系统根据每个任务的优先级为每个任务分配合适的时间片,每个时间片大约都有零点几秒,虽然看起来很短,但实际上已经足够计算机完成成千上万的指令集。每个任务都会被系统运行一段时间,然后挂起,系统转而处理其他任务;过一段时间以后再回来处理这个任务,直到某个任务完成,从任务队列中去除。
    一,进程及作业
       Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理守护进程,都可以称之为进程。Linux用分时管理方法使所有的任务共同分享系统资源。我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。
       进程的一个比较正式的定义是∶在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的,进程不是程序,虽然它由程序产生。程序只是一个静态的指令集合,不占系统的运行资源;而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而且一个程序 可以启动多个进程。
       进程和作业的概念也有区别。一个正在执行的进程称为一个作业,而且作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。
       作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立 作业间进行切换。
       例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。
    二,启动进程
       键入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程。启动一个进程有两个主要途径∶手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。
    1,手工启动
       由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为前台启动和后台启动。
       前台启动是手工启动一个进程的最常用的方式。一般地,用户键入一个命令“ls -l”,这就已经启动了一个进程,而且是一个前台的进程。这时候系统其实已经处于一个多进程状态。或许有些用户会疑惑∶我只启动了一个进程而已。但实际上有许多运行在后台的、系统启动时就已经自动启动的进程正在悄悄运行着。还有的用户在键入“ls -l”命令以后赶紧使用 “ps -x”查看,却没有看到ls进程,也觉得很奇怪。其实这是因为ls这个进程结束太快,使用ps查看时该进程已经执行结束了。
       直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。
    2,调度启动
       有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这一切工作。要使用自动启动进程的功能,就需要掌握以下几个启动命令。
    第一个重要的命令是at命令
       用户使用at命令在指定时刻执行指定的命令序列。也就是说,该命令至少需要指定一个命令、一个执行时间才可以正常运行。at命令可以只指定时间,也可以时间和日期一起指定。需要注意的是,指定时间有个系统判别问题。比如说∶用户现在指定了一个执行时间∶凌晨3:20,而发出at命令的时间是头天晚上的20:00,那么究竟是在哪一天执行该命令呢?如果用户在3:20以前仍然在工作,那么该命令将在这个时候完成;如果用户3:20以前就退出了工作状态,那么该命令将在第二天凌晨才得到执行。下面是at命令的语法格式∶
       at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间
       at -c 作业 [作业...]
       at允许使用一套相当复杂的指定时间的方法,它可以接受在当天的 hh:mm(小时:分钟)式的时间指定。如果该时间已经过去,那么就放在第二天执行。当然也可以使用 midnight(深夜), noon (中午), teatime(饮茶 时间,一般是下午 4点)等比较模糊的词语来指定时间。用户还可以采用12小时计时 制,即在时间后面加上AM (上午)或者 PM (下午)来说明是上午还是下午。也可以指定命令执行的具体日期,指定格式为 month day (月 日)或者 mm/dd/yy(月/日/年)或者 dd.mm.yy (日.月.年)。指定的日期必须跟在指定时间的后面。
       上面介绍的都是绝对计时法,其实还可以使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为∶now + count time-units ,now就是当前时间,time-units是时间单位,这里可以是 minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。
       还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。下面通过一些例子来说明具体用法。
       [例] 指定在今天下午 5:30 执行某命令。假设现在时间是中午12:30,2001年2月24日,其命令格式如下∶
       at 5:30pm
       at 17:30
       at 17:30 today
       at now + 5 hours
       at now + 300 minutes
       at 17:30 24.2.99
       at 17:30 2/24/99
       at 17:30 Feb 24
       以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误的情况发生,例如上例可以写成∶
       at 17:30 2/24/99
       这样非常清楚,而且别人也看得懂。
       对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者。在7月31日上午10点执行文件work中的作业。
       在任何情况下,超级用户都可以使用这个命令。对于其他用户来说,是否可以使用就取决于两个文件∶ /etc/at.allow 和 /etc/at.deny 。
    cron命令
       前面介绍的两条命令都会在一定时间内完成一定任务,但是要注意它们都只能 执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,一切就结束了。但是在很多时候需要不断重复一些命令,比如∶某公司每周一自动向员工报告头一周公司的活动情况,这时候就需要使用cron命令来完成任务了。实际上,cron命令是不应该手工启动的。cron命令在系统启动时就由一个shell脚本自动启动,进入后台(所以不需要使用&符号)。一般的用户没有运行该命令的权限,虽然超级用户可以手工启动cron,不过还是建议将其放到shell脚本中由系统自行启动。
       首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中 的用户名命名的crontab文件,被找到的这种文件将载入内存。例如一个用户名为foxy的用户,它所对应的crontab文件就应该是/var/spool/cron/foxy。也就是说,以该用户命名的crontab文件存放在/var/spool/cron目录下面。cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入“休眠”状态,释放系统资源。所以该后台进程占用资源极少。它每分钟“醒”过来一次,查看当前是否有需要运行的命令。命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户。上面简单介绍了一些cron的工作原理,但是cron命令的执行不需要用户干涉;需要用户修改的是crontab中要执行的命令序列,所以下面介绍crontab命令。
    crontab命令
       crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是 说,用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的时间。然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入∶crontab test.cron。
       这样一个crontab 文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab文件。
       在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个 域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下∶
       minute hour day-of-month month-of-year day-of-week commands
       第一项是分钟,第二项是小时,第三项是一个月的第几天,第四项是一年的第几个月,第五项是一周的星期几,第六项是要执行的命令。这些项都不能为空,必须填入。如果用户不需要指定其中的几项,那么可以使用*代替。因为*是统配符,可以代替任何字符,所以就可以认为是任何时间,也就是该项被忽略了。
    进程的挂起及恢复命令bg、fg
       作业控制允许将进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复 后将从中止处开始继续运行。只要在键盘上按ctrl+z,即可挂起当前的前台作业。 在键盘上按ctrl+z后,将挂起当前执行的命令cat。使用jobs命令可以显示 shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。恢复进程执行时,有两种选择∶用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。 灵活使用上述命令,将给自己带来很大的方便。
    进程查看
       由于Linux是个多用户系统,有时候也要了解其他用户现在在干什么,同时 Linux是一个多进程系统,经常需要对这些进程进行一些调配和管理;而要进行管理,首先就要知道现在的进程情况∶究竟有哪些进程?进程情况如何?等等。所以需要进程查看方面的工作。
    who命令
       该命令主要用于查看当前在线上的用户情况。这个命令非常有用。如果用户想 和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。
    w命令
       该命令也用于显示登录到系统的用户情况,但是与who不同的是,w命令功能更 加强大,它不但可以显示有谁登录到系统,还可以显示出这些用户当前正在进行的工作,并且统计数据相对who命令来说更加详细和科学,可以认为w命令就是who命令的一个增强版。w命令的显示项目按以下顺序排列∶当前时间,系统启动到现在的时间,登录用户的数目,系统在最近1秒、5秒和15秒的平均负载。然后是每个用户的各项数据,项目显示顺序如下∶登录帐号、终端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。其中JCPU时间指的是和该终端(tty)连接的所有进程占用的时间。这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间。而PCPU时间则是指当前进程(即在WHAT项中显示的进程)所占用的时间。
    ps命令
       ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
       ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。
    ps [选项]
       下面对命令选项进行说明∶
       -e显示所有进程。
       -f全格式。
       -h不显示标题。
       -l长格式。
       -w宽输出。
       a显示终端上的所有进程,包括其他用户的进程。
       r只显示正在运行的进程。
       x显示没有控制终端的进程。
       O[+|-] k1 [,[+|-] k2 [,…]] 根据SHORT KEYS、k1、k2中快捷键指定的多 级排序顺序显示进程列表。对于ps的不同格式都存在着默认的顺序指定。这些默 认顺序可以被用户的指定所覆盖。其中“+”字符是可选的,“-”字符是倒转指 定键的方向。
       最常用的三个参数是u、a、x.
    top命令
       top命令和ps命令的基本作用是相同的,显示系统当前的进程和其他状况;但是top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。比较准确的说,top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用。内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。
    三,进程调度
       当需要中断一个前台进程的时候,通常是使用Ctrl+c组合键;但是对于一个 后台进程恐怕就不是一个组合键所能解决的了,这时就必须求助于kill命令。该命令可以终止后台进程。至于终止后台进程的原因很多,或许是该进程占用的CPU时间过多;或许是该进程已经挂死。总之这种情况是经常发生的。
       kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送信号,那么默认值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用kill(9)信号了,该信号是不能被捕捉的。
       kill命令的语法格式很简单,大致有以下两种方式∶
       kill [-s 信号 | -p ] [ -a ] 进程号 ...
       kill -l [信号]


    本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u1/33664/showart_260494.html
    展开全文
  • 置顶/星标公众号,不错过每条消息! 很多朋友长时间使用裸机编程,切换过来学习RTOS,就对其中很多概念产生了误解。1写在前面大部分人开始学习RTOS实时操作系统时...

    置顶/星标公众,不错过每一条消息!640?wx_fmt=png

        很多朋友长时间使用裸机编程,切换过来学习RTOS,就对其中很多概念产生了误解

    1写在前面

    大部分人开始学习RTOS实时操作系统时,对RTOS中的一些概念都不太理解。


    一上来就是临界段、调度、信号量、互斥锁等这些概念,相信大部分都是是懵的。


    我想说,不太懂这些概念很正常,一下子懂了,我倒反而觉得不正常。



    2什么是多任务

    这里大部分人应该都是从裸机阶段过来的,裸机系统一般也称之为单任务系统、轮询系统前后台系统


    这个概念相信大家都能明白,轮询就是在一个大while循环里执行。前后台系统就是在执行while时,有中断(前台)响应的系统。

    int main(void)	
    {	
      /* 初始化 */	
      while(1)	
      {	
        /* 循环处理多项事情 */	
      }	
    }

    那么,什么是多任务呢?

    当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一件任务提供服务

    因为任务调度机制保证不同任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。

    ---来自百度百科

    初学者可以理解为:有类似上面的多个轮询系统


    如下代码,将大while中的多项事情,分为几个事情,分别处理

    void Task1(void)	
    {	
      /* 初始化 */	
      while(1)	
      {	
        /* 处理事情1 */	
      }	
    }	
    
    	
    void Task2(void)	
    {	
      /* 初始化 */	
      while(1)	
      {	
        /* 处理事情2 */	
      }	
    }

    这里就要牵涉到各个任务之间的切换:任务调度

    3任务调度

    说任务调度之前,先说一插曲:

    我开始学RTOS时,觉得CPU这么短时间(1ms)在各个任务之间来回切换,而且切换还需要执行那么多代码,这样CPU还能执行多少代码啊?

    其实,我当时太低估了处理器的能力。

    拿STM32F103跑72M来说,1ms时间可以执行的代码有多少,你们心里有概念吗?

    沿着这个问题,大家深思,其实都能明白,区区那切换(任务调度)的代码对于CPU速度来说,可以忽略(当然,这个相对)。


    任务调度

    任务调度可以分抢占调度和轮询调度


    在RTOS中,为了使任务得到实时响应,一般使用抢占调度方式,我们拿UCOS为例:

    640?wx_fmt=png

    你会发现只程序执行过程中,如果有高优先级任务带来,高优先级任务就会打断低优先级任务。


    直到高优先级任务执行完,低优先级任务才得到相应。


    这里有人可能会问:如果高优先级一直,或者长时间执行可以吗?

    答案是:NO


    这里就关系到任务优先级分配,以及任务设计问题。


    一般来说,高优先级任务是在等待一个事件的触发,执行一件紧急,而不会太耗时的事情


    太耗时任务一般留给低优先级任务,在系统不忙时慢慢处理。



    640?wx_fmt=png

    调度过程

    我们设置系统滴答为1ms时间,那么系统就会间隔1ms检查一次就绪任务中优先级更高的任务。


    这个1ms滴答是由定时器中断产生,一般像在STM32由内核滴答定时器产生。


    如上图,他在(2)的位置就检测到有更高优先级任务(7)就绪,此时就会跳转到任务(7)去执行。


    推荐阅读:

    1.STM32的SysTick时钟源来自哪里?

    2.精选汇总文章2019-03-30

    4最后

    我的知乎:strongerHuang

    我的网站:www.strongerhuang.com

    若觉得文章对你有帮助,随手点“在看、转发分享,也是我继续更新的动力。

    扫描下面二维码、关注公众号,在底部菜单中查看更多精彩内容!

    640?wx_fmt=jpeg

    长按识别图中二维码关注

    展开全文
  • 如何设计一个分布式定时任务系统

    千次阅读 2019-06-04 14:34:00
    1、定时任务指定集群中的台机器执行 2、如何修改cron参数,且修改永久有效 当然直接用quartz来实现肯定最棒,但设计的配置太多,小公司没那个需求; 关于第1,我开始选择得做法是: 读取zk固定节点path的值...

    以前在美团有crane可用,现在得自己考虑以下两种场景了:

    1、定时任务指定集群中的一台机器执行

    2、如何修改cron参数,且修改永久有效

    当然直接用quartz来实现肯定最棒,但设计的配置太多,小公司没那个需求;
    关于第1个,我开始选择得做法是:

    读取zk固定节点path的值:
    若值为空,当前机器A写入自己的ip到path下,并获得执行资格;
    若值不为空,且值==A的ip,获得执行资格;
              且值 !=A的ip,放弃执行;

    这种做法缺点是:若拥有执行资格的机器挂了,它并不会清除zk上的操作记录,将导致其他机器也无法执行;

    解决方案:写入zk的值,改为ip+当前日期(根据定时任务的执行频率来判断需要写入:年、月、日、时、分、秒),若拥有执行权利的机器挂了,那么它不会再写入新的日期到zk中,其他机器在读取zk这个path值的时候,虽然发现已经有值,但是值中的日期并不是当天的,那么其可以修改值为自己的ip+日期,并获得执行资格;

    关于第2个,我开始选择得做法是:
    定时任务实现SchedulingConfigurer接口,关于此接口的详细可以百度搜搜;

    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TriggerContext;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;
    
    @Component
    public class DynamicScheduledTask implements SchedulingConfigurer {
      private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    
      private static final String DEFAULT_CRON = "0/5 * * * * ?";
      private String cron = DEFAULT_CRON;
    
    
      @Override
      public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(new Runnable() {
          @Override
          public void run() {
             // 定时任务的业务逻辑在此执行
        System.out.println("动态修改定时任务cron参数,当前时间:" + dateFormat.format(new Date()));
          }
        }, new Trigger() {
          @Override
          public Date nextExecutionTime(TriggerContext triggerContext) {
        // 定时任务触发,可修改定时任务的执行周期
        CronTrigger trigger = new CronTrigger(cron);
        Date nextExecDate = trigger.nextExecutionTime(triggerContext);
        return nextExecDate;
          }
        });
      }
    
      public void setCron(String cron) {
        this.cron = cron;
      }
    }

    新增一个restful接口用于修改cron:cron通过参数传递,想怎么改怎么传

    @Autowired
    DynamicScheduledTask dynamicScheduledTask;
    
    // 更新动态任务时间
    @RequestMapping("/updateDynamicScheduledTask")
    @ResponseBody
    public String updateDynamicScheduledTask(@RequestParam("cron") String cron) {
      dynamicScheduledTask.setCron(cron);
      return "ok";
    }

    但这种做法的缺点是:项目如果重启了,那么设置的值又变成默认的了,达不到永久生效的效果;

    解决方案:还是需要把cron的获取逻辑通过固定的查询逻辑来显示,比如zk,在提供一个restful接口用于修改zk路径下的cron值

    总结:以上还只是考虑最基本的两个要求,没有好的中间件,自己来造轮子,肯定还是不方便的,效果也不好~

    @Scheduled(cron="0/10 * *  * * ? ")   //每10秒执行一次  
    
    @Scheduled(cron = "0 0/10 * * * ?") // 每10分钟执行一次

    很迷茫是不是?

    进入正题:如何设计一个分布式定时任务系统?

    首先,我们我们考虑下传统定时任务存在的问题以及分布式定时任务系统需要考虑的因素:

    1. 只在一台服务器上执行,存在:单点风险、资源分配不均衡、服务器负载能力有限;
    2. 通过zk、数据库等进行任务属性配置、任务的分配,但操作困难,增加运维成本;
    3. 通过全局“锁”互斥执行:解决多节点重复执行任务

    一个好的分布式定时任务系统需要考虑哪些因素(也是任何分布式系统需要考虑的因素):

    1. 高可用性:集群部署,避免单点风险;
    2. 可伸缩性:支持弹性伸缩,可以动态增加、删除节点;
    3. 负载均衡:避免一台机器负载过高,而其他机器一直空闲;
    4. 失效转移:任务都可以持久化到数据库或者文件系统,避免宕机导致的数据丢失,有完善的任务失败重试机制和详细的任务追踪及告警策略

    对于分布式定时任务系统来说,最重要的是分布式锁,实现方式有三种:

    1. 基于数据库的实现方式:唯一索引原理,比如一个定时任务一天执行一次,我们就以日期作为唯一索引,谁第一个把当天日期插入成功,谁就有资格执行;
    2. 基于Redis的实现方式:https://blog.csdn.net/zhengchao1991/article/details/87558948
    3. 基于zk的实现方式:https://blog.csdn.net/zhengchao1991/article/details/86509986
       

    TODO

     

     

     

     

     

    展开全文
  • 或者说还不到64,毕竟有ideal等一些系统已经占用的优先级,那么如果项目 比较大的话是不是就难以搞定了呢
  • 一个真实的系统中,客户端可以通过TCP 或者RMI 连接到集群中任何一个节点上,并提交一个任务,包括它自己。 当提交一个任务以后我们会产生一个随机的整数用来映射到集群中的某个节点上去,我们称其为秩。这个秩...
  • 任务操作系统

    千次阅读 2019-10-27 12:06:08
    单用户单任务操作系统是指一台计算机同时只能有一个用户在使用...Windows多任务处理采用的是虚拟机技术,为每一个任务分配短暂的时间片轮流使用CPU。 多任务操作系统在宏观上是并行的,微观上是并发的。 多任务操...
  • 写了一个图像识别程序,就是运行效率太低,想给程序分配更多的cpu时间让他运行快点。 那些大型游戏是采用什么机制能够占那么多的系统资源的?
  • EasyScheduler大数据调度系统架构分享 导语 EasyScheduler是易观平台自主研发的大数据分布式调度系统。主要解决数据研发ETL 错综复杂的依赖关系,而不能直观监控任务...任务调度系统在大数据平台当中是一个核心的...
  • 如何做好项目管理任务分配

    千次阅读 2017-04-26 14:11:12
    谁来撰写以及分配任务 如何有效地分配任务 项目管理工具在我工作的10多年中,使用过不少的项目管理系统,Excel, Microsoft Project, dotProject, Redmine, Jira, Teambition, Worktile, Tello…。比我谈过的女朋友还...
  • 实时操作系统任务调度

    千次阅读 2014-11-18 18:55:00
    最近看了一些实时操作系统的源码,关于任务调度是实时操作系统的重要组成部分,但是何时发生调度,怎样才能发生调度却不是非常的清晰,书中本而言所说的都是“如果有更高优先级任务就绪,就会发生调度”,这会让很...
  • 任务分配与负载平衡

    千次阅读 2016-12-28 14:29:57
    任务分配与负载平衡   6.1 任务分配 (task allocation) 若干个模块构成一个任务,一个任务是单一的处理实体。 任务分解:把一个提交的任务划分成若干个独立的,具有最小IMC的模型。 IMC:每对模块间的数据...
  • uCOS-II系统中的任务就绪表

    千次阅读 2017-08-30 00:31:10
    多任务操作系统的主要工作是为系统中处于就绪状态的任务分配CPU资源,其中涉及的两关键是:判断哪些任务处于就绪状态、确定哪个任务应该马上得到执行,即任务调度。1. 任务就绪表任务就绪表记录了系统中所有处于...
  • Quartz,水晶、石英,一个简单朴素有美丽的名字,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框架。 何为定时任务调度框架?简而言之,它可以...
  • 任务分配及管理

    千次阅读 2014-03-13 17:09:23
    工作感言:任务分配及管理  前面说到过,刚开始带小组,接到一个任务,我就估算了我大概要多少时间,然后小组多少个人就算是多少个我,估算时间=我要的总时间"小组人数(好笨的想法呀,不用时间跟组员交待任务的...
  • 浅谈实时操作系统任务调度

    千次阅读 2014-11-15 14:39:27
    一、1、 调度用来确定多任务环境下任务执行的顺序和在...调度程序本身并不是一个任务,是一个函数调用,可在内核的各个部分进行调用。  3、调用调度程序的具体位置又被称为是一个调度点(scheduling point),调
  • 多无人机(UAV)协同任务分配

    万次阅读 多人点赞 2019-03-22 13:33:53
    多无人机协同任务规划即是根据组特定条件的约束,以实现某个准则函数的最优或次优为目标,将某项作战任务分解成一些子任务分配给多无人机系统中的各个无人机分别去完成的过程。 通常多无人机任务规划可以分成两...
  • 这时,一个帮助你分配各个任务运行时间的操作系统就很有必要了。在操作系统中,任务一般形如: void check_serial_io_task (void) _task_ 1 { /* This task checks for serial I/O */ } void process_serial_...
  • 浅谈实时操作系统任务管理 和 调度

    千次阅读 2011-12-13 09:05:22
    浅谈实时操作系统任务管理   、任务管理机制 1、 任务管理用来实现对任务状态的直接控制和访问。 2、内核的任务管理是通过系统调用来体现,主要包括任务创建、任务删除、任务挂起、任务唤醒、设置...
  • OSAL多任务资源分配机制

    千次阅读 2012-10-30 17:17:20
    一、概述  OSAL (Operating System Abstraction Layer),翻译为“操作系统抽象层”。  在ZigBee协议中,协议...如果我们把一个应用程序对象看做为一个任务的话,那么应用程序框架将包含一个支持多任务的资源分配
  • UCOSIII的任务简介 在UCOSIII中任务是以何种面貌存在的呢? 在UCOSIII中任务就是程序实体,UCOSIII能够管理和调度这些小任务(程序)。UCOSIII中的任务由三部分组成:任务堆栈、任务控制块和任务函数。 任务堆栈...
  • 操作系统的主要任务

    千次阅读 2020-01-22 10:56:34
    操作系统(OS)是...(2)调配和分配系统的资源 (3)调度操作 1、 控制和管理系统行为 操作系统执行基本的任务,比如:识别来自键盘的输入,将输出结果发送给监视器,管理存储设备上的文件和文件夹,控制箱...
  • 分布式定时任务调度系统

    千次阅读 2017-01-15 14:39:58
    分布式定时任务调度系统
  • Linux系统任务、进程和线程总结

    千次阅读 2014-05-09 16:03:52
    Linux 就是一个支持多任务的操作系统(Windows也是多任务操作系统),比起单任务系统它的功能增强了许多。 多任务操作系统使用某种调度策略支持多个任务并发执行。事实上,(单核)处理器在某一时刻只能执行一个...
  • 任务分发系统gearman

    千次阅读 2013-07-30 16:59:03
    Gearman 是一个任务分发系统,它提供了一个分发框架,能够分发某类任务到更适合处理这类任务的服务器上去处理。并且,它支持任务并行处理、负载均衡以及多语言调用。它的适用范围很广,从高可用性的网站到透明的...
  • 操作系统任务、进程和线程总结

    千次阅读 2017-07-22 09:26:30
    linux 就是一个支持多任务的操作系统(Windows也是多任务操作系统),比起单任务系统它的功能增强了许多。  多任务操作系统使用某种调度策略支持多个任务并发执行。事实上,(单核)处理器在某一时刻只能执行...
  • 分布式场景下如何做定时任务,如何防止定时任务多服务器时的冲突?
  • 常规来说,当我们编制项目计划时,直接将资源分配人,但是实际业务中,可能需要将任务分配给科室/部门的某一个人(简称:任务负责人),再由这个人来二次分配任务,同时考虑到工作比较忙的缘由,可能一个部门/科室都...
  • 操作系统--存储管理的任务

    千次阅读 2015-06-05 23:01:27
    操作系统--存储管理的任务 存储管理的任务 存储管理一共有三存储管理任务: --存储分配 --地址映射 --存储保护 --存储共享 --存储扩充 存储分配分配基本内存空间 增加新的内存空间 回收内存...
  • 集群资源管理与任务调度系统综述

    千次阅读 2019-05-03 23:49:49
    0. 集群资源管理与任务调度系统出现的背景 (1)出现背景 信息技术快速发展,各行各业都慢慢于互联网进行深度融合,即所谓的“互联网+”。为了提供更好的服务以吸引更多的消费者进行更多维度的消费,各个互联网公司...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 518,158
精华内容 207,263
关键字:

一个系统任务是怎样分配的