面试技术杂ji——需要解决的问题

2023-05-16

需要搞明白的几个问题:
1、3次握手和4次挥手
2、TCP与UDP的区别
3、如果TCP连接出现问题该如何排查,说明排查的思路
连接断开或者出错,会返回一个错误码,errorNo  最后一次系统调用返回的错误码,来看错误的类型。
4、三元组算法问题
5、查询linux系统中的cup和内存占用率
如果查到具体是哪一个进程占用的比较多,你会怎么做?
如何能够降低程序的cpu或者内存的占用率

看是网络程序占用的还是业务逻辑计算功能占用的
如果是网络连接程序,你把网络断了,它还占用那么大,那么网络程序写的有问题
如果是逻辑计算功能占用,我把它的所有数据输入都去掉,如果它还占用那么大,那么业务逻辑计算程序就写的有问题。

6、什么时候使用多线程,什么时候使用多进程
7、单例模式在什么情况下使用,有什么好处
8、对于临界资源的访问有哪几种控制方式
9、什么是原子操作
10、有没有使用过线程池?
explict关键字

    //std::atomic_int         atomic_int_;//原子
    //std::atomic_bool        atomic_bool_;
    //std::shared_ptr<type_A> ptr_a = std::make_shared<type_A>();
    //std::shared_ptr<type_B> ptr_a = std::make_shared<type_B>();

学习ros系统如何使用?

变化是复用的天敌!
面向对象设计最大的优势在于:抵御变化
重新认识面向对象:
理解格力变化:从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。
各司其职:从微观层面来看,面向对象的方式更强调各个类的责任,由于需求变化导致的新增类型不应该影响原来类型的实现——所谓各司其职
对象是什么?
从语言实现层面来看,对象封装了代码和数据
从规格层面讲,对象是一系列可被使用的公共接口
从概念层面讲,对象是某种拥有责任的抽象。

依赖倒置原则
高层模块(稳定)不应该依赖于底层模块(变化),二者都依赖于抽象(稳定)
抽象(稳定)不应该依赖于实现细节(变化),实现(变化)细节应该依赖于抽象(稳定)
开发封闭原则(OCP)
对扩展开放,对更改封闭。(优先添加代码,而不是修改原来的代码)
类模块应该是可扩展的,但是不可修改。

单一责任原则
一个类应该仅有一个引起变化它的原因。
变化的方向隐含着类的责任。

里氏替换原则
子类必须能够替换他们的基类
继承表达类型抽象

接口隔离原则
不应该强迫客户程序依赖它们不用的方法。
接口应该小而完备
优先使用对象组合,而不是类继承
类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
继承在某种程度上破坏了封装性,子类父类耦合度高
而对象组合则只要求被组合的对象具有良好的定义接口,耦合度低。

封装变化点:(一侧变化,一侧稳定)
使用封装来创建对象之间的分界层,让设计者可以在分界层一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。

针对接口编程,而不是针对实现编程
不将变量类型声明为某个特定的具体类,而是声明为某个接口。
客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
减少系统中各部分的依赖关系,从而实现“高内聚低耦合”的类型设计方案。

接口标准化

template method

从目的来看:
创建型模式:将对象的部分创建工作延迟到子类或其他对象,从而应对需求变化为对象创建时ju

面向对象设计模式是“好的面向对象设计”所谓面向对象设计,指那些可以满足“应对变化”,提高复用的设计

现代软件设计特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式”从而来更好的应对  
需求的变化,什么时候什么地点应用设计模式。比  设计模式本身,更为重要。

设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。
敏捷开发实际提倡的Refactoring to Patterns是目前普遍公认的最好的使用设计模式的方法


代码重构关键技法:
静态       -> 动态
早绑定     -> 晚绑定
继承       -> 组合
编译时依赖 -> 运行时依赖
紧耦合     -> 松耦合

组件协作模式
现代软件专业 第一个结果是“框架与应用程序划分”,“组件协作,模式通过晚期绑定”,
来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。

典型模式:
Template Method
Strategy
Observe/Event

定义定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。
Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤    。

