自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WangY.H

爱代码、爱编程、爱生活

  • 博客(103)
  • 收藏
  • 关注

原创 请你来说一说hash表的实现,包括STL中的哈希桶长度常数

参考回答:hash表的实现主要包括构造哈希和处理哈希冲突两个方面:(1) 对于构造哈希来说,主要包括直接地址法、平方取中法、除留余数法等。(2) 对于处理哈希冲突来说,最常用的处理冲突的方法有开放定址法、再哈 希法、链地址法、建立公共溢出区等方法。SGL版本使用链地址法,使用一个 链表保持相同散列值的元素。虽然链地址法并不要求哈希桶长度必须为质数, 但SGI STL仍然以质数来...

2019-06-30 09:43:17 1414

原创 请你回答一下hash表如何rehash,以及怎么处理其中保存的资源

参考回答:C++的hash表中有一个负载因子loadFactor,当loadFactor<=1时,hash表查找的期望复杂度为O(1). 因此,每次往hash表中添加元素时,我们必须保证是在loadFactor <1的情况下,才能够添加。 因此,当Hash表中loadFactor==1时,Hash就需要进行rehash。rehash过程中,会模仿C++的vector扩容方式,...

2019-06-30 09:40:57 1933

原创 请你说一下解决hash冲突的方法

参考回答:当哈希表关键字集合很大时,关键字值不同的元素可能会映象到哈希表的同一地址上,这样的现象称为哈希冲突。目前常用的解决哈希冲突的方法如下:开放定址法: 当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。再哈希法: 当发生哈希冲突时使用另一个哈希函数计算地址值,直到冲突不再发生。这种方法不易产生聚 集,但是增加计算时间,同时...

2019-06-30 09:39:36 467

原创 请你回答一下栈和堆的区别,以及为什么栈要快

参考回答:堆和栈的区别:【1】堆是由低地址向高地址扩展;栈是由高地址向低地址扩展【2】堆中的内存需要手动申请和手动释放;栈中内存是由OS自动申请和自动释放,存放着参数、局部变量等内存【3】堆中频繁调用malloc和free,会产生内存碎片,降低程序效率;而栈由于其先进后出的特性,不会产生内存碎片【4】堆的分配效率较低,而栈的分配效率较高栈的效率高的原因:栈是操作系统提供的...

2019-06-29 15:16:20 1127 2

原创 请说一说你理解的stack overflow,并举个简单例子导致栈溢出

参考回答:栈溢出概念:栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。栈溢出的原因:1. 局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。局部变量是 存储在栈中的,因此这个很好理解。解决这类问题的办法有两个,一是增大栈 空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。2. ...

2019-06-29 15:14:42 1284

原创 请你回答一下Array&List, 数组和链表的区别

参考回答:数组的特点:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。数组的插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。但数组的随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据。如果应用需要快速访问数据,很少或不插入和删除元素,就...

2019-06-29 15:11:35 2122

原创 请你介绍一下快排算法;以及什么是稳定性排序,快排是稳定性的吗;快排算法最差情况推导公式

参考回答:1、快排算法根据哨兵元素,用两个指针指向待排序数组的首尾,首指针从前往后移动找到比哨兵元素大的,尾指针从后往前移动找到比哨兵元素小的,交换两个元素,直到两个指针相遇,这是一趟排序,经常这趟排序后,比哨兵元素大的在右边,小的在左边。经过多趟排序后,整个数组有序。稳定性:不稳定平均时间复杂度:O(nlogn)2、稳定排序假定在待排序的记录序列中,存在多个具有相同的关键...

2019-06-29 15:05:11 4058 1

原创 请你说一说你知道的排序算法及其复杂度

参考回答:1、冒泡排序:从数组中第一个数开始,依次遍历数组中的每一个数,通过相邻比较交换,每一轮循环下来找出剩余未排序数的中的最大数并“冒泡”至数列的顶端。稳定性:稳定平均时间复杂度:O(n ^ 2)2、插入排序:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。稳定性:稳定平均时间复杂度:O(n...

2019-06-29 14:59:19 835

原创 请问什么是单向链表,如何判断两个单向链表是否相交

参考回答:考察点:数据结构,算法公司:百度1、单向链表单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点。列表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。2...

2019-06-29 14:49:53 767

原创 请你来说一说http协议

参考回答:1)HTTP协议:HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件,图片文件,查询结果等)。HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式...

