单线程

Redis面试题集合

主宰稳场 提交于 2020-02-25 20:01:21
(0)redis为什么是key,value的,为什么不是支持SQL的? (1)redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) (2)redis的持久化开启了RDB和AOF下重启服务是如何加载的? (3)redis如果做集群该如何规划?AKF/CAP如何实现和设计? (4)10万用户一年365天的登录情况如何用redis存储,并快速检索任意时间窗内的活跃用户? (5)redis的5种Value类型你用过几种,能举例吗? (6)100万并发4G数据,10万并发400G数据,如何设计Redis存储方式? 来源: CSDN 作者: 有一天我也能变成大牛 链接: https://blog.csdn.net/programmer_czh/article/details/104493098

JVM 垃圾收集器,种类

岁酱吖の 提交于 2020-02-20 16:30:26
垃圾收集器 所属代:新生代、老年代 英文全写 备注 Serial 新生代 是一个单线程收集器 Serial Old 老年代 Serial Old 是 Serial 收集器的老年代版本 ParNew 新生代 ParNew 收集器其实就是 Serial 收集器的多线程版本,是一个单线程收集器 Parallel Scavenge 新生代 CMS 老年代 Concurrent Mark Sweep G1 Garbage First 来源: https://www.cnblogs.com/cag2050/p/12335773.html

js的单线程和异步

泄露秘密 提交于 2020-02-11 06:25:55
引用 :https://www.cnblogs.com/woodyblog/p/6061671.html 前言 说到js的单线程(single threaded)和异步(asynchronous),很多同学不禁会想,这不是自相矛盾么?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。往下看,你会发现js的机制是多么的简单高效! 说说浏览器 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。下图说明了浏览器的主要线程。 图片来自popAnt 画得太好,忍不住引过来 ( http://blog.csdn.net/kfanning/article/details/5768776 ) 再说说任务队列 刚才说到浏览器为网络请求这样的异步任务单独开了一个线程

js的单线程和异步

