精华内容
下载资源
问答
  • 日常任务优先级管理

    千次阅读 2016-07-12 15:32:39
    下面讲解一个我从知乎上看到方法,可以很快把任务排列出一个合理的先后顺序。假设有如下任务: 1、修复线上紧急Bug; 2、增加一个统计用户活跃次数的功能; 3、有个功能操作繁琐,体验较差,需要改善;

    作为一个开发人员,我们经常会接到一堆开发任务,这些任务常常表现的都很急,都需要尽快完成。但是我们精力是有限的,也不能像CPU那样并发执行任务,任务再多也只能一件一件的去做。那么,怎么对这些任务排序呢?下面讲解一个我从知乎上看到方法,可以很快把任务排列出一个合理的先后顺序。

    假设有如下任务:
    1、修复线上紧急Bug;
    2、增加一个统计用户活跃次数的功能;
    3、有个功能操作繁琐,体验较差,需要改善;
    4、用户定制功能;
    5、目前只支持支付宝,增加支持微信支付功能;

    第一步:任务名字简化,使用P1,P2,P3(P1最重要)标记任务的重要程度,并说明原因。
    1、紧急Bug:P1(影响用户使用,如果不修复,会导致用户流失)
    2、统计活跃次数:P3(并不是太紧急)
    3、简化操作:P2(能较大提高用户体验,目前也能正常使用);
    4、用户定制:P3(。。。)
    5、微信支付:P3(让用户支付更加方便,但是目前能正常支付)

    用图表表示出来如下:
    按照重要程度归类

    第二步:标记任务开发难度,使用D1,D2,D3(D1最容易实现)标记任务的开发难度,并说明原因。
    1、紧急Bug:D1(已经差到原因,修改比较容易)
    2、统计活跃次数:D1(写一个过滤器,拦截每个用户请求,做好记录即可)
    3、简化操作:D3(重新梳理操作流程,改动也较大);
    4、用户定制:D3(需求可能还有改变,定制内容较多,有些较为复杂)
    5、微信支付:D2(联系微信,调试支付接口)

    用图表表示如下:
    按照难度归类

    第三步:将重要程度(P序列)和难度程度(D序列)合并成一个表格,P作为纵向,D作为横向
    合并表格

    第四步:一般按照如下的开发顺序执行
    执行顺序

    这样分类后,就能知道应该按照什么顺序来做开发了。

    展开全文
  • 这里直接上结果测试结果:默认情况是触发时间先后顺序排列,触发时间比较前的先执行任务,但如果一个或多个任务同时在相同时间触发下,触发器设置优先级越高越先执行。如果优先级相同,则跟任务的存储方式有关,R...

    根据先前的概念简介可知,一个Job可以有多个相同或不同的Trigger触发,甚至是同时触发。不同的Job也可能同时触发。这时就出现了触发时间相同的触发器触发先后顺序问题,这就是触发器优先级要考虑的问题。这里直接上结果

    测试结果:

    默认情况是触发时间先后顺序排列,触发时间比较前的先执行任务,但如果一个或多个任务同时在相同时间触发下,触发器设置优先级越高越先执行。如果优先级相同,则跟任务的存储方式有关,RAMJobStore时与TriggerKey排序有关,即按触发器名的字母序;如果是JdbcStore则跟数据库查询的默认排序有关了。Trigger优先级默认为5,数值越大优先级越高。

    测试步骤:

    1、定义了3个任务,都是在17:12:00秒触发,优先级大小分别为10、100、1

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    测试结果为:SimpleJob数值最大,优先级最大,最先执行。

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    调换下优先级大小,FirstJob为1,SimpleJob为5,HelloJob为10。定点触发,结果是优先级最大的HelloJob最先执行。

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    2、优先级相同时,都设为5时,多测试几遍,FirstJob总是先执行。

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    代码参见

    查看Quartz调度线程可知,与触发器的存储方式有关。QuartzSchedulerThread定义了获取下一个触发器队列的方法。

    org.quartz.core.QuartzSchedulerThread#org.quartz.spi.JobStore.acquireNextTriggers(long, int, long)

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    如果是RAMJobStore,用TreeSet存储待触发的线程。Trigger类里定义了触发器时间比较器

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    可以看出,优先级按触发时间、优先级和TriggerKey(String的字母序)排序的。

    而JdbcStore可以看下Jdbc委托类,查看触发器查询语句

    org.quartz.impl.jdbcjobstore.StdJDBCDelegate

    d420fe90c89021d7cd9e7ff0bb5d2d2f.gif

    挑出触发器查询语句:

    select * from qrtz_triggers ORDER BY NEXT_FIRE_TIME ASC, PRIORITY DESC

    发现是按触发时间升序,优先级降序排列,如果都相同,采用数据库自己默认的排序了,跟具体的DB有关了。MySQL中SELECT 默认排序是按照物理存储顺序显示。

    Trigger可以定义一个优先级,默认为5。当多个trigger同时触发job时,线程池可能不够用,此时根据优先级来决定谁先触发。数值越大优先级越高。这个可以考虑为配置项,为优先执行的Trigger设置较大的优先级数值。

    所以所有获取待触发触发器列表,跟触发时间有关,其次是触发器优先级大小,最后是具体任务的存储方式有关。触发时间较前先触发,触发时间相同,触发器优先级大的先触发,如果触发器优先级相同,则看任务存储方式,若为内存存储,则与TriggerKey排序有关,即按触发器名的字母序,若为DB存储,则与DB默认排序规则有关。

    展开全文
  • 前言 工欲善其事必先利其器。 学习一点儿如何安排时间产出工作量的方法,对于生活也是很有必要的。...优先级排列不清晰是高效工作的主要威胁之一。这里做一点,那里做一点,但最后什么都没 ...

    前言

    工欲善其事必先利其器。
    学习一点儿如何安排时间产出工作量的方法,对于生活也是很有必要的。

    上一篇在这里单核工作法1
    原理1原理1
    原理23原理23
    原理45原理45
    单核5:适用性适用性
    单核6:颠倒优先级优先级
    单核7:全景闹钟全景闹钟
    单核8:小结单核8:小结

    chapter1 消减待办任务

    优先级排列不清晰是高效工作的主要威胁之一。这里做一点,那里做一点,但最后什么都没
    完成。如果一项任务完不成,那么对它付出的辛苦努力可能都会付之东流。在有太多任务要
    选择的时候,就没有办法排列清晰的优先级。
    我们必须学会定期删除待办清单中的任务。要从根本上解决问题,还应该切断任务来源。某
    些任务来源只会产生一些我们永远也不会去做的任务,必须停止关注它们。
    本章提出了快捷清单和除草等实用方法,强调必须按照重要程度而不是紧急程度排列优先
    级。此外,本章还给出了一些节省精力的技巧,包括减少任务流入,在一开始就对有些事情
    说“不”。

    一分钟:如何做到削减待办任务?

    五项基本概念

    ※ 忙碌谬论是一种迷信,认为手上的事情越多,人就越有价值。如果预先把日程表填得满
    满的,预料之外出现的重要任务就无法得到处理,你反而更容易成为其他人的瓶颈。

    ※ 快捷清单包含当前最重要的 5 项任务。每天早晨把它们写在一张纸上。如果还要添加更
    多的任务,必须去掉原有的——要么完成一项、要么直接删掉一项。

    ※ 本周目的把你的专注点放在“为什么”上。在这一周,你最想取得什么进展、得到什么收
    获、产出什么成果?把首要目的写入一张索引卡片,贴在工作间隔板上。每当迷茫的时候,
    本周目的可以提醒你。

    ※ 集草器清单收集一些未排序的任务和想法,都是你没有拒绝、但也不会马上做的事情。
    表格中的每项任务应该包括“目标、利益关系人、进入清单的日期”这三项属性。

    ※ 除草是删掉集草器清单里的内容,每个星期都要做。除草是一项必要工作,以便保持清
    单可读、及时、可靠。你随时都可以根据需要在集草器清单里增加内容,但应该每周做一次
    批量清理。

    问卷

    在开始脑力激荡之前,先找出你在现阶段工作当中经常遇到的“时间杀手”,给它们打钩。

    • 同时进行的工程太多
    • 利益关系人太多
    • 收到的电子信息太多
    • 老板提出的要求无法拒绝
    • 不敢叫停工程
    • 毫无准备的任务
    • 工作材料不全
    • 无权制定决策的会议
    • 目的不清楚
    • 追求短期成果
    • 交付周期太长
    • 书面工作没完没了
    • 持续的压力
    • 同事不可靠
    • 需求变来变去
    • 技术专家不负责任
    • 工作量暴增而能力跟不上
    • 工作分不出去
    • 危机式管理
    • 没有排列优先级

    黄瓜和洋蓟在商店门口相遇

    黄瓜:阿蓟,真高兴见到你。最近顺利吗?
    洋蓟:挺好的,谢谢关心。我在 8 个不同的工程里担任重要角色,另外自己也在做一些事,
    都是对公司未来意义重大的事情。
    黄瓜:如果你给这么多工程出力,那肯定有很多利益关系人感谢你吧?
    洋蓟:嗯,8 个工程各有各的项目经理,个个都想让我做他那块的事;而我更愿意花时间做
    我自己的事。
    黄瓜:意思是说,你成了公司的瓶颈?
    洋蓟:是啊,确实。尽管我熬夜干活,但还是根本赶不上交活的截止期限。同事都卡住了。
    黄瓜:卡在什么地方?
    洋蓟:他们没法继续工作,只能等我的结果出来。他们都在等我。
    黄瓜:听说过约翰 · 利特尔吗?
    洋蓟:约翰……什么?
    黄瓜:我认为,你如果要尽快交付,就别开那么多条线。
    洋蓟:你的意思是,我必须停止开始新任务,而且要开始完成老任务?
    黄瓜:是的。先选择最重要的一个工程,告诉另外 7 位项目经理,你把他们排在后面了。这
    样他们也可以另找有时间的人为他们工作。这对每个人来说都是最好的办法。
    洋蓟:听起来不错。我应该实行新政策,缩短待处理工程的队列,拒绝接新事情,并且把我
    做事的优先级告诉每个人。

    展开全文
  • vxworks优先级反转问题以及解决方法

    千次阅读 2013-11-17 22:27:09
    假设目前系统有三个任务,分别是high,medium和low,它们的优先级依次从高到低排列。如果没有竞争资源的话,系统会按照优先级的顺序执行三个任务,这也是我们最希望看到的情况。 存在以下情况的时候,就出现优先级...

    假设目前系统有三个任务,分别是high,medium和low,它们的优先级依次从高到低排列。如果没有竞争资源的话,系统会按照优先级的顺序执行三个任务,这也是我们最希望看到的情况。

    存在以下情况的时候,就出现优先级反转问题:

    1. high任务等待信号量sem,目前任务阻塞;
    2. medium任务在不停的执行;
    3. low任务只有信号量sem,但是由于优先级低于medium无法获得系统调度。

    这时就出现了high任务的优先级明明比medium高,但是却得不到调度。下图显示了发生优先级反转的问题。




    vxworks采用优先级继承的手段解决优先级反转问题,让进入临界区的任务临时的继承临界区任务中的最高优先级,这时low任务暂时获得了high任务的优先级,系统优先级反转的情况就消失了。在创建信号量时semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE),其中SEM_INVERSION_SAFE的目的就是让信号量继承任务的高优先级。


    下面用一个例子演示一下使用SEM_INVERSION_SAFE前后的效果。

    #include "taskLibCommon.h"
    #include "semLibCommon.h"
    
    SEM_ID mSemId;
    int count = 0;
    int lTask(){
    	TASK_DESC taskDesc;
    	printf("low Task\n");
    	semTake(mSemId, WAIT_FOREVER);
    	printf("low take the sem\n");
    	printf("sleep for 60s\n");
    	taskDelay(sysClkRateGet()*60);
    	taskInfoGet(taskIdSelf(), &taskDesc);
    	printf("low task current priority %d\n", taskDesc.td_priority);
    	semGive(mSemId);
    	printf("low release the sem\n");
    }
    int mTask(){
    	
    	printf("medium Task\n");
    	printf("take the cpu\n");
    	FOREVER
    	{
    		count++;
    	}
    }
    int hTask(){
    	printf("high Task\n");
    	semTake(mSemId, WAIT_FOREVER);
    	printf("high take the sem\n");
    	semGive(mSemId);
    	printf("high release the sem\n");
    }
    int fun2(int choice)
    {
    	if(choice)
    		mSemId = semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE);
    	else
    		mSemId = semMCreate(SEM_Q_PRIORITY);
    	taskSpawn("lTask", 150, VX_FP_TASK, 1024, lTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    }
    int fun3(){
    	taskSpawn("mTask", 130, VX_FP_TASK, 1024, mTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    	taskSpawn("hTask", 110, VX_FP_TASK, 1024, hTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    }
    

    在shell中输入fun2 1(使用优先级继承),可以从打印看出lTask任务暂时把自己优先级从150变为110,所以hTask任务得到了信号量,从打印也可以看到hTask任务执行结果,这样就避免了优先级反转问题。
    -> fun2 1
    value = 292520856 = 0x116f8398
    -> low Task
    low take the sem
    sleep for 60s
    
    -> 
    -> fun3
    value = 292537080 = 0x116fc2f8
    -> high Task
    medium Task
    take the cpu
    
    -> low task current priority 110
    high take the sem
    high release the sem
    


    在shell中输入fun2 0(未使用优先级继承),hTask执行处于pend(等待资源)状态。tw "hTask"命令查看hTask的状态,也可以看到hTask被阻塞在互斥信号量那里。
    -> fun2 0
    value = 292520856 = 0x116f8398
    -> low Task
    low take the sem
    sleep for 60s
    
    -> 
    -> fun3
    value = 292537240 = 0x116fc398
    -> high Task
    medium Task
    take the cpu
    
    -> i
    
      NAME         ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
    ----------  ------------ -------- --- ---------- -------- -------- ------- -----
    tJobTask    100794c0     103b6cb8   0 PEND       10118ff5 105bff38       0     0
    tExcTask    10078880     10199140   0 PEND       10118ff5 10199048       0     0
    tLogTask    logTask      103bac18   0 PEND       101174b2 105ffee8       0     0
    tNbioLog    1007a330     103bf188   0 PEND       10118ff5 1063fef8       0     0
    tShell0     shellTask    1051d1d8   1 READY      101204f0 1088fcb8   30065     0
    tWdbTask    wdbTask      1047e620   3 PEND       10118ff5 1083fee8       0     0
    ipcom_tick> 1012f920     1051e0b8  20 DELAY      1011e732 1077ff88       0     5
    tAioIoTask> aioIoTask    103da338  50 PEND       10119974 106bfd18       0     0
    tAioIoTask> aioIoTask    103dd770  50 PEND       10119974 106ffd18       0     0
    tNet0       ipcomNetTask 103dee90  50 PEND       10118ff5 1073ff18  3d0001     0
    ipcom_sysl> 10040de0     104100d8  50 PEND       10119974 107ffe48       0     0
    tAioWait    aioWaitTask  103d6e10  51 PEND       10118ff5 1067feb8       0     0
    hTask       hTask        116fc398 110 PEND       1011b5a5 1092ff50       0     0
    mTask       mTask        103ffc58 130 READY      108b0125 108effc8       0     0
    lTask       lTask        116f8398 150 DELAY      1011e732 107bff14       0  3135
    value = 0 = 0x0
    -> 
    -> tw "hTask"
      NAME       ENTRY       TID       STATUS   DELAY  OBJ_TYPE    OBJ_ID   OBJ_NAME
    ---------- ---------- ---------- ---------- ----- ---------- ---------- --------
    hTask      hTask      0x116fc398 PEND           0 SEM_M      0x103dfd08 N/A     
    
    
    Semaphore Id        : 0x103dfd08  
    Semaphore Name      : N/A       
    Semaphore Type      : MUTEX     
    Task Queuing        : PRIORITY  
    Pended Tasks        : 1         
    Owner               : 0x116f8398   (lTask)
    Options             : 0x1       SEM_Q_PRIORITY
    
    VxWorks Events
    --------------
    Registered Task     : NONE
    Event(s) to Send    : N/A
    Options             : N/A
    
    Pended Tasks
    ------------
       NAME      TID    PRI TIMEOUT
    ---------- -------- --- -------
    hTask      116fc398 110       0
    
    value = 0 = 0x0


    展开全文
  • TI-RTOS多任务编程

    2020-03-21 21:04:41
    最近在做一些关于一些驱动向TI板子的移植集成的事情,在这里简单的记录一下。本文主要叙述如何进行多任务的编程,以及我在编程中遇到的一些不解。 Task组成部分:任务函数,任务参数...优先级排列:硬中断HWI>...
  • [编程题]任务调度

    2021-04-29 10:18:37
    在优先队列里将前序任务数的任务优先级设定为较低值。对于输入的每一行,首先将当前行任务存入map中(如果是第一次出现),再将括号其后序任务存入map中(如果是第一次出现),并修改其前序任务数。 备注: priority...
  • UCOSii的优先级按倒叙排列,即优先级数值越低,对应的优先级越高。UCOSii支持64个任务,每个任务必须对应一个优先级。所以优先级数值范围:0~63。其中63号优先级优先级最低)分配给空闲任务,62号优先级分配给统计...
  • 欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 ...问在xi这个时间点时,所有正在工作的任务优先级从小到大排列,前ki个的优先级之和是多少。 强制在线。 N<=100 000,M&...
  • 进程统计项目 Description描述 Base Priority基本优先级 进程的基本优先级决定了这些进程在CPU的处理队列中的排列顺序。基本优先级由进程本身控制,而不是操作系统指定。操作系统设置、改变进程中线程的动态优先级。...
  • Staffan Nöteberg是畅销书《番茄工作法图解》的作者,本次演讲的主题为《Pixalut优先级方法——统筹安排,优化效率》,针对“如何排列任务优先级”这个话题进行了分享。\\Staffan出生在瑞典,常年生活在土耳其的...
  • 计划将来的LINUX任务

    2018-08-01 11:03:24
    计划将来的LINUX任务 使用at计划一次性任务 这不是单机工具,而是一个系统守护进程(atd),它有一组...atd守护进程提供了a到z共26个队列,作业按字母顺序排列,队列越后,系统优先级越低。 计划作业 使用命令...
  • linux中的计划任务

    2015-11-28 23:19:38
    atd守护进程提供了a到z共26个队列,作业按字母排列,越往后系统优先级越低 at <timespec> :计划新作业,at会随后读取从stdin执行的命令。对于较大的命令以及错别字敏感的命令,使用来自脚本文件的输入重定向比...
  • 假定:每个job 有优先级 ,和需要使用资源的时间长度当我们排列所有job之后,每个job都会有一个开始时间和结束时间,那么如何评定一个方案是不是好方案 ,/[ c_{i} /] 指的是任务最后完成时间 /[ \min \left( \sum...
  •  把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的
  • 作为一个合格程序员每天该做的事!...把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 633
精华内容 253
关键字:

任务优先级排列