2019秋招面试题-开发
一、进程和线程的区别,问烂了
1.定义
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程:进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
2.关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
3.区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
5) 进程是系统进行资源分配和调度的一个独立单位,线程可以拥有自己的堆栈,但不能拥有系统资源。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4.优缺点
线程执行开销小,但不利于资源的管理和保护;而进程正相反。
线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
5.总结:回答进程和线程的区别这个问题
a.进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间。
b.线程不能够独立执行,必须依存在进程中,使用相同的地址空间。
二、多线程之间的同步问题
三、进程间通信的方式()
进程间通信主要包括管道, 系统IPC(包括消息队列,信号,共享存储), 套接字(SOCKET).
1.管道:
匿名管道( pipe ):匿名管道是一种半双工的通信方式,通常是在父子进程间使用。
命名管道 (named pipe) :命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
2.系统IPC:
消息队列( message queue ) :消息队列是内核地址空间中的内部链表,通过linux内核在各个进程之间传递内容。消息顺序地发送到消息队列中,并且以几种不同的方式从队列中获取,每个消息队列可以用IPC标识符唯一的进行标识,内核中的消息队列是通过IPC的标识符来区别的,不同的消息队列之间是相互独立的,每个消息队列中的消息又构成一个独立的链表。
信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
3.套接字( socket ) :
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同进程间的进程通信。
四、Linux常用指令
lsof:显示系统打开的文件
五、topK问题
五、topK问题
已求访问量top100的网址ip为例:
(一)单机内存足够
可以建一个哈希表,key是ip出现的次数,value是ip。
然后依次遍历key,建一个最小堆,依次比较key与最小堆叶子结点的大小,如果key更大,那么用key替换最小堆的根节点,更新最小堆的结构。
(二)单机内存不够
采用MapReduce的思想,将ip散列到1000个小文件中,用hash表分别统计top100。最后进行归并这些小文件,找出总共的top100。
六、数组和散列表的区别
数组和链表都被直接映射到内存。但散列表更复杂,它使用散列函数来确定元素的存储位置(将输入映射到数字,输入与数字是唯一对应的关系)。
七、数据库底层原理
B+树(减少硬盘的I/O次数)
- 只有最底层的节点(叶子节点)才保存信息(相关表的行位置)
- 其它节点只是在搜索中用来指引到正确节点的。
哈希表
当你想快速查找值时,哈希表是非常有用的。
八、网络四层结构
TCP/IP 网络协议共分为四层(TCP/IP 参考模型):应用层、传输层、网络层和数据链路层。其中MAC 协议属于链路层,IP协议属于网络层,TCP 协议属于传输层,HTTP 协议属于应用层。
SYN请求同步,ACK确认同步,FIN结束
九、找到距离最近的数
结合机器学习中的k近邻方法来做
基本的思路很简单:首先通过二叉树搜索(比较待查询节点和分裂节点的分裂维的值,小于等于就进入左子树分支,等于就进入右子树分支直到叶子结点),顺着“搜索路径”很快能找到最近邻的近似点,也就是与待查询点处于同一个子空间的叶子结点;
然后再回溯搜索路径,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索(将其他子结点加入到搜索路径)。重复这个过程直到搜索路径为空。
十、工厂设计模式
核心工厂类不再负责产品的创建工作,让它成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品,完全遵守了开闭原则,提高了可扩展性。在这个模式中,工厂类和产品类往往一一对应,即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
优点:
(1)利用工厂的工厂方法类去创建具体的产品对象,隐藏了具体产品对象的创建细节,只需要关心具体产品对应的具体工厂;
(2)遵守开闭原则。加入新的产品类时,只需要同时加入工厂类就可以实现扩展,无需修改原来的代码。
缺点:
随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护,增加系统编译和运行的开销。
适用场景:
(1)对于某个产品,调用者清楚地知道应该使用哪个具体的工厂来服务,实例化该具体工厂,生产出具体的产品来;
(2)只是需要一种产品,而不想知道也不需要知道工厂是如何生产出来的,自需要知道具体对应的工厂就行。
八、
1.运行速度快慢为:StringBuilder > StringBuffer > String
2.在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。