线程

SVT-AV1:开源编解码最新进展

假装没事ソ 提交于 2020-04-05 19:06:40
SVT-AV1是开源的AV1编解码器实现,托管在GitHub上[1]。如我们先前的文章所述[2],英特尔和Netflix自2018年8月以来一直在就SVT-AV1编解码器框架进行合作。团队一直密切合作进行SVT-AV1的开发、交流架构决策;实施新工具并改善压缩效率。自从项目开源后更多技术合作伙伴和开源社区为SVT-AV1做出非常多的贡献。此篇技术博客中,我们将继续报告SVT-AV1项目的当前状态以及编解码器的特性与性能。 文/ Andrey Norkin, Joel Sole, Mariana Afonso,Kyle Swanson, Agata Opalach, Anush Moorthy, Anne Aaron 译 / 蒋默邱泽 原文 https://netflixtechblog.com/svt-av1-an-open-source-av1-encoder-and-decoder-ad295d9b5ca2 SVT-AV1代码库状态 SVT-AV1代码库包括一个AV1编码和解码器,它们共享大量的代码。SVT-AV1解码器功能齐全,并符合所有三个配置文件(Main,High& Professional)的AV1规范。 SVT-AV1编码器支持所有对压缩效率有助力的AV1工具。与最新的libaom主版本(AV1参考软件)相比,SVT-AV1在压缩效率方面相近

1、性能调优标准

和自甴很熟 提交于 2020-04-05 18:58:52
CPU负载和CPU利用率的区别 系统负载代表单位时间内正在运行或等待的进程或线程数,代表了系统的繁忙程度. CPU利用率则代表单位时间内一个线程或进程实时占用CPU的百分比. 我们知道,一个进程或者线程在运行时,未必都在实时的利用CPU的.比如,在CPU密集型的情况下,系统的负载未必会高,但CPU的利用率肯定会高,一个 线程/进程一直在计算,它对CPU的实时利用率是100%,而系统负载是0.1. 又比如,而对于I/O密集型的程序来说,有可能CPU的利用率不高,但系统的负载却会非常高,这是因为I/O经常引起阻塞,这样导致很多线程/进程被处于 阻塞等待状态,处于等待的线程或进程也是属于负载线程/进程的. TPS(transaction per second)是单位时间内处理事务的数量 QPS(query per second)是单位时间内请求的数量. TPS代表一个事务的处理,可以包含了多次请求.很多公司用QPS作为接口吞吐量的指标,也有很多公司使用TPS作为标准,两者都能表现出系统的吞吐量 的大小,TPS的一次事务代表一次用户操作到服务器返回结果,QPS的一次请求代表一个接口的一次请求到服务器返回结果.当一次用户操作只包含一个 请求接口时,TPS和QPS没有区别.当用户的一次操作包含了多个服务请求时,这个时候TPS作为这次用户操作的性能指标就更具有代表性了. 来源: oschina

多线程

