笔试题汇总--1

.指针和引用的区别?

解析:引用是在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. 1,select
    1.         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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值