.指针和引用的区别?
解析:引用是在C++中引入的。它们之间的区别有:
(1) 非空区别:指针可以为空,而引用不能为空
(2)可修改区别:如果指针不是常指针,那么就可以修改指向,而引用不能
(3) 初始化区别:指针定义时可以不初始化,而引用在定义的时必须初始化
结构struct和类class有什么异同?
解析:在c语言中struct只能对数据进行聚合,而c++的class把数据以及对数据的处理方法
也同时聚合为一体,增加了内聚性。 此外class拥有可再生性和可抽象性,实现的代码的复用。
集中体现在派生的功能和多态的功能。 同时class也比struct具备更好的封装性,
体现在三种访问权限上。
在C++ 中的struct和class的结构基本一致,只是struct的默认权限为Public而class为private。
TCP/IP 建立连接的过程?
答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,
并进入SYN_SEND状 态,等待服务器确认;
第二次握手:服务器收到syn包必须确认客户的SYN(ack=j+1)同时自己也发送一个
SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)
此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
IP地址的编码分为哪俩部分?
解析:IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
哈希表原理:
首先在元素的关键字k和元素的存储位置p之间建立一个对应关系f,使得p=f(k),f称为哈希函数。创建哈希表时,把关键字为k的元素直接存入地址为f(k)的单元;以后当查找关键字为k的元素时,再利用哈希函数计算出该元素的存储位置p=f(k),从而达到按关键字直接存取元素的目的。
冲突:当关键字集合很大时,关键字值不同的元素可能会映象到哈希表的同一地址上,即 k1≠k2 ,但 H(k1)=H(k2),这种现象称为冲突,此时称k1和k2为同义词。实际中,冲突是不可避免的,只能通过改进哈希函数的性能来减少冲突。
冲突处理:
1.开放寻址法:这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中即可。
2.链表法:这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
什么是进程?线程?有什么区别?
答:进程是资源(CPU、内存等)分配的基本单位,线程是CPU调度和分配的基本单位(程序执行的最小单位)。同一时间,如果CPU是单核,只有一个进程在执行,所谓的并发执行,也是顺序执行,只不过由于切换速度太快,你以为这些进程在同步执行而已。多核CPU可以同一时间点有多个进程在执行。
多进程和多线程的区别?
答:优缺点:1)一个进程死了不影响其他进程,一个线程崩溃很可能影响到它本身所处的整个进程。
2)创建多进程的系统花销大于创建多线程。
3)多进程通讯因为需要跨越进程边界,不适合大量数据的传送,适合小数据或者密集数据的传送。多线程无需跨越进程边界,适合各线程间大量数据的传送。并且多线程可以共享同一进程里的共享内存和变量。
多进程和多线程通信的方式?
答:多进程:有名管道,无名管道,信号,共享内存,消息队列,信号量,socket。
多线程:信号量,读写锁,条件变量,互斥锁,自旋锁。
无名管道和有名管道的区别?
答:无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)
有名管道:不同于道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。
如何实现IO多路复用?
- 1,select
-
1.将设定好的fd_set从用户态拷贝到内核态。监听fd的操作只有内核才能完成,因而必须有这样一个过程。
2. fd_set里的每个fd中都有一个进程等待队列。当fd准备就绪的时候就会通知这个进程。如果想要fd通知调用select的进程,那么必须将该进程注册到fd的等待队列中。也就是说,只要调用select,就必须先遍历一遍依次注册进程。可以认为是初始化吧。
3. 第二步在向fd注册进程时,如果发现fd已就绪,那么就可以在遍历完所有的fd后,直接返回。如果一个都没有就绪,那么调用select的进程就会进入睡眠,直到有一个fd通知它的所有的等待队列中的进程(含调用select的进程),select再次遍历fd,查看有没有就绪的fd。
4.将就绪的fd_set从内核态复制到用户态。
-
2,poll
3,epoll