优先级

进程调度算法总结

五迷三道 提交于 2020-03-24 03:43:52
FCFS(First come first serve)先来先服务算法: 简单的排队算法,维护一个队列,后来的只能排在队尾等待。 非抢占。 缺点:不够智能,对于cpu密集型进程不友好,比如:一个只需要1ms运行时间的cpu密集型进程,但是之前有一个要读5s的io密集型进程。那么即使那个cpu密集型进程只需要运行1ms,但是必须等待足足5s才能运行! SJF(Shortest job first)最短作业优先: 这种算法假设我们可以预测每个进程需要运行的时间。比如有5个进程,分别运行时间是:1,3,2,5,1。 这个算法顾名思义,先取需要最短运行时间的进程来运行,所以执行顺序就是:1,1,2,3,5。其实就是算法里的贪心法。 SJF调度是最优调度(贪心法),但问题是怎么预测运行时间呢?所以其实这个算法只能作为比较,无法真正实现。 非抢占。 SJF算法还有一个变种:最短剩余时间优先。是选择剩余运行时间最少的进程来调度,所以这个算法是 抢占的 。 RR(Round robin)轮转调度: 每个进程被分配一个时间片,一般为20~50ms。每个进程只能最多使用一个时间片的时间,如果没用完时间片就运行完毕,那么可以直接调度下一个进程;如果用完了时间片还没运行完毕,系统会把该进程重新放到队尾。 时间片的选择是有要求的,因为在切换进程的时候要进行上下文切换。如果上下文切换的时间不比一个时间片小多少

.NET线程机制(一) 线程基础

蹲街弑〆低调 提交于 2020-03-23 14:49:32
线程作用及开销   早期计算机一次只能运行一个程序,长时间执行程序容易出现计算机“瘫痪”的问题,如果程序进入死循环则只能重启系统。即使计算机不崩溃,也难免让用户崩溃。为了解决这个问题,操作系统设计者设计出了进程的概念,使得每个应用程序运行在一个虚拟的内存空间中。进程中又包含多个线程,CPU则根据操作系统调度执行每个进程中的线程任务。通过线程这种对CPU的虚拟化管理方式,操作系统形成了多任务执行的机制。但与一切虚拟化机制一样,线程会产生空间和时间的开销。这其中的开销包括: 1、线程内核对象。该数据结构中包含线程上下文。Windows在x86架构CPU上为每个线程内核对象分配的空间大约为700字节,x64和IA64架构CPU分别为大约1240字节和2500字节。 2、线程环境块。占用一个内存页,包含线程的异常处理链首。当线程进入try块时,在链首插入一个节点,在线程 对出 退出try块时,删除该节点。另外线程环境块中还包括一些其他的本地储蓄数据。 3、用户模式栈。用户存储传给方法的局部变量和实参;还包含一个地址,指出当方法返回时,线程应该从什么地方开始接着执行。默认情况下每个线程的用户模式栈分配1MB内存。 4、内核模式栈。记录用户程序调用内核模式函数时函数的实参。32位系统分配12KB内存,64位系统则分配24KB。 5、DLL线程连接和线程分离通知。进程中每创建和终止一个线程时

C#多线程学习

混江龙づ霸主 提交于 2020-03-23 14:44:37
一、线程的定义    进程(Process) 是Windows系统中的一个基本概念,它 包含着一个运行程序所需要的资源 。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。 进程可以理解为一个程序的基本边界 。    线程(Thread) 是 进程中的基本执行单元 ,在 进程入口执行的第一个线程被视为这个进程的主线程 。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。线程主要是由CPU寄存器、调用栈和线程本地存储器(Thread Local Storage,TLS)组成的。CPU寄存器主要记录当前所执行线程的状态,调用栈主要用于维护线程所调用到的内存与数据,TLS主要用于存放线程的状态信息。    多线程 ,在单CPU系统的一个单位时间( time slice)内, CPU只能运行单个线程 , 运行顺序取决于线程的优先级别 。如果在单位时间内线程未能完成执行,系统就会把线程的状态信息保存到线程的本地存储器(TLS)中,以便下次执行时恢复执行。而多线程只是系统带来的一个假象,它在多个单位时间内进行多个线程的切换。因为切换频密而且单位时间非常短暂,所以多线程可以被视作同时运行。   

Java 线程与多线程