2019-06-29 14:13:43 547

原创 请你讲述一下TCP三次握手,四次挥手,以及为什么用三次握手?

参考回答:三次握手1.客户端发送syn0给服务器2.服务器收到syn0,回复syn1,ack(syn0+1)3.客户端收到syn1,回复ack(syn1+1)四次挥手(这里以客户端主动断开为例)1.客户端发送fin2.服务端收到fin,回复ack,然后服务器去处理其他事3.服务器事情处理完,回复fin4.客户端回复ack为什么用三次握手本来握手应该和挥手一样都是需要确认两...

2019-06-29 08:44:22 464

原创 请你来介绍一下udp的connect函数

参考回答:除非套接字已连接,否则异步错误是不会反悔到UDP套接字的。我们确实可以给UDP套接字调用connect,然而这样做的结果却与TCP连接不同的是没有三路握手过程。内核只是检查是否存在立即可知的错误,记录对端的IP地址和端口号,然后立即返回调用进程。对于已连接UDP套接字,与默认的未连接UDP套接字相比,发生了三个变化。其实一旦UDP套接字调用了connect系统调用,那么这个U...

2019-06-29 08:42:55 587

原创 请你来说一下数字证书是什么,里面都包含那些内容

参考回答:1)概念:数字证书是数字证书在一个身份和该身份的持有者所拥有的公/私钥对之间建立了一种联系,由认证中心(CA)或者认证中心的下级认证中心颁发的。根证书是认证中心与用户建立信任关系的基础。在用户使用数字证书之前必须首先下载和安装。认证中心是一家能向用户签发数字证书以确认用户身份的管理机构。为了防止数字凭证的伪造,认证中心的公共密钥必须是可靠的,认证中心必须公布其公共密钥或由更...

2019-06-29 08:41:20 2224

原创 请你来说一下socket编程中服务器端和客户端主要用到哪些函数

参考回答:1)基于TCP的socket:1、服务器端程序:1创建一个socket,用函数socket()2绑定IP地址、端口等信息到socket上,用函数bind()3设置允许的最大连接数,用函数listen()4接收客户端上来的连接,用函数accept()5收发数据,用函数send()和recv(),或者read()和write()6关闭网络连接2、客户端程序:1...

2019-06-29 08:39:17 4597

原创 请你来说一下GET和POST的区别

参考回答:1、概括对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)2、区别:1、 get参数通过url传递,post放在request body中。2、 get请求在url中传递的参数是有...

2019-06-29 08:36:08 800

原创 请你来说一下TCP三次握手四次挥手的过程,为什么tcp连接握手需要三次, time_wait状态

参考回答:1)TCP连接(三次握手)过程:客户端A:发送SYN连接报文,序列号为x,进入SYNC-SENT状态。服务端B:发送SYN连接确认报文(SYN=1,ACK = 1),序列号为y(seq = y),确认报文x(ack = x + 1),进入SYNC-RCVD状态。客户端A:发送ACK确认报文(ACK = 1),序列号为x+1(seq = x + 1),确认报文y+1(ack...

2019-06-29 08:34:50 480

原创 请你来说一下TCP拥塞控制?

参考回答:发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。过程cwnd的大小呈指数增长,直到...

2019-06-29 08:32:06 670

原创 请回答一下HTTP和HTTPS的优缺点、区别、返回码解析大全?

参考回答:[1] HTTP协议和HTTPS协议区别如下:1) HTTP协议是以明文的方式在网络中传输数据,而HTTPS协议传输的数据则是经过TLS加密后的, HTTPS具有更高的安全性2) HTTPS在TCP三次握手阶段之后,还需要进行SSL 的handshake,协商加密使用的对称加密密钥3) HTTPS协议需要服务端申请证书,浏览器端安装对应的根证书4) HTTP协议端口是8...