对象性能模式
面向对象很好地解决抽象的问题,但是必不可免地要付出一些代价,对于通常情况来讲,面向对象的成本大都可以忽略不计,
但是某些情况,面向对象所带来的的成本必须谨慎处理。
经典模式Singletion
怎么样利用面向对象技术实现一些松耦合的设计。
面向对象需要付出一些代价比如说抽象会有虚函数,内存的消耗

使用动机:
在软件系统中,经常有一些特殊的类,必须保证他们在系统中只存在一个实例,才能确保他们的逻辑正确性、以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
这应该是是类设计者的责任,而不是使用者的责任。


class Singleton
{
private:
    Singleton();
    Singleton(const Singleton& other);//单例模式的构造函数和拷贝构造函数是私有的
public:
    static Singleton* getInstance();
    static Singleton* m_instance;    
};

Singleton* Singleton::m_instance = nullptr;

//线程非安全版本
Singleton* Singleton::getInstance()
{
    if(m_instance == nullptr)
    {
        m_instance = new Singleton();
    }
    return m_instance;

}

//线程安全版本,但是锁代价比较高。
Singleton* Singleton::getInstance()
{   
 
        mutex_1.lock();
        if(m_instance == nullptr)
        {
            m_instance = new Singleton();
        }
        mutex_1.unlock();

    return m_instance;
}

//双重检查,但由于内存读写reorder不安全  存在问题
Singleton* Singleton::getInstance()
{   
    if(m_instance == nullptr)     //双重检查
    {
        mutex_1.lock();
        if(m_instance == nullptr)
        {
            m_instance = new Singleton();
        }
        mutex_1.unlock();
    }
    return m_instance;
}

一定是先分配内存,在执行构造器,在进行赋值


//c++11版本之后的跨平台(volatile)
std::atomic<Singleton*> Singleton::m_instance;//声明一个原子对象
std::mutex Singleton::m_mutex;

Singleton* Singleton::getInstance()
{
   Singleton* tmp= m_instance.load(std::memory_order_relaxed);
   std::atomic_thread_fence(std::memory_order_acquire);//获取内存fence
   if(tmp == nullptr)
   {
      std::lock_guard<std::mutex> lock(m_mutex);
      tmp = m_instance.load(std::memory_order_relaxed);
      if(tmp == nullptr)
      {
          tmp = new Singleton;
          std::atomic_thread_fence(std::memory_order_release);//释放内存fence
          m_instance.store(tmp,std::memory_order_relaxed);
      }
   }
   return tmp;
}

保证一个类仅有一个实例,并提供一个该类的全局访问点。


子问题要满足的性质:
1 子问题的范围更小,且子问题个数有限。
2.最优子结构:原问题的目标值(最大/最小/计数),一定是由子问题的目标值转移而来。
3、无后效性:子问题的目标值求解仅局限于子问题的规模,与由那个母状态转移而来无关。


动态规划解题过程
1、定义问题状态:定义问题的状态,已经目标值
2、考虑状态转移:考虑当前状态做出的选择,得到当前状态转移成的子状态,问题规模得到减小。
3、解决子问题:解决规模更小的子问题,并通过子问题的结果更新答案。定义最小的子问题的初始值。

递归求解
int dp(int i,int j)
{
    if(i == n && j == n) return w[i][j];
    int ret =0;
    if(i+1<=n) ret = max(ret,dp(i+1,j));
    if(j+1<=m) ret = max(ret,dp(i,j+1));
    return ret+w[i][j];
}

字符串面试题的特点
1、广泛性
字符串可以看做字符类型的数组。
与数组排序、查找、调整有关。
很多其它类型的面试题可以看做字符串的面试题。

需要掌握的几个概念:
1、回文
2、字串(连续)
3、子序列(不连续)
4、前缀树(Trie树)
5、后缀树和后缀数组
6、匹配
7、字典序
字符串的操作
1、与数组有关的操作:增删改查
2、字符的替换
3、字符串的旋转

字符串题目的常见类型
1、规则判断
  判断字符串是否符合正数规则
  判断字符串是否符合小规则
  判断字符串是否符合回文规则
  
  2、数字运算
  int 和long类型表达整数范围有限所以经常用字符串实现大整数,与大整数相关的加减操作,需要模拟笔算的过程
  
  3、数组的操作相关
  数组有关的调整

