优先级

语法分析器原理简介

China☆狼群 提交于 2020-02-22 23:57:46
语法分析器原理简介 上下文无关语法(CFG) 为描述程序设计语言语法,传统的解决方案是使用上下文无关语法(Context Free Grammar, CFG)。对于语言L,其CFG定义了表示L语言中有效语句的符号串的集合。语句即是从语法规则G中推导出的一个字符串。 上下文无关语法G是一组规则,描述了语句是如何形成的。可以冲G导出的语句称为G定义的语言,记作 L ( G ) L(G) L ( G ) 。上下文无关语法定义语言的集合称为上下文无关语言的集合。 几个重要的概念: 产生式:CFG中的每个规则都称为一个产生式 非终结符:语法产生式中使用的语法变量 终结符:出现在语句中的单词。单词包含了一个词素(Lexeme)及范畴(Syntactic Category)。在语法中,单词通过其语法范畴表示。 推导:一系列重写步骤,从语法的起始符号开始,结束于语言中的一个语句。 在原型符号串中,我们选择一个非终结符 α \alpha α ,并选择一个语法规则 α → β \alpha \rightarrow \beta α → β ,然后将原型符号串中的 α \alpha α 重写为 β \beta β 。我们会重复这个重写过程,直至原型符号串不包含非终结符为止,此时它完全有单词(或称终结符)组成,已经变为语言中的一个语句。 在推导过程中的每一个点上,该符号串都是终结符和非终结符的一个集合

Java-多线程

为君一笑 提交于 2020-02-22 17:22:44
概念 进程具有自己变量的完备集;线程则共享相同的数据。 抢占式调度:直接中断而不需要实现和 被中断程序 协商 协作式调度:只有在被中断程序同意交出控制权之后才能执行中断 多线程实现 方法一: class MyRunnable implements Runnable { public void run() { ... } } Runnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); 方法二(不建议): class MyThread extends Thread { public void run() { ... } } Thread t = new MyThread(); t.start(); Thread类 sleep(t):static|线程暂停t毫秒,暂停当前线程的活动,会抛出 InterruptedException void run() void start() static Thread currentThread():返回代表当前执行线程的Thread对象 void interrupt():发送中断请求给一个线程,中断状态为true,如果线程当前被sleep调用阻塞,则抛出InterruptedException boolean isInterrupted(): 检查线程是否被终止

linux 进程调度1

余生颓废 提交于 2020-02-21 19:13:02
调度策略与调度类 进程分为实时进程和普通进程,分别对应实时调度策略和普通调度策略 在 task_struct 中,有一个成员变量,我们叫调度策略 unsigned int policy; 它有以下几个定义: #define SCHED_NORMAL 0 #define SCHED_FIFO 1 #define SCHED_RR 2 #define SCHED_BATCH 3 #define SCHED_IDLE 5 #define SCHED_DEADLINE 6 配合调度策略的,还有我们刚才说的优先级,也在 task_struct 中 int prio, static_prio, normal_prio; unsigned int rt_priority; 实时进程,优先级的范围是 0~99;对于普通进程,优先级的范围是 100~139。数值越小,优先级越高 实时进程的调度策略: SCHED_FIFO、SCHED_RR、SCHED_DEADLINE 普通进程的调度策略:SCHED_NORMAL、SCHED_BATCH、SCHED_IDLE 代码实现: 在 task_struct 里面,还有这样的成员变量: const struct sched_class *sched_class; 调度策略的执行逻辑,就封装在这里面 stop_sched_class

css day(1) 选择器

夙愿已清 提交于 2020-02-21 19:09:40
文章目录 1.1 引入外部css 1.2 元素的分类 1.3 常用选择器 1.4 选择器分组 1.5 元素之间的关系 1.6 伪类 1.7 伪元素 1.8 属性选择器 1.9 其他元素选择器 1.10 兄弟元素选择器 1.11 伪类元素选择器 二、选择器优先级 2.1 样式的集成 2.2 选择器的优先级 2.3 伪类的顺序 1.1 引入外部css <link href=""></link> 1.2 元素的分类 块级元素 一个元素单独占一行,且不会给里面的元素设置任何样式。 内联元素 会有一定的样式,内联元素不是单独占一行。 <a.>标签能包含任何元素,除了他自己。<p>标签不能包含块级元素。 1.3 常用选择器 id class 1.4 选择器分组 用逗号隔开,表示一个组的 #a1,.a2,h1{......} 统配选择器 *{....} 复合选择器 span.p3{......} 选中span标签中类名包含p3的元素 后代元素选择器 子元素选择器 div > span{.....} 1.5 元素之间的关系 父,子,祖先,后代,兄弟元素 1.6 伪类 表示一个标签的不同状态 以超链接为例子 :link 未访问过 :vistied 访问过(只能设置颜色) :hover 鼠标移入 :active 被点击 :focus 获取焦点(比如输入框) :before 元素前 :after 元素后

java线程详解二