2019-06-28 20:58:31 1221

原创 请你说一说TCP的模型,状态转移

参考回答:四层TCP/IP模型如下:其状态转移图如下:

2019-06-28 20:52:02 721

原创 请你说一下TCP怎么保证可靠性,并且简述一下TCP建立连接和断开连接的过程

参考回答:TCP保证可靠性:(1)序列号、确认应答、超时重传数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号会说明了它下一次需要接收的数据序列号。如果发送发迟迟未收到确认应答,那么可能是发送的数据丢失,也可能是确认应答丢失,这时发送方在等待一定时间后会进行重传。这个时间一般是2*RTT(报文段往返时间)+一个偏差值。(2)窗口控制与高速重发控制/快速...

2019-06-28 20:46:05 1720

原创 请你来说一下linux内核中的Timer 定时器机制

参考回答:1)低精度时钟Linux 2.6.16之前,内核只支持低精度时钟,内核定时器的工作方式:1、系统启动后,会读取时钟源设备(RTC, HPET,PIT…),初始化当前系统时间。2、内核会根据HZ(系统定时器频率,节拍率)参数值,设置时钟事件设备,启动tick(节拍)中断。HZ表示1秒种产生多少个时钟硬件中断,tick就表示连续两个中断的间隔时间。3、设置时钟事件设备后,时...

2019-06-28 20:11:13 1385

原创 请问怎么实现线程池

参考回答:1.设置一个生产者消费者队列,作为临界资源2.初始化n个线程,并让其运行起来,加锁去队列取任务运行3.当任务队列为空的时候,所有线程阻塞4.当生产者队列来了一个任务后,先对队列加锁,把任务挂在到队列上,然后使用条件变量去通知阻塞中的一个线程...

2019-06-28 20:08:38 294

原创 请你说一下多线程的同步,锁的机制

参考回答:同步的时候用一个互斥量,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。在这种方式下,...

2019-06-28 20:07:44 422

原创 server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?

参考回答:这个需要看服务端的编程模型,如果如上一个问题的回答描述的这样,则处于阻塞状态,如果使用了epoll,select等这样的io复用情况下,处于运行状态...

2019-06-28 20:06:31 1221

原创 请你说一说异步编程的事件循环

参考回答:事件循环就是不停循环等待时间的发生,然后将这个事件的所有处理器,以及他们订阅这个事件的时间顺序依次依次执行。当这个事件的所有处理器都被执行完毕之后,事件循环就会开始继续等待下一个事件的触发,不断往复。当同时并发地处理多个请求时,以上的概念也是正确的,可以这样理解:在单个的线程中,事件处理器是一个一个按顺序执行的。即如果某个事件绑定了两个处理器,那么第二个处理器会在第一个处理器执...

2019-06-28 20:04:46 532

原创 请你说一下僵尸进程

参考回答:1)正常进程正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到:在每个进程退出的时...

2019-06-28 20:03:05 1298

原创 请你说一下源码到可执行文件的过程

参考回答:1)预编译主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。4、删除所有的注释,“//”和“...

2019-06-28 19:59:17 366

原创 请你来说一下微内核与宏内核

参考回答:宏内核:除了最基本的进程、线程管理、内存管理外,将文件系统,驱动,网络协议等等都集成在内核里面,例如linux内核。优点:效率高。缺点:稳定性差,开发过程中的bug经常会导致整个系统挂掉。微内核:内核中只有最基本的调度、内存管理。驱动、文件系统等都是用户态的守护进程去实现的。优点:稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃缺点:效率低。典型代表QN...

2019-06-28 10:05:32 1137

原创 请你来说一说用户态到内核态的转化原理

参考回答:1)用户态切换到内核态的3种方式1、系统调用这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的ine 80h中断。2、异常当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此。异常的内核...

2019-06-28 10:04:05 2312

原创 请你来手写一下fork调用示例