自作多情 提交于 2020-04-05 18:10:08
进程vs线程: 进程:每个程序被运行加载到内存之后,都会被操作系统作为一个进程,进程是处于运行过程中的程序,是具有独立功能,被操作系统进行资源分配和调度的独立单元。 线程:一个进程里面可以拥有多个线程,线程拥有自己的堆栈,程序计数器和自己的局部变量,但是不拥有系统资源,多个线程共享进程的系统资源。 创建线程的三种方式: 1.继承Thread类创建线程类 继承Thread类,重写run()方法,该run()方法就代表程序需要完成的任务。创建Thread子类的实例,即创建线程对象。然后通过start()方法启动线程。 1 public class MyThread extends Thread { 2 private int count; 3 4 @Override 5 public void run() { 6 7 for (; count < 100; count ++) { 8 System.out.println(getName() + "---" + count); 9 } 10 } 11 12 public static void main(String[] args) { 13 for (int i = 0; i < 100; i++) { 14 System.out.println(Thread.currentThread().getName() + i); 15 if

java面试基础篇-List

Deadly 提交于 2020-04-05 18:00:41
一.ArrayList:   底层为数组实现,线程不安全,查询,修改快,增加删除慢, 数据结构:数组以0为下标依次连续进行存储   数组查询元素:根据下标查询就行   数组增加元素:如果需要给index为10的位置添加,则从index为11的位置开始右移 数组删除元素:如果需要删除index为10的位置,则从index为11的位置开始左移 线程: 如果判断线程安不安全只需要了解到是否进行加锁,如果没有加锁的话,多个线程操作同一个对象时就会出现线程不安全的情况. 源码: 1.new一个arraylist,调用add方法 2.查看add方法的源码可以看出,并没有任何加锁操作,这就是线程不安全的 ,这里首先会确认数组的容量,对其进行增加,并将新的元素加入到数组中 使用场景:查询 修改多 二.LikedList:   底层为链表实现,线程不安全,查询修改慢,增加删除快 数据结构:链表的每个元素都存储了下一个元素的地址,从而使一系列的随机的内存地址串在了一起,只要有足够的内存空间,就可以为链表分配内存   链表查:当同时读取所有元素时,链表的效率很高,读第一个,读第二个,以此类推。如果需要找到某个节点时,就需要遍历整个节点,才可以找到需要的元素   链表增加元素:只需要修改它前面的那个元素指针指向的地址即可   链表删除元素:只需要将前一个元素指针指向的地址更改即可 线程:

Java基础:线程的创建与启动

跟風遠走 提交于 2020-04-05 17:10:48
一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。比如java.exe进程中可以运行很多线程。线程总是属于某个进程,进程中的多个线程共享进程的内存。 “同时”执行是人的感觉,在线程之间实际上轮换执行。 二、Java中的线程 在Java中,“线程”指两件不同的事情: 1、java.lang.Thread类的一个实例; 2、线程的执行。 使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。 Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程也在后台运行着。 一个Java应用总是从main()方法开始运行,mian()方法运行在一个线程内,它被称为主线程。 一旦创建一个新的线程,就产生一个新的调用栈。 线程总体分两类:用户线程和守候线程。 当所有用户线程执行完毕的时候,JVM自动关闭。但是守候线程却不独立于JVM

线程之Semaphore之事例

删除回忆录丶 提交于 2020-04-05 15:59:36
概述 为了提高接口的响应速度,可以使用 ThreadPoolExecutor + Runnable 或者 ThreadPoolExecutor 并发调用 技术来并行执行task。但是ThreadPoolExecutor有个特点,就是当core线程不足以应付请求的时候,会将task加入到队列中。一旦使用队列,那么就可能出现队列爆掉或者队列导致的内存溢出问题。 为了尽快提供接口响应速度,但是又不想使用队列特性的话。可以使用信号量来做到。 Semaphore信号量管理着一组许可,在执行操作时需要首先获得许可,并在使用后释放许可。如果已经没有许可了, acquire方法将一直阻塞,直到有许可。 信号量简单例子 ThreadPoolExecutor中使用信号量 在ThreadPoolExecutor中,我们在定义core线程参数的时候,比如定义为10个,那么使用信号量的时候,初始化参数也设置为10. Semaphore<Integer> sem= new Semaphore<>(10); ThreadPoolExecutor中,如果不想用到队列, 就必须保证线程池中始终只有core线程在工作 。那么当请求太多,core线程处理不过来的时候,用信号量进行阻塞, 保证只有当core线程的某些线程执行完后,阻塞才解开。 这里使用JAVA并发编程一书中的例子来说明信号量的基本用法。 public

Java线程中的锁你掌握了吗?

≡放荡痞女 提交于 2020-04-05 15:46:09
一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据。 public class Foo { private int x = 100; ​ public int getX() { return x; } ​ public int fix(int y) { x = x - y; return x; } } public class MyRunnable implements Runnable { private Foo foo = new Foo(); ​ public static void main(String[] args) { MyRunnable r = new MyRunnable(); Thread ta = new Thread(r, "Thread-A"); Thread tb = new Thread(r, "Thread-B"); ta.start(); tb.start(); } ​ public void run() { for (int i = 0; i < 3; i++) { this.fix(30); try { Thread.sleep(1); } catch (InterruptedException e) { e

Prism 源码解读6-事件聚合

跟風遠走 提交于 2020-04-05 15:39:13
0 介绍 事件提供的是1对多的绑定,通过委托链实现对订阅者的调用,事件必须要通过发布者调用。同时事件订阅是强引用,事件订阅者的生命周期总是大于等于事件发布者。如果代码中事件很多就会充斥着各种事件的订阅,不利于维护。 Prism提供了EventAggregator器,可以在任何地方进行订阅,任何地方进行调用/发布,实例只对EventAggregator和事件类型有依赖,使用了弱引用,可以过滤消息,并可以控制回调函数线程。感觉很强大,实现应该挺复杂,但看到实现时有一种恍然大悟的感觉,喜欢这种简单而强大的实现。开始一探究竟吧! 1 整体框架 先从整体框架解析一下吧。EventAggregator 发现这只是一个集合类,保存着事件类型和事件实例,还有一个线程上下文保证线程同步。 看一下EventBase,看来所有的订阅委托都是在着保存着,因为有一个IEventSubscription列表。EventSubscription因该是订阅委托的包装器。 看到有SubscriptionToken和DelegateReference, 这边终于看到Delegate的真正存放地点了。这边存放了弱引用,委托类型和MethodInfo。 看到这边理解了,通过一个集合保存事件,这个事件内部存储着所有订阅委托。 当我们向订阅发布的时候,只要从这个集合中获取对应的事件进行订阅发布

Java并发编程锁系列之ReentrantLock对象总结

余生颓废 提交于 2020-04-05 15:01:39
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种。ReentranckLock就是其中的多个分类。 本文主要内容:重入锁理解;重入锁代码演示; ReentranckLock的总结 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:《Java并发包下锁学习第六篇:ReentranckLock的总结》。 我们先来看看内部结构: ReentranckLock内部有三个内部类,分别是: Sync:继承了AbstractQueuedSynchronizer(AQS)同步器的内部类,来实现同步机制的; FairSync:公平锁对象; NonfairSync:非公平锁对象。 关于公平锁与非公平锁详细介绍文章见:《Java并发编程锁之独占公平锁与非公平锁比较》和《Java并非锁之独占非公平锁理解》两篇文章。 再来看看对象名称:Reentranck的中文意思:再入、重入的意思。即该对象还是重入锁。 公平锁和非公平锁在获取锁的区别在于: 公平锁获取锁的时候,进入排队。源码如下图: 非公平锁线尝试插队,如果插队不成功再进行排队。源码如下图: 那么什么是重入锁呢? 重入锁(递归锁)可以理解为:同一个线程函数获得锁之后,内层递归函数依然能够获取到该锁对象的代码,也即

Java运行时数据区

我们两清 提交于 2020-04-04 22:52:11
Java中对象创建,内存分配,垃圾回收的权力交给了虚拟机,这其中有利也有弊,程序员也减轻了负担,但是如果不熟悉Java的内存区域划分,一旦出现内存溢出和泄漏,将会很难定位问题的根源,这就有必要了解Java的运行时数据区划分。 方法区(Method Area) 是由各个线程共享的内存区域,用来存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 堆(Heap) Java虚拟机所管理的一块最大的内存区域,由所有的线程共享的一块内存区域;堆内存在虚拟机启动时创建,用来存放对象实例,数组;Java堆是垃圾收集器管理的内存,在G1垃圾收集器之前,堆内存普遍采用分代设计思想,新生代,老年代,永久代...,现代垃圾收集器已经不主张采用分代设计理论概念;Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。 虚拟机栈(VM Stack) 虚拟机栈为线程私有,每个方法执行时,虚拟机都会创建栈帧存储局部变量表(包含Java的基本数据类型,以及对象的引用,非对象本身)、操作数栈、动态连接方法出口等信息,方法从被调用到执行结束,对应着一个栈帧在虚拟机中从入栈到出栈的过程