ListNode* reverse(ListNode* head)
{
    ListNode* pre =nullptr;
    auto p1=head;
    while(p1)
   {
      auto next = p1->next;
      p1->next = pre;
      pre = p1;
      pre =next;
   }   
   return p1;
}
    


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试技术杂ji——需要解决的问题 的相关文章

  • STL c++ 使用小结

    各位看官 xff0c 欢迎来到趁热搬砖小码农的博客 在写C 43 43 程序的时候会发现STL是一个不错的东西 xff0c 减少了代码量 xff0c 使代码的复用率大大提高 xff0c 减轻了程序猿的负担 还有一个就是容器 xff0c 你会
  • Oracle面试题,带答案!

    1 你要对操纵Oracle数据库中的数据 下列哪个选项表示Oracle中select语句的功能 xff0c 并且不需要使用子查询 xff08 C xff09 A xff0e 可以用select语句改变Oracle中的数据 B xff0e 可
  • 什么是进程?什么是线程?总结

    1 什么是进程 xff1f 什么是线程 xff1f 进程是表示资源分配的基本单位 xff0c 又是调度运行的基本单位 例如 xff0c 用户运行自己的程序 xff0c 系统就创建一个进程 xff0c 并为它分配资源 xff0c 包括各种表格
  • C++知识点小结(趁热搬砖三年半的小码农) 2020年07月2日整理

    c 43 43 最好用易用的新特性 xff1a auto decltype https blog csdn net zyc2018 article details 93591189nullptr range forusing c 43 43
  • 如何定位内存泄漏问题

    如何定位内存泄漏问题 Things You 39 ll Need Proficiency in C 43 43 C 43 43 compilerDebugger and other investigative software tools
  • C++之future和promise

    C 43 43 之future和promise future和promise的作用是在不同线程之间传递数据 使用指针也可以完成数据的传递 xff0c 但是指针非常危险 xff0c 因为互斥量不能阻止指针的访问 xff1b 而且指针的方式传递
  • linux常用小知识点

    答案linux考试题 1 在登录Linux时 xff0c 一个具有唯一进程ID号的shell将被调用 xff0c 这个ID是什么 b A NID B PID C UID C CID 答 xff1a w命令查看用户tty终端信息 ps ef
  • 无锁编程基础

    背景 我们处在技术快速发展的时代 xff0c 竞争变得前所未有的激烈 xff0c 不仅要十八般武艺俱全 xff0c 还得选对正确的技术 xff0c 跟上发展的脚步 xff0c 并贴上精研某个专业方向的标签 我们不仅要面对多线程和并发 xff
  • Linux网络相关概念和修改IP地址的方法

    网卡的命名规则 ifconfig xff1a 用于显示或设置网络设备 ens32 span class token punctuation span flags span class token operator 61 span span
  • 二维坦克大战游戏代码开发

    这是我实际面试中 xff0c 遇到的一个题目 xff0c 编写一个坦克大战游戏 一开始感觉懵 xff0c 后来代码写写就好了 include lt iostream gt include lt stdlib h gt include lt
  • 软件系统性能常识

    不管是系统设计人员 开发人员还是测试人员 xff0c 要构建高性能的系统 xff0c 对于系统性能的一些常用术语都不了解 xff0c 那是无从做起的 xff0c 这里主要介绍几个软件性能指标的术语及计算方法 xff0c 便以在性能优化及性能
  • Socket的三种轮询方式select、poll、epoll之间的区别

    select poll epoll之间的区别 搜狗面试 1 select 61 61 gt 时间复杂度O n 它仅仅知道了 xff0c 有I O事件发生了 xff0c 却并不知道是哪那几个流 xff08 可能有一个 xff0c 多个 xff
  • linux后端c++开发人员需要学习的技术栈

    数据结构和算法 学完之后要刷leetcode xff08 剑指offer xff09 计算机网络 tcp ip 协议栈 xff08 tcp ip详解 xff09 操作系统 进程和线程 并发 和锁 内存分布调度等等 xff08 深入理解操作系
  • 内核态和用户态的区别

    内核态和用户态的区别 当一个任务 进程 执行系统调用而陷入内核代码中执行时 xff0c 我们就称进程处于内核状态 此时处理器处于特权级 最高的 0级 内核代码 当进程处于内核态时 xff0c 执行的内核代码会使用当前的内核栈 每个进程都有自
  • Linux查找命令四剑客awk、sed、find(locate)、grep讲解

    目录 find命令 xff1a 一旦执行了chmod 000 那么如何恢复权限呢 xff1f 2 grep xff08 找文件内容 行操作 xff09 3 awk 4 sed 找文件内容 行操作 find命令 xff1a 1 find xf
  • go语言学习笔记,特点

    1 并发编程 Go语言在并发编程方面比绝大多数语言要简洁不少 xff0c 这一点是其最大亮点之一 xff0c 也是其未来进入高并发高性能场景的重要筹码 golang的并发执行单元是一种称为goroutine的协程 协程又称为微线程 xff0
  • 进程调度,一个调度器的自白

    进程调度 xff0c 一个调度器的自白 我是一个进程调度器 我的职责是调度计算机内所有的进程 xff0c 为他们分配 CPU 资源 1 批处理时代 想当初 xff0c 操作系统创造我时 xff0c 只是打算让我用 FCFS 调度算法 xff
  • 厉害了!除了find命令,还有这么多文件查找命令,高手必备!

    目录 1 locate 2 whereis 3 which 4 type 1 locate locate命令其实是 find name 的另一种写法 xff0c 但是要比后者快得多 xff0c 原因在于它不搜索具体目录 xff0c 而是搜索
  • 浅析Linux中的零拷贝技术

    浅析Linux中的零拷贝技术 目录 浅析Linux中的零拷贝技术 引文 什么是零拷贝技术 xff08 zero copy xff09 xff1f 使用 mmap 使用sendfile 使用splice 本文探讨Linux中 主要的几种零拷贝