对着背影说爱祢 提交于 2020-03-22 17:46:55
Java是一门支持多线程的编程语言! 什么是进程? 计算机中内存、处理器、IO等资源操作都要为进程进行服务。 一个进程上可以创建多个线程,线程比进程更快的处理单元,而且所占用的资源也小,多线程的应用也是性能最高的。 Java的多线程实现:(三种方式)   在Java中实现多线程有两种途径:     1、继承Thread类     2、实现Runnable接口     3、实现Callable接口 继承Thread类: class MyThread extends Thread { //继承Thread 即 多线程类【线程操作主类】 } ps:在Java中,任何一个类继承了Thread类,都视为该类为多线程类。 在Java程序中都有一个“起点”即开始的地方;那么多线程类也有一个“起点”—— run()方法 ,也就是说在多线程的每个主体类中都必须要覆写Thread类中所提供的 run() 方法 public void run() ; run()方法没有提供参数和返回值,那么也就表示了线程一旦开始就要一直执行,不能够返回内容。 import sun.security.mscapi.KeyStore.MY; class MyThread extends Thread { //继承Thread 即 多线程类 private String name ; public MyThread

nginx与location语法详解

倖福魔咒の 提交于 2020-03-21 14:57:33
Location语法优先级排列 匹配符 匹配规则 优先级 = 精确匹配 1 ^~ 以某个字符串开头 2 ~ 区分大小写的正则匹配 3 ~* 不区分大小写的正则匹配 4 !~ 区分大小写不匹配的正则 5 !~* 不区分大小写不匹配的正则 6 / 通用匹配,任何请求都会匹配到 7 nginx.conf配置文件实例 server { listen 80; server_name pythonav.cn; #优先级1,精确匹配,根路径 location =/ { return 400; } #优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写 location ^~ /av { root /data/av/; } #优先级3,区分大小写的正则匹配,匹配/media*****路径 location ~ /media { alias /data/static/; } #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里 location ~* .*\.(jpg|gif|png|js|css)$ { root /data/av/; } #优先7,通用匹配 location / { return 403; } } nginx语法之root和alias区别实战 nginx指定文件路径有root和alias两种方法 区别在方法和作用域: 方法:

STL之优先队列

大兔子大兔子 提交于 2020-03-21 02:48:50
STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素个数 top() 返回优先队列对顶元素 在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。 使用方法: 头文件: #include <queue> 声明方式: 1、普通方法: priority_queue < int > q; // 通过操作,按照元素从大到小的顺序出队 2、自定义优先级: struct cmp { operator bool ()( int x, int y) { return  x > y; // x小的优先级高 // 也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高 } }; priority_queue < int , vector < int > , cmp > q; // 定义方法 // 其中,第二个参数为容器类型。第三个参数为比较函数。 3、结构体声明方式: struct node { int x, y; friend bool operator < (node a, node b) { return a.x > b.x; // 结构体中,x小的优先级高 } }; priority

优先队列

柔情痞子 提交于 2020-03-21 02:48:11
转自:http://www.cnblogs.com/summerRQ/ 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部。priority_queue特别之处在于,允许用户为队列中存储的元素设置优先级。这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。标准库默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载 < 操作符。 优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。 1) 优先队列的定义 包含头文件:"queue.h", "functional.h" 可以使用具有默认优先级的已有数据结构;也可以再定义优先队列的时候传入自定义的优先级比较对象;或者使用自定义对象(数据结构),但是必须重载好< 操作符。 2) 优先队列的常用操作 优先级队列支持的操作 q.empty() 如果队列为空,则返回true,否则返回false q.size() 返回队列中元素的个数 q.pop() 删除队首元素,但不返回其值 q.top() 返回具有最高优先级的元素值,但不删除该元素 q.push(item) 在基于优先级的适当位置插入新元素 其中q.top()为查找操作,在最小优先队列中搜索优先权最小的元素

java优先队列 PriorityQueue

為{幸葍}努か 提交于 2020-03-21 02:46:10
PriorityQueue是个基于优先级堆的极大优先级队列。 此队列按照在构造时所指定的顺序对元素排序,既可以根据元素的自然顺序来指定排序(参阅 Comparable), 也可以根据 Comparator 来指定,这取决于使用哪种构造方法。优先级队列不允许 null 元素。 依靠自然排序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException) 比如队列 1 3 5 10 2 自动会被排列 1 2 3 5 10 package com.javaer.examples.datastruct; import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import org.apache.poi.ss.formula.functions.Count; public class PriorityQueueExample { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Queue qi = new PriorityQueue(); qi.add(5); qi.add(2); qi.add(1);

xTaskCreate()

烂漫一生 提交于 2020-03-20 15:17:24
头文件:task.h portBASE_TYPE xTaskCreate ( pdTASK_CODE pvTaskCode, //指向任务的实现函数的指针。效果上仅仅是函数名                const portCHAR * const pcNane, //具有描述性的任务名。FreeRTOS 不会使用它。                unsigned portSHORT usStackDepth, //指定任务堆栈的大小                void *pvParameters, //指针用于作为一个参数传向创建的任务                 unsigned portBASE_TYPE uxPriority, 任务运行时的优先级                      xTaskHandle *pvCreatedTask //用于传递任务的句柄,可以引用从而对任务进行其他操作。                )   说明: 1. 这里的任务是指一个永远不会退出的C 函数,通常是一个死循环。      2. pcNane 其只是单纯地用于辅助调试。应用程序可以通过定义常量 config_MAX_TASK_NAME_LEN 来定义任务名的最大长度——包括’\0’结束符。如果传入的 字符串长度超过了这个最大值,字符串将会自动被截断      3.

FreeRTOS多任务(LED + BEEP)

余生颓废 提交于 2020-03-20 15:16:32
函数流程 int main(void) { /* 第一步:开发板硬件初始化 */ BSP_Init(); /* 第二步:创建APP应用任务,所有的应用任务都可以放在这个函数里面 */ AppTaskCreate(); /* 第三步:启动FreeRTOS,开始多任务调度,启动成功则不返回 */ vTaskStartScheduler(); while (1) { } } 创建APP应用任务, static void AppTaskCreate(void) { xTaskCreate(vTaskLed1, /* 任务函数名 */ "Task Led1", /* 任务名,字符串形式,方便调试 */ 512, /* 栈大小,单位为字,即4个字节 */ NULL, /* 任务形参 */ 0, /* 优先级,数值越大,优先级越高 */ &xHandleTaskLED1); /* 任务句柄 */ xTaskCreate(vTaskBeep,"Task Beep",512,NULL,2,&xHandleTaskBeep); } pvTaskCode 任务只是永不退出的 C 函数,实现通常是一个死循环。参数pvTaskCode 只是一个指向任务的实现函数的指针(效果上仅仅是函数名)。 pcName 具有描述性的任务名。这个参数不会被 FreeRTOS 使用。其只是单纯地用于辅助调试