优先级

进程优先队列

爱⌒轻易说出口 提交于 2020-02-09 11:37:18
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StackQueue.algo { //进程优先队列 public struct pqItem { //通常会把存储在优先队列中的数据项作为键值对来构造,其中关键字就是指优先级别,而值则用来识别数据项。 //例如,可以按照如下形式对一个操作系统进程进行定义: public int priority; public string name; }//public struct pqItem public class PQueue : Queue { //大家不能把未修改的 Queue 对象用于优先队列。 DeQueue 方法在被调用时只会把队列中的第一个数据项移除。 //但是,大家可以从 Queue 类派生出自己的优先队列类,同时覆盖 DeQueue 方法来实现自己的需求。 //大家把这个类称为 PQueue。所有 Queue 的方法都可以照常使用,同时覆盖 Dequeue 方法来移除具有最高优先 //级的数据项。为了不从队列前端移除数据项,首先需要把队列的数据项写入一个数组

基数排序

為{幸葍}努か 提交于 2020-02-09 03:28:32
基数排序 定义 基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。 算法描述 取得数组中的最大数,并取得位数; arr为原始数组,从最低位开始取每个位组成radix数组; 对radix进行计数排序(利用计数排序适用于小范围数的特点); 代码实现 #基于桶排序的基数排序 def radixSort ( list ) : d = len ( str ( max ( list ) ) ) for k in range ( d ) : #d轮排序 s = [ [ ] for i in range ( 10 ) ] #因为每一位数字都是0~9,故建立10个桶 for i in list : s [ int ( i / ( 10 ** k ) % 10 ) ] . append ( i ) list = [ j for i in s for j in i ] return list nums = [ 5 , 6 , 3 , 2 , 1 , 2 , 0 , 8 , 0 , 65 ] print ( radixSort ( nums ) ) 时间复杂度 时间复杂度 最优时间复杂度:O(n*k) 最坏时间复杂度:O(n*k) 稳定性

java学习笔记(四)-运算符

喜夏-厌秋 提交于 2020-02-09 01:31:55
java学习笔记(四)-运算符 文章目录 java学习笔记(四)-运算符 运算符 赋值,算术和一元运算符 简单赋值运算符 算术运算符 一元运算符 相等,关系和条件运算符 等价和关系运算符 条件运算符 类型比较运算符instanceof(及判断对象是否继承于父类) 按位和移位运算符 运算符摘要 简单赋值运算符 算术运算符 一元运算符 等于和关系运算符 条件运算符 类型比较运算符 按位和移位运算符 问题与练习:运算符 问题 运算符 运算符 是特殊的符号,它们对一个,两个或三个 操作数 执行特定的 运算 ,然后返回结果。 在我们探索Java编程语言的运算符时,可能有助于您提前了解哪些运算符具有最高的优先级。下表中的运算符按优先顺序列出。运算符越靠近表格顶部,其优先级越高。具有较高优先级的运算符将在具有相对较低优先级的运算符之前进行评估。同一行上的运算符具有相同的优先级。当相同优先级的运算符出现在同一表达式中时,必须控制一个规则,然后首先评估哪个规则。除赋值运算符外,所有二进制运算符均从左向右求值;赋值运算符从右到左求值。 运算符名称 操作符 后缀 *expr*++ *expr*-- 一元 ++*expr* --*expr* +*expr* -*expr* ~ ! 乘除 * / % 加减 + - 按位移 << >> >>> 关系 < > <= >= instanceof 平等 == !=

操作系统知识点

无人久伴 提交于 2020-02-08 23:45:52
操作系统是什么 管理计算机硬件与软件资源的程序,是计算机系统的内核与基石 本质上是运行在计算机上的软件程序 为用户提供一个与系统交互的操作界面 分为内核与外壳,其中内核是能操作硬件的程序,而外壳则是围绕着内核的应用程序 进程调度算法 根据系统资源分配资源所规定的资源分配算法 先来先服务调度算法 FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,直到完成或因某种原因而阻塞时才释放处理机。 不可剥夺算法。对长作业有利,对短作业不利。有利于CPU繁忙型作业,不利于I/O繁忙型作业 时间片轮转调度法 适用于分时系统 系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中第一个进程执行,即先来先服务的原则,但仅能运行一个时间片,如100ms。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被剥夺)处理机给下一个就绪的进程,而被剥夺的进程返回到就绪队列的末尾重新排队,等候再次运行。 时间片的大小对系统性能影响很大。如果时间片过短,则处理机在进程间过于频繁切换,处理机的开销增大;若过长,则退化为先来先服务算法 短进程优先调度算法 从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。 非抢占策略。但是长作业不利,不能保证紧迫性作业(进程)被及时处理

Java_多线程基础

