精华内容
下载资源
问答
  • 网络工程师十个常见面试问题
    万次阅读 多人点赞
    2020-04-08 10:22:24

    网络工程师十个常见面试问题

    1.1 [简单说一下OSI七层]

    Osi模型是一个工业的标准.它为现在的互联网提供了很大的贡献。是一个逻辑上的规范和标准,很多厂商都要遵循它。他定义了七层每一层都有不同的功能和规范。

     

    --物理层

    物理层定义了设备接口上的一些电子电气化的标准,比如RJ45接口,光纤接口。传输介质双绞线,无线,光,电。等

     

    --数据链路层

    二层定义了一个重要的表示,MAC地址,准确的说他必须在一个LAN内是唯一的。他又48位的十六进制组成,前24位是厂商表示,后24位 是厂商自定义的序列号。有时候 MAC地址就是表示了一个设备的位置。

     

    --网络层

    网络层是用来逻辑上选路寻址的,这一层最重要的一个协议就是IP协议。基于ip 又分为 ARP,RARP,ICMP,IGMP等

     

    --传输层

    这一层定义类了 两个重要的协议 TCP和UDP 。还有就是端口号的概念。这一层关联的是一个主机上的某个程序或者是服务。比如 tcp 80 的web服务 udp 4000的QQ 程序等。

     

    --会话层

    主要作用是建立会话和管理会话。我一般这样理解 会话的 比如 telnet 一台主机,是一次会话的链接。打开百度的网页,就和百度的服务器建立了一次会话。

     

    --表示层

    因为底层传输的是二进制,应用层无法直接识别。所以根据这一层的名字可以直接理解为他是一个翻译。比如把一长串的数据“翻译”成rmvb格式,交给上层的 快播 这个程序,把另一串数据“翻译成”MP3格式交给 音乐播放器。其实这一层的工作很多。

    压缩,解压缩,加密,解密等

     

    --应用层

    为用户提供了一个可以操所的界面,如windows的桌面化或UNIX的字符界面。

     

    OSI七层的每一层是独立工作的,但是层与层之间是相互“合作”“兼容”的关系。

     

    1.2 [三层交换和路由器的不同]

    虽说三层交换机和路由器都可以工作在三层,但本质上还是有所区别。

     

    一 在设计的功能上不同

    现在有很多的多功能路由器,又能实现三层的路由功能,包括NAT地址转换。有提供了二层的端口,有的还配置了无线功能。再有就是还具备防火墙的功能。但是你不能它单独的划分为交换机或者是防火墙吧。只能说是个多功能的路由器。防火墙二层交换只是他的附加功能。三层交换也一样,主要功能还是解决局域网内数据频繁的通信,三层功能也有,但不见得和路由器差很多。

     

    二 应用的环境不同

    三层交换的路由功能比较简单,因为更多的把他应用到局域网内部的通信上,主要功能还是数据的交换

    路由器的主要功能就是选路寻址,更适合于不同网络之间,比如局域网和广域网之间,或者是不同的协议之间。

     

    三 实现方式不同

    路由器能够实现三层的路由(或转发) 是基于软件的实现方式,当收到一个数据包要转发的时候,要经过查看路由表,最长匹配原则等一系列复杂的过程最终实现数据包的转发,相比三层交换效率略低。而三层交换是基于硬件的方式实现三层的功能,他成功转发一个数据包后,就会记录相应的IP和MAC的对应关系,当数据再次转发是根据之前的记录的表项直接转发。这个过程成为“一次路由,多次交换”。

     

    总之,三层交换和路由器的最大区别是路由器可以基于端口做NAT,而三层交换机不能。路由器直接接入光纤可以直接上网,而三层交换机不能。主要是三层交换机的每一个接口都有专有的MAC地址和特定的ASIC集成电路。

    .

    1.3 [静态路由和动态路由的区别]

    静态路由特点

    静态路由是管理员手工配置,精确。但是不够灵活,是单向性的。考虑到静态路由稳定,节省资源(内存,cpu,链路带宽)。在网络TOP不是很大的环境中常用。

     

    动态路由的特点

    动态路由的好处就是路由器本身通过运行动态路由协议来互相学习路由条目,在大型的网络环境中,一定程度上减少了工程师的工作量。动态路由协议分为很多种,IGP和EGP,IGP中根据工作的原理分为链路状态型和距离矢量型的。但是不管哪一种动态协议,他都要经过以下几个过程。

    1.“说话” 向其他的路由器发送路由信息

    2.“收听” 接收其他路由器发来的路由信息

    3.“计算”不同的动态路由协议有不同的算法,每种路由协议通过自己特有的算法把收到的路由信息计算,得出最好的路由条目,加载到路由表中。

    4.“维护” 维护路由表,当TOP发生变化的时候,及时的更新自己的路由表,并发送变更的消息

    在生产环境下,应当更具不同的网络规模,选择不同的路由协议。

    1.4 [描述一下ACL和NAT]

    ACL:acl访问控制列表是用来制定规则的一种机制。他用来告诉路由器那些数据包访问那些资源是允许的,那些是拒绝的。他可以分为两种方式,一是标准的访问控制列表,只能基于源地址进行限制。而是扩展的访问控制列表,他不仅可以基于源地址和目标地址进行过滤,还可以根据端口来进行限制。ACL的工作原理就是读取数据包的三层和四层,和访问控制列表中的条目进行匹配,如有相符的,直接按照策略(允许或拒绝),不在往下匹配。如没有匹配的条目则按照默认规则。

     

    NAT:nat网络地址转换,是为了解决ipv4地址空间不足产生的。

    Nat的原理就是替换掉数据包中的源ip+端口或目标ip+端口,以达到私有地址不能再公网上传播的这种情况,或者是局域网中服务器的发布。Nat一定程度上提高了局域网用户的安全性。

    实现方式大概可以分成 静态NAT,动态NAT PAT(端口复用)

    1.5 [描述一下VLAN]

    VLAN 是为了避免二层出现广播风暴给大面积用户带来影响,所采取的一种手段。

     

    Vlan 带来的好处

    减少广播风暴

    提高一定的安全

    简化网络的管理,有易于故障排查

     

    Vlan 是把局域网进行逻辑上的分割,实现方式有两种

    1.静态vlan 基于端口的vlan (常用)

    2.基于MAC地址的vlan (适合于移动用户)

     

    Vlan之间的通信需要配置TRUNK链路(中继) 封装模式有两种

    Isl  思科私有的技术,在数据帧的头部和尾部添加30字节的标示符

    Dot1q  通过 在mac地址后面打标记的方式 标识vlan 共4个字节  公有协议

    1.6 [RIP和OSPF的区别]

    两者都属于IGP协议,rip是典型的距离矢量动态路由协议。Ospf是链路状态型的协议

    Rip是整张路由表进行广播更新(v2是组播),学习未知的路由条目,有存在环路的情况

    并且没有邻居表,网络收敛速度比较慢。因为有环路的缺陷,不适合较大的网络使用。

    Ospf组播更新,并且只有TOP发生变化的时候才出发更新,把收到更新的路由会放置在LSDB中,并生成路由。Ospf本身没有环路的产生,并且是有分层的结构,而rip是平面的没有层次化。所以ospf比rip收敛速度快。在NBMA网络中还会有DR和BDR的概念,促进了ospf的收敛。

    Rip 管理距离 120  ospf 管理距离 110

    1.7 [解释以下术语的意思]

    LAN   本地局域网

    WAN  广域网

    VLAN 虚拟局域网

    WLAN 无线局域网

    VPN 虚拟专用网

    AD  管理距离,用来衡量不同路由协议生成去往同一目标的可信值

    Metric 度量值,用来判断同一种路由协议生成去往同一目标的优先级

    1.8 [简述一下stp是什么]

    Stp  生成树协议。

    一个良好的网络应该要考虑到链路的冗余,比如二层的交换机做冗余,来防范单点故障带来的问题。但是二层做冗余的话会带来一些问题:

    1.广播风暴,因为二层对未知数据帧的处理是进行广播,而且二层的封装结构又不像三层那样有TTL 的机制来防护。所以一旦广播风暴产生,其他的交换机就会跟着广播,造成链路的堵塞瘫痪。

    2.MAC地址的重复。因为二层的工作原理,会造成交换机对一个MAC的多次重复的去学习,造成不必要的资源浪费,直到设备瘫痪

    3.MAC地址表的不稳定,因为要重复去学习一些地址。造成转发效率缓慢。

    二层环路带来的后果是严重的 ,stp协议就是在冗余的环境下,逻辑上去DOWN掉一个借口,打破环路的产生,同时做到冗余。当环境变化时,会自动跳转down的接口。

     

    1.9 [STP计算的过程]

    1.选择根网桥

    2.选择根端口

    3.选择指定端口

    4.指定阻塞端口

     

    2.0 [描述一下HSRP]

    热备路由协议 是Cisco私有的网关冗余协议。它是由一组路由器(最低2台)构成的一个热备组 作用是为用户提供一个不间断的网关ip,用户通过这个ip访问互联网,即使真实的网关设备DOWN掉一台,也不会影响客户的正常工作。

    原理: 热备组中包含4中路由器的角色,

    活跃路由器:负责承载发往虚拟ip地址的流量,是真正转发用户数据流量的路由器,

    同时向UDP1985发送hello包 表明自己的状态,一个组中只有一台

    备份路由器:监听整个HSRP组的状态,是成为下一个活跃路由器之前的状态,一个组中只有一个 同时向组中发送

    其他路由器:静听整个HSRP组的状态,是备份路由器的候选者

    虚拟路由器:为客户端提供一个虚拟的ip和MAC  能够然活跃路由器转发。

    当活跃路由器Down后 备份路由器收不到hello包 就会成为活跃路由器。而这个转换的过程用户是感觉不到的。

    更多相关内容
  • 100个常见面试问题和答案
  • 主要为大家详细介绍了10道springboot常见面试题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • python面试常见问题

    2021-01-20 02:44:30
    python面试常见问题1、“==”与is的区别2、list与tuple的区别3、python中list与dict4、局部变量和全局变量5、迭代器和生成器6、yield7、import过程8、python装饰器9、python特点(封装、继承、多态)10、垃圾回收...
  • 10个常见的python面试问题

    千次阅读 2021-12-14 11:35:19
    接下来,我将与你分享高频常见10个重要的 Python 问题。 1. .py 和 .pyc 文件有什么区别? .py 文件是程序的源代码。 .pyc 文件是程序的编译字节。 Python 编译 .py 文件并将其保存为 .pyc 文件。 然后由Python...

    全球有超过 800 万名 Python 开发人员。 每天都有成千上万的新学习者加入 Python 社区。 残酷的事实是,只有 10-20% 的人能够成为一名优秀的开发人员并找到一份好工作。 原因是他们无法解决一些高级面试问题。接下来,我将与你分享高频常见的10个重要的 Python 问题。

    1. .py.pyc 文件有什么区别?

    .py 文件是程序的源代码。 .pyc 文件是程序的编译字节。

    Python 编译 .py 文件并将其保存为 .pyc 文件。 然后由Python虚拟机执行。

    在执行主要源代码之前,python会查找它的编译版本(.pyc 文件),如果 python 找到,那么它将在虚拟机的帮助下执行它。
    如果没有,那么它将寻找一个 .py 文件编译它然后执行 .py 文件。 基本上,.pyc 文件通过再次执行已编译的代码来节省编译时间。

    2. 什么是抽象?如何在Python中实现抽象?

    抽象用于向用户隐藏函数的内部功能。他们可以与函数交互并生成结果,但不知道结果是如何生成的。

    简单来说,抽象就是用来对用户隐藏不相关的数据,以降低程序的复杂度。 在 Python 中借助 ABC 模块,我们可以实现抽象。

    抽象类也可以作为其他类的基石,因为你不能为抽象类创建对象,所以访问元素的唯一方法是使用继承。

    from abc import ABC, abstractmethod
    
    class Parent(ABC):
    
        @abstractmethod
        def show(self):
            pass
      
    class child(Parent):
        def show(self):
            print("Child Class")
    
    obj = child() # 抽象类不能被实例化
    obj.show() # Child Class
    

    3. 什么是 FrozenSet ?举例说明它的重要性。

    FrozenSets 类似于集合,唯一的区别是它们是不可变的。

    你可以随时修改 set 的元素,但 frozenset 一旦创建就无法修改。

    这意味着不能在创建后执行添加、删除或更新任何元素。
    frozenset 将可迭代对象作为输入并使它们不可变。由于冻结集是不可变的,因此它们可以作为字典中的键。

    data = {"Name": "Roger", "Pin": 3056, "ActNo":9892345112234565}
    fSet = frozenset(data)
    print(fSet) # frozenset({'Name', 'Pin', 'ActNo'})
    

    4. 浅拷贝与深拷贝的区别说明?

    浅复制 将对象的引用存储在新的内存位置。对新位置所做的更改也会反映在以前的位置上。它比深拷贝更快。

    深度复制 将对象的值存储在新位置。对新位置所做的任何更改都不会反映在以前的位置上。

    id 用于查看对象的内存地址。当然,下面例子的地址在你的计算机上是不同的。

    ## 浅拷贝 
    data = [1, 2, 3, 4, 5]
    updated_data = data
    updated_data.append(6)
    print(updated_data) # [1, 2, 3, 4, 5, 6]
    print(data) # [1, 2, 3, 4, 5, 6]
    print(id(data)) # 16777216
    print(id(updated_data)) # 16777216
    
    
    ## 深拷贝 
    import copy
    data = [1,2,3,4,5]
    updated_data = copy.deepcopy(data)
    updated_data.append(6)
    print(updated_data) # [1, 2, 3, 4, 5, 6]
    print(data) # [1, 2, 3, 4, 5]
    print(id(updated_data)) # 16777216
    print(id(data)) # 14020317
    

    5. pickle如何使用?

    Pickling 是将 Python对象 转换为 字节流 的过程, 通常称为序列化。

    Unpickling 是逆操作,将 字节流 转换成 python对象, 通常称为反序列化。

    python中我们用pickle.dumppickle.load 来实现序列化和反序列化。

    ## Pickling
    import pickle
    data =  {
        'Names': ["Karl","Robin","Lary"],
        'Id': ('G770531','G770532','G770533'),
        'Salary':[55600,88900,76000]
        }
    output = open('./data.pkl', 'wb')
    pickle.dump(data, output)
    output.close()
    
    ## Unpickling
    import pickle
    stream = open('./data.pkl', 'rb')
    data = pickle.load(stream)
    print(data) # {'Names': ['Karl', 'Robin', 'Lary'], 'Id': ('G770531', 'G770532', 'G770533'), 'Salary': [55600, 88900, 76000]}
    stream.close()
    

    6. 参数*args**kwargs是什么?

    *args**kwargs 都允许将可变数量的参数传递给函数。当不确定要在函数中传递的参数数量时,将使用它们。

    *args 允许你将可变数量的参数传递给函数。

    def addNumbers(*numbers):
        sum = 0
        for number in numbers:
            sum = sum + number
        print("Sum: ",sum)
    addNumbers(3,5) # Sum: 8
    addNumbers(5,6,7) # Sum: 18
    

    **kwargs 允许你将可变数量的关键字参数传递给函数。

    def addNumbers(**data):
        sum = 0
        for key,value in data.items():
            sum = sum+value
        print("Sum: ",sum)
        
    addNumbers(a=5, b=6) # Sum: 11
    addNumbers(a=5, b=8, c=10) # Sum: 23
    

    7. 如何理解python中的资源管理器?

    上下文管理器用于资源管理。它们允许你在需要时分配和释放资源。上下文管理器最常用和最受认可的例子是 with 语句。 它主要用于打开和关闭文件。with 允许在单行出现问题时打开和关闭文件。 它的主要优点是它可以确保文件正确关闭。

    with open ('./data.txt','w') as f:
        f.write("Hello")
    

    8. 如何理解python中的实例方法、类方法和静态方法?

    在 Python 中,可以定义三种方法——实例方法类方法静态方法

    • 实例方法: 是我们在创建类时创建的普通方法。这些方法与对象有关。这些方法的语法是 def do_something(self) ,其中 self 指的是实例对象。

    • 类方法: 与实例对象略有不同。它们与类绑定,而不是与类的对象绑定。这些用于执行类任务并可以更改类的状态。我们用@classmethod装饰器创建一个类方法。

    • 静态方法: 是指在类中定义的方法,主要为了程序逻辑的清晰,这些方法与类无关,而且不需要类的实例。我们用@staticmethod装饰器创建一个静态方法。

    9. 什么是nolocalglobal变量?

    它们都用于定义变量的范围。Global 是在函数作用域之外定义的变量。 该变量的值对于整个代码是相同的。它可以在程序的任何地方使用。

    pi = 3.14  ## 全局变量 
    def circle(radius):
        area_of_circle = pi * (radius) ** 2
        print("The area of the circle is: ",   area_of_circle)
    circle(7) # The area of the circle is:  153.85
    

    NonLocal是在未定义局部作用域的嵌套函数中使用的变量。如果你改变非局部变量的值,局部变量的值也会改变。

    def outer_function():
        x = "local_variable"
        def inner_function():
            nonlocal x
            x = "nonlocal_variable"
            print("inner function:", x)
        inner_function()
        print("outer function:", x)
    outer_function()
    # inner function: nonlocal_variable
    # outer function: nonlocal_variable
    

    10. 举例说明 Generator?

    生成器是一种返回可迭代对象的函数。 Generator 函数必须至少包含一个 yield 语句。 yield 是 Python 中的一个关键字,用于从函数返回值而不破坏其当前状态或对局部变量的引用。 带有 yield 关键字的函数称为生成器。

    生成器仅在被要求执行时生成一次项目。 它们的内存效率很高,占用的内存空间更少。

    初学者,可以把yield理解为return的另一种形式, 但是它不会停止函数的执行,而是返回一个值。

    def fibon(limit):
        a,b = 0,1
        while a < limit:
            yield a
            a, b = b, a + b
            
    for x in fibon(10):
        print(x) # 1 2 3 5 8 13 21 34 55 89
    

    小节

    上面分享了python面试中的高频常见的10个问题,希望某天你想跳槽了或准备找一份工作,对你有所帮助!

    欢迎大家点赞、收藏,支持!

    pythontip 出品,Happy Coding!

    公众号: 夸克编程

    点击此处文中代码均可运行

    展开全文
  • MQ的几个常见面试问题

    千次阅读 2021-12-17 10:11:52
    A完全不需要考虑给谁发送数据,不需要维护这代码,也不需要考虑别人是否调用成功、失败超时等情况。 异步 削峰:减少高峰时刻对服务器的压力。 2、MQ的优缺点 优点上面说了,解耦、异步、削峰 ...

    1、为什么要用MQ?

    关键词:解耦、异步、削峰

    1. 解耦:比如A要发数据给BCD,通过接口调用发送。此时新增E,或C现在不需要这个数据了,此时就很难受了。如果使用MQ,A发送消息到MQ,谁需要就就去订阅。A完全不需要考虑给谁发送数据,不需要维护这个代码,也不需要考虑别人是否调用成功、失败超时等情况。

    2. 异步

    3. 削峰:减少高峰时刻对服务器的压力。

    2、MQ的优缺点

    优点上面说了,解耦、异步、削峰

    缺点:

    1. 系统可用性降低。万一MQ挂了,整套系统就崩溃了。

    2. 系统负责度提高。新增一套MQ系统,引入了很多问题,比如消息重复消费、消息丢失等等。

    3. 一致性问题。A发送数据给BCD,万一BD成功了,C失败了,就会导致数据不一致。

    3、Kafka、ActiveMQ、RabbitMQ、RocketMQ都有什么区别?

    1. 吞吐量:kafka和RocketMQ支持高吞吐,amq和rmq低一个数量级,但是rmq延迟最低。

    2. 持久化消息:amq和rmq都支持。在不可抗力因素下挂掉了,消息不会丢失。

    3. 高并发:rmq最高

    4. 关注度:rmq比kfk成熟,可用性、稳定性、可靠性都高于kfk

    4、如何保证高可用性?

    以rmq为例,有3种模式:单机模式、普通集群模式、镜像集群模式

    单机模式:生产一般不使用

    普通集群模式:多台机器启动多个rmq实例。创建的queue,只会放在一个rmq实例上,但是每个实例都同步queue的元数据(通过元数据,可以找到queue所在实例)。当消费的时候,实际上当前机器上实例会从queue实际所在的实例上去拉取数据。此方案主要是提高吞吐量,让集群中多个节点来服务某个queue的读写操作。

    镜像集群模式:每个创建的queue,无论是元数据还是消息体都会存在于多个实例上,也就是说,每个rmq节点都有queue的一个完整镜像。

    kafka:由多个broker组成,每个broker是一个节点;当创建一个topic后,这个topic可以划分为多个partition,每个partition可以存在不同的broker上,每个partition就存放一部分数据。这就是一个天然的分布式消息队列,就是说一个topic的数据,分散保存再不同服务器上。

    kafka8.0之后,提供了HA机制,就是replica副本机制。每个partition的数据库都会同步到其他机器上,并选举一个leader,生产者和消费者都与leader打交道,然后其他的副本就是follower。leader挂掉的时候,会从follower中重新选举一个新的leader。

    5、如何保证消息的可靠传输,消息丢了怎么办?

    数据的丢失分为3个方面:生产者、消费者、MQ。

    1. 生产者丢失:

      生产者发送消息到rmq时,数据在半路就丢失了(有可能是网络问题)。可以选择事务功能,但是这样吞吐量会下来。一般来说,在生产者这边设置开启confirm模式,每次写的消息都会分配为一个id,rmq收到消息回传一个ack消息,如果rmq没能处理这个消息,会回调一个nack接口。结合这个机制,可以加入超时重发。

      事务机制和confirm机制的最大不同是:事务是同步的,confirm机制是异步的。

    2. MQ丢失:

      rmq自己弄丢了数据。这个必须开启rmq的持久化,就是消息写入之后会持久化到磁盘。哪怕挂了,恢复之后会自动读取之前存储的数据。

      设置持久化的步骤:

      1、创建queue时设置为持久化,保证持久化queue的元数据。

      2、发送消息的时候设置deliveryMode=2,保证持久化消息数据。配合confirm支持后,只有消息被持久化后,才会通知生产者ack了。

    3. 消费者丢失:消费的时候,刚消费到,还没处理,结果进程挂了,比如重启了,那么rmq认为你消费了。这个时候得用rmq提供ack机制,通过api调用关闭rmq的自动ack机制,消费者需要在每次消费完成后手动ack,就可以保证消费者已经消费完成。

    6、如何解决消息队列的延时以及过期失效问题?队列满了以后怎么处理?有几百万消息持续积压几小时,该怎么解决?

    消息积压处理办法:

    kafka:临时紧急扩容,将现有consumer停掉,新建一个topic,partition是原来的10倍,临时建立好原先10倍的queue数量。然后写一个临时分外数据的consumer,部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的10倍queue中。接着临时征用10倍的机器来部署consumer,相当于把queue资源和consumer资源扩大10倍,以正常的10倍速度消费数据。等消费完积压数据后,恢复原先部署的架构,重新用原来的consumer机器来消费消息。

    rmq:设置过期时间ttl。但是这样会导致大量的数据丢失,采取另外一种方案,就是批量重导。直接丢弃大量积压的数据,等到低峰时间段,写程度把丢失的那批数据一点点查出来,重新灌入mq,把数据补回来。假设10k个订单积压在mq里面没有处理,其中1k个订单都丢了,那么只能写程序把那1k个订单给查出来,手动发到mq再补一次。

    7、给你机会设计一个消息队列,怎么设计?

    几个角度:

    1. 支持可伸缩性,需要的时候快速扩容,就可以增加吞吐量和容量。分布式参考kafka的设计理念,broker->topic-partition,每个partition放一个机器,存一部分数据。当资源不够的时候,给topic增加partition,然后数据迁移,增加机器,就可以存放更多数据了。

    2. 存储方式。存到磁盘,顺序写,可以就没有磁盘随机读写的寻址开销了。

    3. 高可用性。参考kafka,多副本->leader&follower->leader挂了之后重新选举leader对外服务。

    4. 0丢失。confirm机制,持久化,手动ack;

    展开全文
  • 电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我当时最后提问题的时候减分了吧,...
  • 虽然只有10个问题,但是覆盖了angular开发中的各个方面,有基本的知识点,也有在开发过程中遇见的问题,同时也有较为开放性的问题去辨别面试者的基础水准和项目经验,注意答案仅供参考哦~
  • C语言常见面试问题

    千次阅读 多人点赞 2020-07-14 20:17:08
    对于代码块内部的变量声明,static用于改变变量的存储属性,由自动变量改为静态变量,这变量会一直保存到程序运行结束。作用域和链接属性不变。 对于被 static 修饰的类成员变量和成员函数,它们是属于类的,而...

    说一下 static  关键字的作用

    1. static用于修改变量或函数的链接属性,从外部链接属性变为内部链接属性,变量或函数只能在当前文件访问。
    2. 对于代码块内部的变量声明,static用于改变变量的存储属性,由自动变量改为静态变量,这个变量会一直保存到程序运行结束。作用域和链接属性不变。
    3. 对于被 static 修饰的类成员变量和成员函数,它们是属于类的,而不是某个对象,所有对象共享一个静态成员。静态成员通过<类名>::<静态成员>来使用

    说一下const作用

    1. const修饰的变量变常量,只读,不可改变。
    2. const修饰指针所指向的变量,常量指针,指针指向内容不可变,如const int* p 
    3. const修饰指针本身,指针常量,指针本身不可变,int* const p
    4. const修饰函数参数,传递过来的参数在函数内不可以改变。
    • 修饰变量,说明该变量不可以被改变;
    • 修饰指针,分为指向常量的指针和指针常量;
    • 常量引用,经常用于形参类型,即避免了拷贝,又避免了函数对值的修改;
    • 修饰成员函数,说明该成员函数内不能修改成员变量。

    请说一下 C/C++ 中指针和引用的区别

    1. 指针是指向另一个内存的变量,其内容是所指内存的地址,指针有一块自己的内存;引用为存在的对象所起的另外一个名字,即别名。char  a;char  &ra=a;
    2. 指针可以为空,指向的内容也可以改变;引用一开始必须初始化,且不能再引用其他对象,从一而终。
    3. 引用使用是不需要解引用(*),指针需要解引用。
    4. sizeof指针是指针本身大小4,sizeof引用是被引用对象的大小
    5. 指针和引用的自增意义不同,指针++是地址增加,指向下一个内存,引用++是实际值增加。
    6. 作为函数参数传递时,指针其实是值传递,传地址。指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象。
    7. 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。

    请回答一下数组和指针的区别

    1. 指针

    指针是指向另一个内存的变量,其内容是所指内存的地址,指针有一块自己的内存

    保存数据的地址,需要*间接访问数据      

         2.数组

    保存数据,通过索引直接访问数据,通常用于固定数目且数据类型相同的元素。数组名是指针常量,是指向数组第一个元素的地址。

    注:指针指向一个数组时,可用下标访问和解引用访问,此时指针和数组名作用差不多。

    请回答下指针数组和数组指针的区别

    1. 指针数组,是指一个数组里面装着指针,也即指针数组是一个数组。

             如int *a[10],一个有10个指针的数组,每个指针指向一个整形数。

         2. 数组指针,是指一个指向数组的指针,它其实还是指针,只不过它指向整个数组。

             如int (*p)[10],一个指向有10个元素整型数组的指针。注:[]优先级高于*。

         应用:

         1、多个字符串一般可存储在二维数组或指针数组中,所以指针数组用于存放多个字符串,或作为函数参数传递多个字符串;

           注:a、二级指针和指针数组某些时候是一个意思。

                  b、指针数组(也就是元素为指针类型的数组)常常作为二维数组的一种便捷替代方式。

                     一般情况下,这种数组中的指针会指向动态分配的内存区域。

          2、数组指针一般用于指向一个二维数组(其类型是一个指向一维数组的指针)来访问数组的元素。

    请回答下指针函数和函数指针的区别

    • 指针函数,其本质是一个函数,不过它的返回值是一个指针,如:int *fun(int,int)
    • 函数指针,其本质是一个指针,该指针指向了一个函数,所以它是指向函数的指针。

         如:int (*p)(int, int)  p=func, 初始化时给函数名,函数名是该函数的入口地址。

    • 回调函数,就是一个将函数指针作为参数来实现调用其它函数的函数。

         如:void function( int a, int (*p)(int , int) )

    请你回答一下野指针是什么?

    野指针指向了一块随机内存空间,不受程序控制。如1、未初始化的指针,指针指向一个已删除的对象或者指向一块没有访问权限的内存空间;2、free(p)后,p没有置null,。注:指针释放需置NULL。

    说一下 C++和 C 的区别

    1. 设计思想上:C++是面向对象的语言,而 C 是面向过程的结构化编程语言
    2. 语法上:C++具有重载、继承和多态三种特性;C++相比 C,增加多许多类型安全的功能,比如强制类型转换;C++支持范式编程,比如模板类、函数模板等

    说一下#include"stdio.h"和#include<stdio.h>区别

    1. #include<stdio.h>指系统从系统目录开始搜索stdio.h这个文件。
    2. #include“stdio.h”指系统先在当前目录(源文件所在目录)搜索stdio.h这个文件,若没找到,再到系统目录寻找。

    请你说一说 strcpy 和和 strlen

    1. strcpy 是字符串拷贝函数,原型:char *strcpy(char* dest, const char *src);从 src 逐字节拷贝到 dest,直到遇到'\0'结束,因为没有指定长度,可能会导致拷贝越界,造成缓冲区溢出漏洞,安全版本是 strncpy 函数。
    2. strlen 函数是计算字符串长度的函数,返回从开始到'\0'之间的字符个数。

    请你来说一下堆和栈的区别

    1)申请方式:

    栈由系统自动分配和管理,堆由程序员手动分配和管理。

    2)效率:

    栈由系统分配,速度快,不会有内存碎片。

    堆由程序员分配,速度较慢,可能由于操作不当产生内存碎片。

    3)扩展方向

    栈从高地址向低地址进行扩展,堆由低地址向高地址进行扩展。

    4)程序局部变量是使用的栈空间,new/malloc 动态申请的内存是堆空间,函数调用时会进行形参和返回值的压栈出栈,也是用的栈空间

    请你来说一说重载、覆盖和重写

    1. 重载:函数名相同,但是参数参数不同(个数,类型),返回值类型没有要求,在同一作用域中
    2. 覆盖:是指派生类中存在重新定义基类的函数,其函数名,参数列表、返回值类型必须同父类中的相对应被覆盖的函数严格一致
    3. 重写:子类继承了父类,父类中的函数是虚函数,在子类中重新定义了这个虚函数,这种情况是重写

    请你说一说你理解的多态和虚函数

    1. 多态的实现主要分为静态多态和动态多态,

          静态多态主要是重载,在编译的时候就已经确定;

          动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了 virtual 关键字的函数,在子类中重写时候不需要加 virtual也是虚函数。

          2.虚函数:指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用相应对象的函数。

          虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。

    请你来说一说 extern  “C

    C++调用 C 函数需要 extern C,因为 C 语言没有函数重载

    请你回答一下 new/delete 与与 malloc/free 的区别是什么

    1. 首先,new/delete 是 C++的关键字,而 malloc/free 是 C 语言的库函数(stdlib),后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数
    2. malloc 需要给定申请内存的大小,返回的指针需要强转。
    3. new 会调用构造函数,不用指定内存大小,返回的指针不用强转。

    int  main( int  argc, char**  argv )参数意义

    1. 第一个argc,是记录你输入在命令行上的参数(字符串)个数;
    2. 第二个argv[]是个指向字符串的指针数组,即数组元素是指向输入在命令行上的每个参数(字符串)的指针。

                 argv[0]:存储程序名;

                 argv[1]:指向在DOS命令行中执行程序名后的第一个字符串;

                 argv[2]:指向第二个字符串。

    结构体数据对齐原则如下:

    1. 整体空间是占用空间最大成员所占字节数的整数倍;
    2. 按成员顺序给每个成员分配内存;
    3. 成员前面已摆放的空间大小必须是该成员类型大小的整数倍,如果不够则补齐。

           char  1 字节;

           short 2 字节;

           int  4  字节; float  4  字节; long  4  字节;

           double  8  字节; long long  8  字节;

     

    源代码-------------预处理、编译、汇编、链接-----------可执行文件

    .h头文件中的ifndef/define/endif 的作用?

    答:防止该头文件被重复引用。

    说一下volatile关键字作用

    编译优化时,为提高存取速度,有时会把变量读取到寄存器,方便读取;但有时别的线程改变了变量的值,但寄存器值不变,造成程序读取值不一致,所以使用volatile从变量内存中读取。

    修饰某个变量,表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取,从变量的地址中(内存中)读取数据。

    场景:多用于多线程或多CPU编程

    说一下C语言中的内存分区

    1. 代码区:存放CPU执行的机器指令,二进制代码。
    2. 全局存储区:存放全局变量和静态变量。分为未初始化全局变量和静态变量数据区bss段和已初始化全局变量和静态变量数据区data段;
    3. 文本常量区:字符串常量存在在这里,程序结束后系统释放;
    4. 堆区heap:由程序员手动分配释放,由malloc和free分配和释放。程序员不释放,程序结束系统释放。
    5. 栈区stack:由编译器自动分配和释放,存放函数的参数值(形参)、局部变量的值等。

    什么是预编译/预处理,何时需要预编译?

    答:预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

    c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译

    1. 总是使用不经常改动的大型代码体。

        2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

    C语言实现程序跳转到绝对地址0x100000处执行

        强制把绝对地址0x100000转换成函数指针(void (*)())0x100000,然后再调用它:

                   ((void(*)()) 0x100000)()

    写一个标准(对于一个频繁使用的短小函数)

    •  输入两个参数,输出较小的一个:

                #define MIN(A,B) ( ( (A) < (B))? (A) : (B))

    •   定义一个宏,比较a、b的大小,不要用大于、小于和IF运算符:

                #define MAX(A,B) (((A)-(B))>>31 ? (B) : (A))

    • 定义一个宏将变量的第n位置1:

                 #define SET(an) ( a | ( 1 << n ) )

    • 定义一个宏将变量的第n位置0:

                 #define CLEAR(a,n) ( a & ~( 1 << n ) )

    注:左移n位相当于将原数乘以2^n,右移n位相当于将原数除以2^n。左移1位==乘2

    论述含参数的宏与函数的优缺点

    答:                       带参宏                               函数

               处理时间   编译时                                  程序运行时

               参数类型   没有参数类型问题                定义实参、形参类型

               处理过程  不分配内存                            分配内存

               程序长度   变长                                      不变

               运行速度   不占运行时间调用和返回      占用时间

    链表和数组有什么区别

    数组和链表有以下几点不同:

    (1)存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。

    (2)数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。

    (3)数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。

    (4)越界问题:链表不存在越界问题,数组有越界问题。

    说明:在选择数组或链表数据结构时,一定要根据实际需要进行选择。数组便于查询,链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。

    sizeof strlen 的区别

    1. sizeof 是一个操作符,strlen 是库函数string中的函数。
    2. sizeof计算字符串长度包括字符串结尾’\0’,strlen不包括’\0’。并且 sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度(不含’\0’)。

    注:不要用sizeof求存储在数组的字符串长度,那样求得的值是数组的长度。

    1. sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\0‘的字符串作参数,以‘\0’判断字符串是否到结尾。
    2. 编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。

    头文件的作用是什么?

    答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要

    向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,

    而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

    二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声

    明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

    谈谈你对编程规范的理解或认识

              编程规范可总结为:程序的可行性,可读性、可移植性以及可测试性

    求数组a长度:

              N= sizeof(a)/sizeof(a[0])

    !!!!良好的编码习惯:

    1. 符号后面留空格;
    2. 加必要的注释;
    3. 简单直观的变量和函数命名;
    4. 用if(2==n);
    展开全文
  • Hibernate 的 10 个常见面试问题及答案

    千次阅读 2018-09-19 13:29:26
    在Java J2EE方面进行面试时,常被问起的Hibernate面试问题,大多都是针对基于Web的企业级应用开发者的角色的。Hibernate框架在Java界的成功和高度的可接受性使得它成为了Java技术栈中最受欢迎的对象关系影射(ORM)...
  • 10 个常见的压力面试问题

    万次阅读 2018-09-05 12:42:37
    10 个常见的压力面试问题 1、告诉我,你最大的弱点是什么? 回答这种问题的秘诀在于不接受这种否定暗示。不要否认你有缺点,没人会相信世界上有完人;相反,你应该承认一微不足道的弱点或一小小的缺点,然后再说...
  • Mybatis常见面试题(10个必备面试题)

    千次阅读 2022-01-02 22:37:37
    面试题一:什么是Mybatis? (1)Mybatis是一半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能...
  • 如果你要去面试Linux系统运维工程师的职位,下面这十个常见问题一定要会,否则你的面试可能就危险了。这些都是比较基本的问题,大家要理解,不能光死记硬背。 1、如何查看系统内核的版本 这里有两种方法: 1...
  • 本文为大家分享了最常见10个HTML5面试题,希望大家喜欢。 问题1、新的 HTML5 文档类型和字符集是? 答:HTML5 文档类型很简单: HTML5 使用 UTF-8 编码。 问题2、HTML5 中如何嵌入音频? 答:HTML5 支持 MP3、...
  • Hibernate的10个常见面试问题及答案

    千次阅读 2016-08-18 10:15:27
     Hibernate的这个面试问题同Hibernate提供的查询功能相关。命名查询指的是用标签在影射文档中定义的SQL查询,可以通过使用Session.getNamedQuery()方法对它进行调用。命名查询使你可以使用你所指定的一名字拿到...
  • 软件测试工作面试的74个常见问题

    千次阅读 2021-09-30 12:26:19
    软件测试工作的74个常见问题 1、你在测试中发现了一bug,但是开发经理认为这不是一bug,你应该怎样解决? 2、给你一网站,你如何测试? 3、在搜索引擎中输入汉字就可以解析到对应的域名,请问如何LoadRunner...
  • 专题资料
  • 常见的5SQL面试问题

    千次阅读 2020-03-02 15:13:19
    在任何以数据为中心的工作中,对SQL有深刻的理解都是成功的关键,尽管这不是工作中最有趣的部分。事实上,除了SELECT FROM WHERE GROUP BY ORDER BY之外,还有更多的SQL方法。...2)探讨一些SQL面试练习问题...
  • 【面试】MQ常见面试问题

    千次阅读 2019-06-30 20:33:44
    现在java分布式项目中,MQ基本都是必备的消息中间件。或许你曾接触过RabbitMQ, RocketMQ,...今天,简单总结一下关于MQ在面试的一些问题。 1. 什么是消息队列;2. 为什么使用消息队列;3. 使用MQ导致的问题4. 常见MQ对比
  • Python是一面向对象的解释型的交互式高级脚本语言。Python被设计成一种高可读性的语言,因为它大量地使用了英语中的单词作为关键字,而且不像其他语言使用标点符号构成复杂的语法结构,Python的语法结构非常少。...
  • 2、简述计算机网络中的七层模型? 3、常见的HTTP状态码有哪些? 4、TCP的三次握手过程?为什么会采用三次握手,若采用二次握手可以吗...10、列举几种常见的协议,并简述他们的作用? 11、cookie 和session 有什么区别?
  • 10常见的英语面试问题.docx
  • 总结----20常见的算法面试问题

    千次阅读 2021-03-16 15:33:16
    在互联网面试的过程中,有一环节是逃不掉的,就是算法面试。一般,面试官出的面试题都是从题库里抽出来的,很少有自己出新题的(当然,算法笔试过程除外)。所以,只要我们刷题刷的足够多,就总有概率遇到原题。...
  • 大数据开发常见面试问题总结

    万次阅读 多人点赞 2019-01-03 17:08:51
    5、分布式引发的问题 死锁:至少有一线程占用了资源,但是不占用CPU 活锁:所有线程都没有把持资源,但是线程却是在不断地调度占用CPU 需要引入一管理节点 为了防止入口的单点问题,需要引入管理节点的集群 ...
  • SpringBoot常见面试问题

    万次阅读 多人点赞 2019-08-19 09:44:26
    随着 Spring Boot 使用越来越广泛,Spring Boot 已经成为 Java 程序员面试的知识点,很多同学对 Spring Boot 理解不是那么深刻,经常就会被几连环跑给干趴下了! 比如下面这一段的 Spring Boot 问答: 问:你...
  • 46Linux面试常见问题送给你

    千次阅读 2019-09-26 14:35:52
    点击上方“民工哥技术之路”选择“星标”每天10点为你分享不一样的干货作者:PassZhang链接:https://www.cnblogs.com/hystj/p/855...
  • 最新Java面试题,常见面试题及答案汇总

    万次阅读 多人点赞 2019-07-12 08:56:55
    Java最新面试题、面试题答案汇总
  • 历年高职单招面试常见问题集锦

    千次阅读 2021-07-06 06:47:42
    历年高职单招面试常见问题集锦1常识方向一,面试时候,刚进考场,一般会有一张纸放在讲台上,纸上主要是一些针对时政和生活方面的一些问题,典型的问题有:1,你认为当代大学生应该具备哪些素质?你对你的大学生活有...
  • 常见英语面试问答Every job interview has some common questions that you should be prepared to answer. Having good answer for these questions shows your confidence and communication skills, as well as ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 172,866
精华内容 69,146
关键字:

十个常见的面试问题