Java并发

进程与线程的区别是什么?

进程就是一段程序的执行过程(狭义)。是一个具有特定功能的程序关于某个数据集合运行的一次运行活动,是操作系统分配资源的最基本单位(广义)。线程也称轻量级进程,是程序执行流的基本单元。在引入线程的操作系统中,一般都是把进程作为分配资源的基本单位,把线程作为独立运行和独立调度的基本单位


主线程退出会导致整个进程退出么?

不一定。Java 中的 Thread 分为User Thread 和 Demon Thread(守护线程)。守护线程与用户线程的区别就在于,如果虚拟机中的线程都是守护线程的话,虚拟机(也就是进程。在java中,每个进程对应一个java虚拟机)将会退出。因此,在主线程退出的时候,如果虚拟机中还有其他的用户线程,虚拟机不会退出。否则,虚拟机中其他的线程都是守护线程,虚拟机将会退出。


守护线程和守护进程的区别是什么?

在一般情况下,当进程的控制终端被关闭的时候,进程会被强行关闭。守护进程是一种能够脱离于终端在后台运行的一种进程。它从被执行的时候开始运转,直到整个系统结束才退出。

守护线程跟一般意义上的线程(用户线程)的唯一区别在于,如果虚拟机中的线程都是守护线程的话,虚拟机(也就是进程)将会退出

所以说,守护进程的“守护”跟守护线程的“守护”并不是相同的概念


如何创建守护进程?

1.创建子进程,父进程退出

创建子进程后父进程退出,会导致子进程成为孤儿进程。孤儿进程将会被系统中的1号进程(init)所收养。这样。原来的子进程就变为了init进程的子进程。

2.在子进程中调用setsid();

setsid() 的作用是创建一个新的会话组,并担任新会话的组长。这样做可以使子进程脱离原来的终端、进程组和会话(一个进程组包含一个或多个进程,一个会话包含一个或多个进程组,通常把一个用户从登录到退出过程中,他运行的所有进程归于一个会话)。

3.改变根目录为当前目录

4.重设文件权限掩码

5.关闭文件描述符


孤儿进程和僵尸进程的区别?

孤儿进程指的是父进程结束而子进程没有结束,而僵尸进程指的是子进程结束而父进程没有wait(或waitpid)它。


僵尸进程的危害与清除?

僵尸进程既不占用内存,也不占用cpu。但是它占用了一个进程号,系统所能够使用的进程号是有限的,因此僵尸进程大量地占用进程号将会导致无法生成新的进程。

清除僵尸进程的方法是:kill产生僵尸进程的父进程。这样僵尸进程就会变成孤儿进程,然后被内核回收。


怎么防止僵尸进程的出现?

1.通过父进程使用 wait() 或 waitpid() 等待子进程,这会导致父进程被挂起。(不过waitpid() 提供了一个无阻塞的wait(),只要把参数设置成 WNOHANG 就行了)。

2.用 signal() 函数为SIGCHLD 安装handler,子进程结束后,父进程会收到信号,可在 handler 中回收。

3.用 signal(SIGCHLD,SIG_IGN) 通知内核,由内核代为回收。

4.先创建子进程,再创建孙进程,创建结束之后杀死子进程,孙进程就会被 init 收养,由 init 回收。


僵尸进程会造成内存泄漏吗?

不会。内存泄漏指的是动态分配的内存空间,使用完之后未被释放。僵尸进程是不占用内存的(准确地说,是不占用java虚拟机的内存),就更谈不上内存泄漏了。


什么叫线程安全?

线程安全指的是在多线程环境下,程序执行的结果与各个线程的调度顺序无关。


使用线程池的好处?

一方面,使用线程池可以减小在创建和销毁线程时产生的时间开销和资源开销(具体能减小多少,这个我还真不知道)。另一方面,使用线程池可以管理线程,保证系统不会因为大量并发产生的资源不足而崩溃。


列举一下你所知道的线程池?

单线程线程池(NewSingleThreadExecutor)、固定数量的线程池(NewFixedThreadExecutor,达到最大数量后线程进入等待队列)、可缓存线程池(NewCachedThreadExecutor,自动回收60s未执行的线程)、大小无限制线程池(NewScheduleThreadExecutor)。


什么叫正向代理?什么叫反向代理?

正向代理是一种客户端主动使用的代理方式。它需要用户在客户端设置,对服务器透明。反向代理是一种服务器端使用的代理方式,它不需要用户在客户端进行设置,对客户端透明。譬如翻墙软件就是一种正向代理,而nginx是典型的反向代理,可以为服务器提供缓冲。


反向代理服务器与负载均衡服务器的区别?

反向代理服务器将静态资源存储到服务器上,以便用户能够更快地获得资源。负载均衡服务器之转发用户请求,不存储资源。


Redis的可排序集与集合的区别是什么?是怎么实现的?

可排序集在排序上拥有更高的效率(集合排序的时间复杂度为O),可排序集是借助跳表实现的。


什么是跳表?