依然范特西╮ 提交于 2020-02-21 04:30:33
线程的优先级 线程调度:按照特定的机制为线程分配CPU的时间片段的行为,java程序再运行的时候,由java虚拟机负责线程的调度 线程调度的实现方式:1、分时调度,2、抢占式调度 分时调度:指让所有线程轮流获取CPU的使用权,并为每个线程平均分配CPU的时间片段 抢占式调度:指选择优先级较高的线程执行,如果所有的线程优先级相同,则会随机选择一个线程执行,java虚拟机正是采用这个调度模式。 线程优先级范例一: 1 public class ThreadTest5 { 2 3 public static void main(String[] args) { 4 5 Thread th = new Thread(new Runnable() { 6 @Override 7 public void run() { 8 9 for (int i = 0; i <100 ; i++) { 10 11 System.out.println(Thread.currentThread().getName()); 12 } 13 14 15 } 16 }); 17 th.setPriority(1);//设置该线程的优先级 18 th.start();//开启这个线程,并执行run方法 19 System.out.println(th.getPriority());//获取该线程的优先级 20 21

linux调度

一个人想着一个人 提交于 2020-02-20 18:06:16
调度的基本数据结构 1.每个cpu都有自己的一个struct rq, 里面有一个实时进程的struct rt_rq 和一个普通进程的struct cfs_rq。 在调度时,调度器首先会先去实时进程队列找是否有实时进程需要运行,如果没有才去CFS运行队列找是否有进程需要运行。 2.普遍进程的cfs_rq 定义如下 这里面的rb_root指向的就是红黑树的根节点,这个红黑树在CPU看起来就是一个队列,不断的取下一个应该运行的进程。 rb_leftmost指向的是最左面的节点 3.调度队列——红黑树,调度实体 完全公平调度算法CFS,CFS会为每一个进程安排一个虚拟运行时间vruntime。如果一个进程在运行,随着时间的增长,进程的vruntime将不断增大,但没有得到执行的进行vruntime将不变。 显然,那些vruntime少的,原来受到了不公平的对待,需要给它补上,所以会优先运行这样的进程。 高低优先级怎么处理?优先级其实就是一个数值,对于实时进程,优先级的范围是0-99;对于普通进程,优先级的范围是100-139.数值越小,优先级越高。 在计算vruntime的时候有一个公式 权重和nice数值有关系,nice越小权重就越大, NICE_0_LOAD是nice为0时的权重。所以从这个公式我们可以看出,高优先级(即nice值小的)的进程vruntime加的会少

linux 查看系统资源使用信息的一些命令集合

痴心易碎 提交于 2020-02-20 10:47:19
linux上的进程查看及管理工具: pstree,ps,pidof,pgrep,top,htop,glances,pmap,vmstat,dstat,kill,pkill,job,bg,fg,nohup,nice,renice,killall。。。 linux开机时,会启动第一个进程,由这个进程去启动别的进程,这个第一个进程在centos5,6,7上实现的都不一样。 centos5:Sysv init:串行通过脚本去启动别的进程,速度慢 centos6:upstart:参考ubuntu的upstart,并行启动脚本,速度快 centos7:systemd:参考mac启动的过程,速度更快 这个第一个进程:/sbin/init 在centos7上执行pstree:可以看到父进程是systemd # pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─2*[VBoxClient───VBoxClient] ├─2*[VBoxClient───VBoxClient───{VBoxClient}] ├─VBoxClient───VBoxClient───2*[{VBoxClient}] ├─VBoxService───7*[

数据结构_队列结构_优先级

五迷三道 提交于 2020-02-20 09:33:31
class priorityElement { constructor (elem, priority) { this.elem = elem this.priority = priority } } class priorityQueue { constructor () { this.items = [] } enqueue (elem, priority) { let priorityElem = new priorityElement(elem, priority) let flag = true if (!this.isEmpty()) { for (let i = 0; i < this.size(); i++) { if (priorityElem.priority < this.items[i].priority) { flag = false this.items.splice(i, 0, priorityElem) break; } } if (flag) this.items.push(priorityElem) }else { this.items.push(priorityElem) } } isEmpty () { return this.items.length <= 0 } size () { return this.items.length } }

优先队列+结构体 设置优先级

偶尔善良 提交于 2020-02-20 02:08:17
今天写了几个优先队列的题目 涉及到设置优先级 就去现学了一点 我还不是很熟悉 就先记录下基础模板吧 等学会了重载运算符再细细总结 #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<queue> #include<vector> #include<map> #include<stack> #include<algorithm> #define ll long long using namespace std; const int N=6e4+100; struct node { int val; int num; friend bool operator <(const node &a,const node &b) {///记得这个比较和逻辑是相反的 if(a.val==b.val) return a.num>b.num; else return a.val<b.val; } }; int main() { int n; while(~scanf("%d",&n)) { priority_queue<node>pq[4]; char ope[10]; int id; int cnt=0; for(int i=1;i<=n;i++) { getchar(); scanf("%s

FreeRTOS——支持时间片

北慕城南 提交于 2020-02-19 13:42:51
所谓时间片就是同一个优先级任务下可以有多个任务,每个任务轮流的享有相同的CPU时间,享有CPU的时间我们叫做时间片。在RTOS中,最小的时间单位是一个tick,即 SysTick 的中断周期。对于FreeRTOS,时间片只能是一个tick。与其说FreeRTOS支持时间片,倒不如说他的时间片就是正常的任务调度。 一、原理分析 之 所 以 在 同 一 个 优 先 级 下 可 以 有 多 个 任 务 , 最 终 还 是 得 益 于taskRESET_READY_PRIORITY()和taskSELECT_HIGHEST_PRIORITY_TASK()这两个函函数的实现方法。接下来我们分析下这两个函数是如何在同一个优先级下有多个任务的时候起作用的。 系统在任务切换的时候总会从就绪列表中寻找优先级最高的任务来执行,寻找优先级最高的任务这个功能由taskSELECT_HIGHEST_PRIORITY_TASK()函数来实现,该函数在task.c 中定义。 taskSELECT_HIGHEST_PRIORITY_TASK ()函数 # define taskSELECT_HIGHEST_PRIORITY_TASK()\ {\ UBaseType_t uxTopPriority;\ /* 寻找就绪任务的最高优先级 */ \ ( 1 ) portGET_HIGHEST_PRIORITY (