随机推荐

  • Linux用户管理(Centos7)

    用户管理 用户命令 添加登录用户 xff1a 例 xff1a 添加一个名为harry的用户 xff0c 并使用bash作为登录的shell span class token punctuation span root 64 aws span
  • CPU明明8个核,网卡为啥拼命折腾一号核?

    中断机制 我是CPU一号车间的阿Q xff0c 我又来了 xff01 我们日常的工作就是不断执行代码指令 xff0c 不过这看似简单的工作背后其实也并不轻松 咱不能闷着头啥也不管一个劲的只管执行代码 xff0c 还得和连接在主板上的其他单位
  • 好久没出去面试了,没想到问这么难...

    好久没出去面试了 xff0c 没想到问这么难 1周前 不知道你们多长时间没有参加过面试了 xff0c 最近这段时间的面试 xff0c 真的是一个比一个严格 xff01 我昨天参加了一线大厂的技术面 xff0c 被问到了一些并发相关的问题 x
  • 救命,Linux正在吃掉我的内存!

    内存发现自己的空闲空间越来越少 xff0c 经过一番调查 xff0c 发现罪魁祸首居然是Linux老大 xff01 内存 xff1a Linux老大 xff0c 这也没几个程序在运行 xff0c 可是你为什么老是占用我的内存啊 xff0c
  • 太高效了!玩了这么久的Linux,居然不知道这7个终端快捷键!

    作为 Linux 用户 xff0c 大家肯定在 Linux 终端下敲过无数的命令 有的命令很短 xff0c 比如 xff1a ls cd pwd 之类 xff0c 这种命令大家毫无压力 但是 xff0c 有些命令就比较长了 xff0c 比如
  • 这样处理Shell脚本参数,爽多了!

    这样处理Shell脚本参数 xff0c 爽多了 xff01 在 shell必备基础知识 中说到了一些入口参数的基本使用 xff1a home shouwang test sh para1 para2 para3 0 1 2 3 脚本名 第一
  • 面试官:kill -9 进程杀不掉,怎么办?

    用ps和grep命令寻找僵尸进 ps A ostat ppid pid cmd grep e 39 Zz 39 命令注解 xff1a A 参数列出所有进程 o 自定义输出字段 我们设定显示字段为 stat xff08 状态 xff09 pp
  • GCC为何如此强大? 动态库与静态库

    做软件开发的读者 xff0c 应该对GCC都不会陌生 xff0c 之所以大家都能知道它 xff0c 了解它 xff0c 是因为它有许多特殊 强大的 功能 一 GCC发展史 GNU 项目计划的主要目的是创建一个名叫 GNU s Not Uni
  • 看完这篇操作系统,和面试官扯皮就没问题了。

    解释一下什么是操作系统 操作系统是运行在计算机上最重要的一种软件 xff0c 它管理计算机的资源和进程以及所有的硬件和软件 它为计算机硬件和软件提供了一种中间层 通常情况下 xff0c 计算机上会运行着许多应用程序 xff0c 它们都需要对
  • extern “C”的作用详解

    extern 34 C 34 的主要作用就是为了能够正确实现C 43 43 代码调用其他C语言代码 加上extern 34 C 34 后 xff0c 会指示编译器这部分代码按C语言 xff08 而不是C 43 43 xff09 的方式进行编
  • Linux 进程与程序区别与联系

    一 xff0c 什么是程序 xff1f 程序是完成特定任务的一系列指令集合 二 xff0c 什么是进程 xff1f 从用户的角度来看进程是程序的一次动态执行过程从操作系统的核心来看 xff0c 进程是操作系统分配的内存 CPU时间片等资源的
  • 软件包的管理(Centos7)

    软件包类型 xff1a rpm软件包的管理 xff1a rpm包格式说明 xff1a span class token punctuation span root 64 aws span class token operator span
  • unix环境编程1 环境变量

    预处理 编译 汇编 连接 cpu中有个MMU xff0c 内存处理单元 xff1a 它的作用是 1 处理物理内存与虚拟内存映射的关系 2 设置修改内存访问级别 xff08 0 3级 xff09 内核空间的访问级别为0 用户空间的访问级别为3
  • RSU NTP时间同步配置方式

    RSU NTP同步配时方式 RSU ntp同步配时是基于一个开源工具chrony实现的 xff0c 这个工具集成在RSU里面了 xff0c 网上也能搜索到教程 xff0c 以下是一个参考链接 xff1a Centos使用chrony做时间同
  • Linux回收子进程

    孤儿进程 孤儿进程 父进程先于子进程结束 xff0c 则子进程成为孤儿进程 xff0c 子进程的父进程成为init进程 xff0c 称为init进程领养孤儿进程 include lt stdio h gt include lt unistd
  • C++内存管理(超长,例子很详细,排版很好)

    导语 内存管理是C 43 43 最令人切齿痛恨的问题 xff0c 也是C 43 43 最有争议的问题 xff0c C 43 43 高手从中获得了更好的性能 xff0c 更大的自由 xff0c C 43 43 菜鸟的收获则是一遍一遍的检查代码
  • c++ string 的常用库函数的用法

    目录 一 初始化 二 获取长度 xff08 length size xff09 三 插入 xff08 insert xff09 四 替换 xff08 replace xff09 五 添加 xff08 append xff09 六 赋值 xf
  • linux学习笔记1

    shutdown 一分钟后关机 shutdown c 取消关机命令 shutdown r 重新启动系统 shutdown 43 10 十分钟后关机 ifconfig 查看 配置计算机当前的网卡配置信息 ping 地址 检测目标ip地址的连接
  • 一道爬楼梯的算法题

    一个小孩爬楼梯 xff0c 每次可以爬1个 2个或3个台阶 xff0c 编程求出这个小孩爬完10个台阶的楼梯一共有多少种走法 def main k 61 0 构建函数1 x 43 2 y 43 3 z 61 10 确定x取值范围 for x
  • 面试技术杂ji——需要解决的问题

    需要搞明白的几个问题 xff1a 1 3次握手和4次挥手 2 TCP与UDP的区别 3 如果TCP连接出现问题该如何排查 xff0c 说明排查的思路 连接断开或者出错 xff0c 会返回一个错误码 xff0c errorNo 最后一次系统调