跳表是一种可以用来替代树的数据结构,它的效率和AVL树不相上下。跳表由很多层构成,每一层都是一个有序链表。最下层包含了链表的所有元素,在上层出现的元素,下层还会出现。跳表使用上层来作为下层的索引,每个节点包含两个指针,一个指向后一个节点,一个指向下面的节点。跳表的空间复杂度期望为2n,其查找、插入和删除的时间复杂度均为O(log(n))。


跳表如何进行插入和删除?

跳表的插入比较复杂,首先要确定插入的元素所在的层数(用丢硬币的方法,丢到正面继续丢,丢到反面则停止。抛硬币的次数就是层数),如果层数超过当前层数,则在最上面添加新的层。跳表的删除比较简单,直接按照链表的方式删除即可。


介绍一下你所知道的缓存算法?

1.LRU 和 LFU:

LRU(按照上次使用时间排序)、LFU(按照使用频率排序)、LRU2(按照倒数第二次使用时间排序)。

2.LRU 升级版:

2Q(Double Queues,两个LRU队列,比例1:3,当对象被第二次访问,移入第二级队列),ARC(adaptive Replacement cache,LFU 的2Q版,两个队列,一个是最近被访问一次,另一个是最近被访问两次)。

3.基于 FIFO:

FIFO(先进先出)、Second Chance(带标记位的FIFO)、Clock(环形队列的Second Chance)。

4.基于时间:

绝对时间周期(相同寿命)、相对时间周期(相同时刻)、从上次访问开始算起的时间周期

5.移除最常用

MRU(移除最近最多访问元素,因为找出最近最少被访问的时间复杂度高)。


Redis的优势在于哪?

首先,Redis支持多种数据类型(字符串、列表、哈希、集合、有序集合)以及它们的原子性操作。另外,Redis支持数据的持久化和 Master-Slave 模式的数据备份。


负载均衡服务器的三大特性?

负载均衡算法(轮询、最小连接数、最快响应时间、比率、优先权、哈希、基于策略(自定义)、基于数据包)、健康检查(Ping、TCP、UDP、HTTP、FTP、DNS等,七层网络中的三到七层)和会话保持(同一用户访问到相同服务器)。


线程的状态有几种?

新建、就绪、运行、阻塞、死亡。

 

终止线程有几种方式?

通过标志位控制退出(while(volatileexit))、通过stop的方法来终止线程(thread.stop())、通过中断的方法终止进程(thread.interuped())。


什么叫缓存穿透?怎么预防?

缓存穿透指的是访问一个不存在的数据,由于这样缓存不可能命中,缓存就会去数据库中直接读这个数据,给数据库造成压力。预防的方式是使用一个布隆过滤器,即把数据库中所有可能的值 hash 到一个足够大的 bItmap 上去,请求到达时先用过滤器检测是否由该数据,如果有再去缓存中读取。

不同缓存系统中的缓存算法分别是怎样的?

Redis2.6/ Encache/ Hazelcast:随机找3条/ 8条/ 25条,删去其中空闲时间最长的数据。

Redis3.0:随机找五条,插入一个长度为16按空闲排序的队列里,每次删去最老的元素。

MemCached/ Guava Cache:纯粹的LRU,维持一个双向链表,插入到链表头,删除时把前后两个元素连接起来。


不同缓存系统对于过期键是怎么删除的?

所有缓存系统对于过期键都采用惰性删除的方式,也就是说,并不是数据一过期就删除(因为执行检查的线程耗费cpu),而是只有元素被访问时,才会检查它是否超时了。为了防止不被访问的数据永远不被清理,不同缓存系统提供了不同的策略去清理这样的数据:

Redis:每100ms抽取20条进行检查。如果有超过1/4过期,那么立即进行下一轮检查。

MemCached:有一个检查线程从双链表队尾往前检查,每隔一段时间(默认100ms)执行一次。

Guava Cache:由于在这个系统中,同一个Cache里所有数据同时过期,因此只需要从队尾向前检查直到不过期为止。每次写入数据都会调用此方法。

Ehcache:只有惰性检查,没有主动过期。


设计缓存算法需要考虑的因素有哪些?

成本:如果对象获取成本不同,难以获取的元素需要尽可能的保存。

容量:先清除大对象,这样就可以把更多的小对象换进内存。

时间:如果系统缓存着过期时间,那么对过期的数据进行清理。


Redis 和 Memcached 分别是怎么实现的?

http://blog.csdn.net/u014743697/article/details/53442512


Select、poll 和 epoll 的区别?


http://www.cnblogs.com/Anker/p/3265058.html


数据库分区与分库分表(Sharding)的区别是什么?

http://blog.csdn.net/heirenheiren/article/details/7896546


数据库分库分表(Sharding)的步骤是什么?

http://blog.csdn.net/bluishglc/article/details/6161475


多级缓存是怎么实现的?

http://blog.csdn.net/huashen1621y/article/details/51594148









Redis 和 Memcached 分别是怎么实现的?

http://blog.csdn.net/u014743697/article/details/53442512

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值