折月煮酒 提交于 2020-02-11 06:23:18
前言 说到js的单线程(single threaded)和异步(asynchronous),很多同学不禁会想,这不是自相矛盾么?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。往下看,你会发现js的机制是多么的简单高效! 说说浏览器 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。下图说明了浏览器的主要线程。 图片来自popAnt 画得太好,忍不住引过来 ( http://blog.csdn.net/kfanning/article/details/5768776 ) 再说说任务队列 刚才说到浏览器为网络请求这样的异步任务单独开了一个线程,那么问题来了,这些异步任务完成后,主线程怎么知道呢?答案就是回调函数,整个程序是事件驱动的

API的理解和使用——单线程架构

旧街凉风 提交于 2020-02-10 13:07:21
核心知识点: 1.单线程机制:所有命令放在一个队列中 2.为什么Redis单线程这么快?内存中执行、非IO阻塞、避免线程切换和竞态产生的消耗。 3.单线程的问题?一个命令不能执行太长时间,不然会阻塞其他命令的执行。 Redis使用单线程架构和I/O多路复用模型来实现高性能的内存数据服务。 下面尝试说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之高。 1.单线程命令的处理机制 Redis客户端与服务端的模型可以简化成下图: 每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。 因为Redis是单线程来处理命令,所以一条命令从客户端到达服务端不会立即被执行,所有的命令都会进入一个队列,然后逐个被执行。 所有即使是有先后顺序的几个命令到达服务端的执行顺序也是不确定的,因为中间有网络传输。 但是可以肯定的是,不会有两条命令被同时执行。 这样就不会产生并发问题,这就是Redis单线程的基本模型。 2.为什么单线程还能这么快? 通常来将,单线程的处理能力要比多线程差,因为10个人干活肯定要比1个人干活快。 那么为什么Redis使用单线程模型会达到每秒万级别的处理能力了?可以将其归结为三点: 第一, 纯内存访问 ,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。 第二, 非阻塞I/O

单线程与多线程介绍

雨燕双飞 提交于 2020-02-08 23:16:47
简单的说,单线程就是进程中只有一个线程。单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。 以上是main方法,是一个主线程。 多线程 由一个或者多个线程组成的程序就是多线程,Java中,一定是从主线程开始执行(main方法),然后在主线程的某个位置启动新的线程。 二、线程的基本操作 2.1 创建 创建线程的两种方法 1、继承java.lang.Thread 上述代码中,MyThread类继承了类java.lang.Thread,并覆写了run方法。主线程从main方法开始执行,当主线程执行至t.start()时,启动新线程(注意此处是调用start方法,不是run方法),新线程会并发执行自身的run方法。 2、实现java.lang.Runnable接口 Mythread通过实现Runnable接口,覆写了run方法,实现创建线程的过程,与继承Thread类创建的线程是一样的结果。实际Thread类里边也是通过实现Runnable接口,唯一不同的就是这里边的run方法是空的。里边具体的实现交由外层调用类采用override实现。 注意事项:多线程的运行过程中,如果主线程已经执行完成,但是其子线程还在执行,那表明程序还未结束,等到所有的线程都执行完成时,程序才算结束。 2.2 暂停 线程中的暂停操作是调用sleep实现的

redis单线程如何支持高并发

一个人想着一个人 提交于 2020-02-08 13:23:56
 redis支持高并发的原因: redis是基于内存的,内存读写很快 redis的是单线程的,省去了很多多线程上下文切换的时间 redis虽然是单线程,但采用了IO多路复用技术,非阻塞IO,即多个网络连接复用一个线程,保证多连接的同时增加系统的吞吐量 redis的数据结构,采用hash,读取速度比较快    来源: https://www.cnblogs.com/volare/p/12276077.html

JavaScript的单线程与任务队列

允我心安 提交于 2020-01-30 21:22:21
一、JavaScript为什么设计为单线程? JavaScript语言的一大特点就是单线程,换言之就是同一个时间只能做一件事。 for(var j = 0; j < 5; j++) { console.log(j); } console.log('end'); 上面的代码,只有for循环执行完毕,才会执行end; JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途就是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。 假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准? 所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。 二、任务队列 "任务队列"是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件; 我们来解释一下:

单线程(Thread)与多线程的区别

随声附和 提交于 2020-01-29 17:21:22
首先了解一下cpu,随着主频(cpu内核工作时钟频率,表示在CPU内数字脉冲信号震荡的速度,等于外频(系统基本时间)乘倍频)的不断攀升,X86构架的硬件逐渐成为瓶颈,最高为4G,事实上目前 3.6G 主频的CPU已经接近顶峰。 多线程编程的目的,就是"最大限度地利用CPU资源" ,当某一线程的处理不需要占用CPU而只和I/O,OEMBIOS等资源打交道时,让需要占用CPU资源的其它线程有机会获得CPU资源。 每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程 。这个线程其实是进程执行的一条线索,除了主线程外你还可以给进程增加其它的线程,也即增加其它的执行线索,由此在某种程度上可以看成是给一个应用程序增加了多任务功能。当程序运行后,您可以根据各种条件挂起或运行这些线程,尤其在多CPU的环境中,这些线程是并发运行的。多线程就是在一个进程内有多个线程。从而使一个应用程序有了多任务的功能。多进程技术也可以实现这一点,但是创建进程的高消耗(每个进程都有独立的数据和代码空间),进程之间通信的不方便(消息机制),进程切换的时间太长,这些导致了多线程的提出, 对于单CPU来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。由于时间片很短

多线程和单线程的执行效率问题

十年热恋 提交于 2020-01-29 05:08:06
一提到多线程一般大家的第一感觉就是可以提升程序性能,在实际的操作中往往遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并不是在任何情况下都能提升效率,在一些情况下恰恰相反,反而会降低程序的性能。这里给出两个简单的例子来说明下: 程序1: View Code import threading from time import ctime class MyThread(threading.Thread): def __init__(self, func, args, name): threading.Thread.__init__(self) self.name = name self.func = func self.args = args def run(self): print 'starting', self.name, 'at:',ctime() apply(self.func, self.args) print self.name, 'finished at:', ctime() def fun1(x): y = 0 for i in range(x): y+=1 def fun2(x): y = 0 for i in range(x): y+=1 def main(): print 'staring single thread at:',ctime() fun1