1、概念:Fork:创建一个和当前进程映像一样的进程可以通过fork( )系统调用:成功调用fork( )会创建一个新的进程,它几乎与调用fork( )的进程一模一样,这两个进程都会继续运行。在子进程中,成功的fork( )调用会返回0。在父进程中fork( )返回子进程的pid。如果出现错误,fork( )返回一个负值。最常见的fork( )用法是创建一个新的进程,然后使用exec(...

2019-06-28 10:02:29 522

原创 请你来说一说协程

参考回答:1、概念:协程,又称微线程,纤程,英文名Coroutine。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。例如:def A() :print '1'print '2'print '3'def B() :print 'x'print 'y'print 'z'由协程运行结果可能是12x3yz。在执行A的过...

2019-06-28 09:54:13 321

原创 你都使用什么线程模型

1、Future模型该模型通常在使用的时候需要结合Callable接口配合使用。Future是把结果放在将来获取,当前主线程并不急于获取处理结果。允许子线程先进行处理一段时间,处理结束之后就把结果保存下来,当主线程需要使用的时候再向子线程索取。Callable是类似于Runnable的接口,其中call方法类似于run方法,所不同的是run方法不能抛出受检异常没有返回值,而call...

2019-06-27 09:25:34 471

原创 请你说一说死锁产生的必要条件?

参考回答:1.互斥条件:一个资源每次只能被一个进程使用。2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。...

2019-06-27 09:21:58 298

原创 请你回答一下软链接和硬链接区别

参考回答:为了解决文件共享问题,Linux引入了软链接和硬链接。除了为Linux解决文件共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若1个inode号对应多个文件名,则为硬链接,即硬链接就是同一个文件使用了不同的别名,使用ln创建。若文件用户数据块中存放的内容是另一个文件的路径名指向,则该文件是软连接。软连接是一个普通文件,有自己独立的inode,但是其数据块内容比较特...

2019-06-27 09:20:44 385

原创 请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别

参考回答:1、互斥锁和读写锁区别:互斥锁: mutex,用于保证在任何时刻,都只能有一个线程访问该对象。 当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。读写锁: rwlock,分为读锁和写锁。处于读操作时,可以允许多个线程 同时获得读操作。但是同一时刻只能有一个线程可以获得写锁。其它获 取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒。 注意: 写锁会阻塞其...

2019-06-27 09:18:36 4907

原创 请你说一下多进程和多线程的使用场景

参考回答:多进程模型的优势是CPU多线程模型主要优势为线程间切换代价较小,因此适用于I/O密集型的工作场景,因此I/O密集型的工作场景经常会由于I/O阻塞导致频繁的切换线程。同时,多线程模型也适用于单机多核分布式场景。多进程模型,适用于CPU密集型。同时,多进程模型也适用于多机分布式场景中,易于多机扩展。...

2019-06-26 09:37:02 766

原创 请你说一说操作系统中的结构体对齐,字节对齐

参考回答:1、原因:1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。2、规则1)数据成员对齐规则:结构(struct)(或联合(uni...

2019-06-26 09:36:11 1058 1

原创 请你说一说死锁发生的条件以及如何解决死锁

参考回答:死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象。死锁发生的四个必要条件如下:互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源;请求和保持条件:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源不可剥...

2019-06-26 09:34:57 903

原创 请你说一说OS缺页置换算法

参考回答:当访问一个内存中不存在的页,并且内存已满,则需要从内存中调出一个页或将数据送至磁盘对换区,替换一个页,这种现象叫做缺页置换。当前操作系统最常采用的缺页置换算法如下:先进先出(FIFO)算法:置换最先调入内存的页面,即置换在内存中驻留时间最久的页面。按照进入内存的先后次序排列成队列,从队尾进入,从队首删除。最近最少使用(LRU)算法: 置换最近一段时间以来最长时间未访问过的页面...

2019-06-26 09:33:49 563

原创 游戏服务器应该为每个用户开辟一个线程还是一个进程,为什么?

参考回答:游戏服务器应该为每个用户开辟一个进程。因为同一进程间的线程会相互影响,一个线程死掉会影响其他线程,从而导致进程崩溃。因此为了保证不同用户之间不会相互影响,应该为每个用户开辟一个进程...

2019-06-26 09:32:51 1851

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除