馋奶兔 提交于 2020-02-08 12:44:54
自定义线程 实现方式 继承Thread类 实现Runnable 接口 继承Thread 类 继承Thread后,要重写run 方法 public void run 方法体 为该线程要执行的任务 启动线程的方法为 start() ,不是调用run() 调用run方法不能开启新的线程,只是普通的函数调用 线程的生命周期类只能被启动一次 public class xiancheng2 { public static void main(String[] args) { //创建对象 Myrun run1 = new Myrun(); //创建线程对象 Thread runTd = new Thread( run1 ); // 开启线程 runTd.start(); run1.say(); } } class Myrun extends Thread{ @Override public void run() { System.out.println("新的线程"); } public void say() { System.out.println( "美好的一天" ); } } 常用API String getName() 返回该线程的名称。 long getId() 返回该线程的标识符。 int getPriority() 返回线程的优先级。 Thread.State getState(

SpringIOC源码分析总结

社会主义新天地 提交于 2020-02-08 04:02:10
大致的加载过程: spring ioc容器的加载,大体上经过以下几个过程: 资源文件定位、解析、注册、实例化 1.资源文件定位:主要发生在ApplicationContext中,由于applicationContext继承于ResourceLoader,所以调用getResource()方法,将外部的资源解析成Resource类 2.解析:主要发生在BeanDefinitionReader中完成,最常用的类是XMLBeanDefiniationReader, ac利用loadBeanDefininiation()方法,负责读取Resource;将Resource的解析交给 XMLbeanDefiniationReader 去处理, 将XML文档解析成w3c的Document文档,BeanDefinitionDocumentReader进一步解析,BeanDefinitionDocumentReader将Document,交给 BeanDefiniationParserDetegate 去处理(装饰),如果是标准的NameSpace文档(import、alias、bean、beans),在内部解析,如果不是标准的文档,会委托合适的NameSpaceHander去处理进行解析,将结果封装到BeanDefiniationHolder

201771010123汪慧和《面向对象程序设计Java》第十六周实验总结

江枫思渺然 提交于 2020-02-08 03:19:54
一、理论部分 1、程序与进程的概念 ‐程序是一段静态的代码,它是应用程序执行的蓝本。 ‐进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。 ‐操作系统为每个进程分配一段独立的内存空间和系统资源,包括:代码数据以及堆栈等资源。每 一个进程的内部数据和状态都是完全独立的。 ‐多任务操作系统中,进程切换对CPU资源消耗较大。 2、多线程的概念 ‐多线程是进程执行过程中产生的多条执行线索。 ‐线程是比进程执行更小的单位。 ‐线程不能独立存在,必须存在于进程中,同一进程的各线程间共享进程空间的数据。 ‐每个线程有它自身的产生、存在和消亡的过程, 是一个动态的概念。 ‐多线程意味着一个程序的多行语句可以看上去几 乎在同一时间内同时运行。 ‐线程创建、销毁和切换的负荷远小于进程,又称为轻量级进程(lightweight process)。 3、Java实现多线程有两种途径: ‐创建Thread类的子类 ‐在程序中定义实现Runnable接口的类 4、用Thread类子类创建线程 首先需从Thread类派生出一个子类,在该子类中重写run()方法。 class hand extends Thread { public void run() {……} } 5、用Thread类的子类创建多线程的关键性操作 –定义Thread类的子类并实现用户线程操作,即 run()方法的实现

并发编程之线程第一篇

丶灬走出姿态 提交于 2020-02-07 21:03:37
并发编程之线程第一篇 3.4 原理之线程运行 线程上下文切换(Thread Context Switch) 3.5 常见方法 3.6 start与run 3.7 sleep与yield 案例 - 防止CPU占用100% 3.8 join方法详解 3.9 interrupt方法详解 两阶段终止模式 3.10 不推荐的方法 3.11 主线程与守护线程 3.4 原理之线程运行 Java虚拟机栈 JVM中由堆、栈、方法区所组成,其中栈内存是给线程使用,每个线程启动后,虚拟机就会为其分配一块栈内存。 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法 线程上下文切换(Thread Context Switch) 因为以下一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码 线程的cpu时间片用完 垃圾回收 有更高优先级的线程需要运行 线程自己调用了sleep、yield、join、park、synchronized、lock等方法程序 当Context Switch发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java中对应的概念就是程序计数器(Program Counter Register),它的作用是记住下一条jvm指令的执行地址,是线程私有的 3.5 常见方法 方法名 功能说明

VRRP技术讲解与实战演练

谁说胖子不能爱 提交于 2020-02-07 11:48:02
VRRP诞生的背景介绍  当网关路由器RouterA出现故障时,本网段内以该设备为网关的主机都不能与Internet进行通信  多网关可能会出现一些问题:网关间IP地址冲突;主机会频繁切换网络出口 VRRP的工作原理  VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现网关的备份  协议版本:VRRPv2(常用)和VRRPv3 VRRPv2仅适用于IPv4网络,VRRPv3适用于IPv4和IPv6两种网络。  VRRP协议报文:只有一种报文:Advertisement报文 其目的IP地址是224.0.0.18,目的MAC地址是00-00-5e-00-01-XX,协议号是112,VRRP是网络层协议 VRRP基本概念  虚拟路由器(Virtual Router):由一个Master设备和多个Backup设备组成,被当作一个共享局域网内主机的缺省网关。如RouterA和RouterB共同组成了一个虚拟路由器。  Master路由器(Virtual Router Master):承担转发报文任务的VRRP设备,如RouterA。  Backup路由器(Virtual Router Backup):一组没有承担转发任务的VRRP设备,当Master设备出现故障时,它们将通过竞选成为新的Master设备

pthread_mutex_t

夙愿已清 提交于 2020-02-07 03:30:24
在Linux中使用线程 http://blog.csdn.net/jiajun2001/article/details/12624923 :LINUX就是这个范围作者 原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和本声明。否则将追究法律责 我并不假定你会使用Linux的线程,所以在这里就简单的介绍一下。如果你之前有过多线程方面的编程经验,完全可以忽略本文的内容,因为它非常的初级。 首先说明一下,在Linux编写多线程程序需要包含头文件pthread.h。也就是说你在任何采用多线程设计的程序中都会看到类似这样的代码: [cpp] view plain copy #include <pthread.h> 当然,进包含一个头文件是不能搞定线程的,还需要连接libpthread.so这个库,因此在程序连接阶段应该有类似这样的指令: gcc program.o -o program -lpthread 1. 第一个例子 在Linux下创建的线程的API接口是pthread_create(),它的完整定义是: [cpp] view plain copy int pthread_create(pthread_t * thread, const pthread_attr_t *attr, void *(*start_routine)( void*) void *arg)