面试点 终极

知识点:924

一、c++基础

  1. extern的作用

    1. 与‘C’一起作用时候,则告诉编译器fun这个函数名按着c的规则去翻译相应的函数名

    2. 另一种作用就是声明函数和全局变量的作用的范围关键字,其声明的函数和变量可以在本模块或者其他模块使用,记住它是一个声明而不是定义;

  2. static的作用

    1. 在c中的作用

      1. 修饰局部变量,成为静态变量存储在静态区。存储在静态区的数据生命周期和程序相同,在main函数之前初始化,在程序退出时候销毁(无论全局还是局部)

      2. 修饰全局变量:全局变量本来就存储在静态区,因此static并不能改变其存储位置,但是static限制了其链接属性。呗static修饰的全局变量智能呗包含该定义的文件访问;

      3. static修饰函数使得函数只能在包含该函数定义的文件中被调用;

    2. 在C++中具备c中的所有作用,而且对于静态成员变量和静态成员函数,所有的对象都只维持一个实例,因此static可以实现不同对象之间的数据共享;

  3. voliate定义的变量会在程序外被改变,每次都必须从内存中读取,而不能放在寄存器或者是cache中重复使用;

  4. const的作用(越多月好)

    1. 修饰变量为常量

    2. 修饰函数;表示函数中的成员变量不可以改变

    3. 答法2:

      1. 定义常量

      2. 指针使用const

      3. 函数使用const

        1. const修饰函数参数

        2. 参数指针所指向的内容为常量不可变

        3. 参数指针本身不可变

        4. 参数为引用,增加效率并且防止修改;

      4. 类相关const

        1. const 修饰 成员变量

        2. const修饰成员函数

        3. 修饰类对象、对象指针、对象引用;

  5. new/malloc的区别

    1. malloc/free是c++、c的标准库函数,new/delete是c++的运算符;都可以申请动态和释放内存;

    2. 对于非内部数据类型的对象而言光用malloc/free无法满足动态对象的要求;对象在创建的同事要自动执行构造函数,在消亡之前要自动执行析构函数;由于malloc、free是库函数 而不是运算符,不在编译器控制权限范围之内,不能够把执行构造函数和析构函数加给malloc和free;

    3. 因此c++语言需要一个能够完成动态分配内存和初始化工作的运算符new;和一个能够完成清理和释放内存的运算符 delete

    4. C++程序要经常调用c函数,而c只能调用库函数 malloc、free来管理动态内存;

    5. new可以认为是malloc加构造函数的执行,new出来的指针是带类型信息的,而malloc返回的是void*;并且new不需要指定大小;给计算好了;

  6. c++多态性和虚函数表

    1. 多态的实现:虚函数,虚函数允许子类重新定义成员函数,而子类重新定义父类成员函数的做法叫做覆盖;或者是重写;

      1. 重写:重写虚函数;才叫重写

      2. 重载:多个重名的函数,参数的列表不同:参数的类型或者是参数的个数不同;或者是两个都不同;

      3. 多态的作用:封装使得代码模块化,继承可以扩展已存在的代码,目的是使得代码复用,而多态的目的是为了接口重用;也就是说不论传递过来的事哪个类的对象,函数都能够通过同一个接口调用到合适各自对象的实现方法;

      4. 最常见的用法是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同实现方法,如果没有使用虚函数的话,即没有利用c++多态性,则利用基类指针调用相应的函数的时候总被限制在基类函数本身,而无法调用到子类中呗重写过的对象。

      5. 隐藏:

        1. 子类的函数与父类的函数名称相同但是参数不同

        2. 子类函数与父类函数的名称相同,参数也相同,但是父类函数没有virtual,父类函数被隐藏;

  7. 虚函数作用和底层实现

    1. c++中虚函数使用虚函数表和虚函数表指针实现,虚函数表是一个类的虚函数的地址表,用于索引类本身以及父类的虚函数的地址。

      1. 例如子类的虚函数重写了父类的虚函数,则对应在虚函数表中会把对应的虚函数替换为子类的虚函数的地址;虚函数表指针存在与每个对象中(通常处于效率考虑)会放在对象的开始地质处,它指向对象所在类的虚函数表的地址;在多重继承环境下,会存在多个虚函数表指针,分别指向对应不同基类的虚函数表;

      2. 编译器为每一个类维护一张虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表;

    2. 析构函数为什么要定义为虚函数

      1. 为了实现多态进行动态绑定,将派生类对象指针绑定到基类指针上,对象销毁的时候只能调用基类的析构函数,显然只能销毁部分数据,不能销毁全部的,所以。。。

    3. 构造函数、析构函数能抛出异常么

      1. 可以但是不建议;

      2. 构造函数可以抛出异常,但是不建议这样做,因为一旦构造函数抛出异常,析构函数将不会呗执行,需要程序员手动去释放内存;

      3. 析构函数不能抛出异常,如果必须的话,请务必在析构函数内部处理异常,如果析构函数抛出了异常,程序将崩溃;

  8. 为什么使用智能指针?怎么实现的?什么时候改变引用计数?

    1. 原因

      1. 智能指针能够帮助我们处理资源泄漏的问题

      2. 也能帮助我们处理空悬指针的问题

      3. 能够处理比较隐晦的异常造成的资源泄漏

    2. 自从c++11 c++提供两大类型的智能指针

      1. class shared_ptr实现共享式拥有概念;多个指针可以指向相同的对象改对象和其相关资源会在 最后一个引用呗销毁的时候被释放;为了在结构复杂的环境下执行上述工作 标准库提供了 weak_ptr bad_weak_ptr enable_shared_from_this

      2. class unique_ptr 实现独占式拥有,保证同一时间只有一个智能指针指向该对象,它对于避免资源泄漏(new创建的对象异常而忘记释放delete)--特别有用

  9. 四种类型转换

    1. static_cast:允许执行任意的隐式转换和相反转换动作(即使它是不允许隐士的)

    2. dynamic_cast:只用于对象的指针和引用

    3. const_cast:这个转换类型操作传递对象的const属性,或者是设置或者是删除;

    4. reinterpret_cast:转换一个指针为其他类型的指针,允许一个指针转换为整数类型。

  10. c中内存对其原则

    1. 结构体成员按自身长度对其,字对齐指的是该成员起始位置的内存地址必须是它自身长度的整数倍;比如int只能以0 4 8这些地址开始

    2. 结构体的总大小为结构体有效对齐值的整数倍;

  11. 内联函数和宏定义

    1. 宏定义发生在编译前 编译预处理阶段;内联函数发生在编译阶段进行代码替换;

    2. 内联函数和普通函数相比可以加快程序运行的速度,因为不需要终端,在编译的时候可以直接镶嵌到目标代码中;

    3. 内联函数要做参数类型检查,这是跟宏定义的相比的优势;

    4. 对于短小的代码inline可以提升效率,与宏定义相比更安全可靠;但是增加空间消耗;

    5. 使用情况

      1. 一个函数不断被重复调用

      2. 函数只有简单的几行,并且不包含for while switch语句

  12. c++内存管理

    1. 主要5个存储区

      1. bss(未初始化的全局变量、静态数据等;

      2. 栈:存放局部变量和函数参数等

      3. 堆:动态内存分配使用

      4. 数据段:全局变量、静态数据

      5. 代码段:存放程序代码;

    2. 内存错误和处理方法

      1. 内存分配没有成功却使用了它

      2. 内存分配成功但是没有初始化就是用了;

      3. 内存分配成功但是越界访问;

      4. 忘记了释放内存

      5. 已经释放内存但是仍然使用

  13. stl内存池

  14. STL各种数据结构和算法的实现

    1. vector

      1. 数组 扩容;

    2. list

      1. 双向链表,

    3. map/unordered_map

      1. 红黑树/hashtable 插入;有序

    4. set/unordered_set_

      1. 红黑树/hashtable 插入;无序;去重

  15. 手写strcpy strcat strcmp memcpy strstr函数;

  16. 必须在构造函数中初始化里面进行初始化的数据成员有哪些?

    1. const成员,常量,不能被改变,定义的时候必须初始化

    2. 引用成员:&,别名,与目标共享地址,定义的时候必须初始化;

    3. 没有默认构造函数提供系统自动调用

      1. 对象成员:A类的成员是B类的对象,在构造A的时候需要对B类的对象进行构造,当B类没有默认沟槽函数的时候需要在A类的构造函数初始化列表中对B类进行对象初始化;

      2. 类的继承:派生类在构造函数中要对自身成员初始化,也要对继承过来的几类成员进行初始化;当基类没有默认构造函数的时候,通过在派生类的构造函数初始化列表中调用基类的构造函数实现;

  17. 定位内存泄漏

二、数据结构和算法

三、hash表

  1. 哈希表相关的知识

    1. 定义:

    2. 构造方法:

      1. 直接定址法 f(key)=a*key+b;

      2. 数字分析法

      3. 平方去中法

      4. 折叠法

      5. 除留余数法

      6. 随机数法;

    3. 哈希冲突:key1!=key2 f(key1)==f(key2);

    4. 解决哈希冲突

      1. 开放定址法:原理是遇到冲突的时候查找顺着原来哈希地址查找下一个空闲地址然后插入,然是有个问题那就是如果空间不足,就无法插入;

      2. 链地址法:如果遇到冲突,它就会在原地址新建一个空间,然后以链表结点的形式插入到该空间;

      3. 再散列函数法

      4. 公共溢出区法;

    5. STL中hash_map扩容发生什么?

      1. 创建一个新桶,该桶是原来桶两倍大最接近的质数

      2. 将原来的桶里的数通过指针的转换,插入到新桶中(并不是就直接将数据从旧桶中拷贝遍历插入到新桶,二而是通过指针转换;

  2. hash_map 与map的对比

    1. 定义相比:

      1. 相同点:都是STL中的关联式容器,都有以下两个性质

        1. 键值形式:元素类型都是键值形式pair<const key,Data>

        2. 键唯一性:没有两个元素有相同的key

      2. 不同点:

        1. hash_map是哈希关联容器,map是一种将对象的值data和key关联起来的排序关联容器;

    2. 实现:底层分别是hashtable和红黑树;时间复杂度分别为:O(1)和Ologn

    3. 应用对别:需要考虑速度,数据量、内存

      1. hashmap原理:使用hashtable来实现,首先分配内存,形成许多bucket来存放元素,然后利用hash函数,对元素的key进行映射,存放到bucket内,其中hash函数用于定址,额外的比较函数用来解决冲突;过程可以描述为:

        1. 计算元素的key

        2. 通过hash函数对key进行映射(常见的为取模),得到hsh值,即为对应的索引;

        3. 存放元素的key和data在bucket内;

          查询过程:

          1. 计算元素的key

          2. 通过hash函数对key进行映射(常见的为取模),得到hsh值,即为对应的索引;

          3. 比较bucket内元素的key与该key是否相等 不等没有找到

          4. 若相等则取出该元素的data

            所以事先hashmap的最重要的两个东西是hash函数和比较函数

      2. 常用的几个hashmap函数

        1. hash_map(size_type n );

        2. find

        3. [];

        4. insert

        5. erase

      3. 简单来说hashmap是由数组+链表组成的 数

        1. 数组是主体,链表是为了解决hash冲突而存在的;如果定位到的数组位置不含链表,查找很快;

四、树

  1. 二叉树结构、二叉查找树的实现

  2. 二叉树的六种遍历

  3. 二叉树的按层遍历

  4. 递归是解决二叉树的神级方法;

  5. 红黑树的特性:

    1. 每个节点是红色的或者是黑色的

    2. 根节点是黑色的

    3. 每个叶子结点,即空结点是黑的

    4. 如果一个结点是红的那么它的两个儿子都是黑的;

    5. 每个节点,从该结点到其子孙节点的所有路径上包含相同数目的黑结点;

  6. 红黑树和AVL树的区别

    1. 红黑树和AVL树都是平衡树;但是Avl树是完全平衡的;

    2. 红黑树效率更高,因为AVl树保证了其完全平衡 插入和删除的时候再最坏的情况下都要旋转logN次;而红给书插入和删除的次数要比它少;

  7. Trie树(字典树)

    1. 每个节点保存一个字符;

    2. 根节点不保存字符

    3. 每个节点最多有n个子节点;

    4. 查询的复杂度为O(k);k为查询字符串的长度;

五、链表

  1. 链表的插入和删除,单向双向都要会;

  2. 链表问题考虑多个指针和递归

    1. 反向打印链表:递归

    2. 打印倒数第K个结点:前后两个指针;

    3. 链表是否有环;

六、栈和队列

  1. 栈和队列的区别(实现、应用、自身特点)

  2. 典型的应用场景:

    1. 队列先进先出栈后进先出;

    2. 对插入和删除操作的限定:

      1. 栈是限定智能在标的一端进行插入和删除操作的线性表,队列是限定在表的一端进行插入,在表的另一端进行删除操作的线性表;

      2. 删除元素的位置不同,栈的删除操作在表尾部,队列在表头;

    3. 遍历数据速度不同:

      1. 队列:基于地址指针进行遍历;而且可以从头部或者尾部进行遍历,但是不能同时遍历,无需开辟空间,因为在遍历的过程中不影响数据结构,所以遍历速度变焦块;

      2. 栈智能从顶部取出数据,也就是说最先进入栈底的,需要遍历整个栈才能取出来,而且在遍历数据的时候需要开辟临时空间,保持数据在遍历前的一致性;

    4. 应用场景不同:

      1. 栈:包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,dfs等;

      2. 队列:计算机系统中各种资源的管理,消息缓冲器的管理和 BFS;

    5. 顺序栈能够实现多栈空间共享,而顺序队列不能;

七、海量数据处理

  1. 十亿个整数(随机可重复,)中前K个最大的值;

  2. 十亿个整数中频率出现最高的一千个;

八、排序算法

  1. 相当基础 面试让写的 选择 插入 冒泡

  2. 快排、建堆和归并;

  3. 每种算法的时间和空间复杂度;最好最差的平均情况;

九、位运算;

  1. 位运算交换数字

  2. 位运算求和;

  3. 位运算求 100亿个数的中位数;

十、布隆过滤器

十一、网络与 TCP/IP

  1. 既然有ip协议为什么需要传输层

    1. ip协议提供的是不可靠的传输协议,它只是尽力将数据发送到目标主机,但是如果数据包丢失,数据损坏它都不能提供任何解决办法

    2. ip协议只是将数据发送到目的主机,但是应该由哪个应用程序来接收,ip协议无法确定;

      传输层主要解决这两个问题;

  2. tcp udp概述

    1. tcp面向连接的,传输数据之前三次握手,关闭链接 四次挥手;有数据重传、流量控制功能;能够正确处理丢包的问题、有效利用网络带宽。

    2. udp面向无连接的协议;只传输数据,不做任何处理和保证;适合多播,实时音频和视频传输;

  3. ip协议中的两大关键要素:源ip地址和目标ip地址; 传输层 是 源端口号和目的端口号;

  4. 端口号:用于区分同一台主机中正在通信的不同应用程序,因此被称为程序地址;

    1. 分为两种:知名端口号,用于服务器

    2. 动态端口号:用于客户端程序;

  5. tcpudp区别

    1. tcp基于有链接、udp无连接

    2. tcp能保证可靠传输、udp不能

    3. tcp结构复杂,消耗资源多,建立的过程比较复杂。udp比较简单,消耗资源比较少,建立过程比较快;

    4. tcp基于流模式,udp是数据报模式;

    5. tcp只能点对点,udp可以一对一 一对多,或者多对多

    6. tcp有确认重传、拥塞控制机制,udp在没有建立连接或者是对方已经退出的情况下扔会发送数据导致通信流量的浪费;

  6. 用途

    1. tcp:用于实现可靠传输的情况,文件非常重要,对网络拥堵有较高的要求

    2. udp:

      1. 用于高速传输和实时性较高的场合

      2. 包总量较少的通信 DNS。客户端较多

      3. 广播通信;

  7. ip、tcp、udp首部

    1. udp首部:源端口号,目标端口号,包长度,检验和;

    2. tcp首部:20字节固定首部;

      1. 源端口号、目标端口号

      2. 序列号:发送数据时候,用于表示发送数据的位置,完成后,序列号的值等于原来的序列号加上数据长度;

      3. 确认应答号:用于接收端告诉发送端下次应该从哪个位置开始发送,表示前面的数据已经收到;

        1. 数据偏移:实际上就是tcp首部长度;

        2. 保留:一般为0;用于后续扩展;

        3. 控制位:长度为8,从左到右分别是CWR、ECE、URG、ACK、PSH、RST、SYN、FIN

        4. 窗口大小:能够发送数据的最大值;为0的时候可以发送探测窗口

      4. 校验和: 与UDP相同,紧急指针:处理紧急情况

      5. 选项:其他控制设置;、填充

  8. TCP三次握手四次挥手的过程,详细说明tcp状态转换图;

    1. 三次握手和四次挥手的状态变换;

    2. 2MSL是什么状态,作用是什么?

      1. timewait状态;

      2. 作用是:

        1. 让4次挥手关闭流程更加可靠,4次挥手的最后一个ACK是由主动关闭方发送出去的,如果这个ack丢失,被动关闭方会再发送一次FIN过来,如果主动关闭方能够保持一个2MSL的timewait状态,则有更大的机会让地市的ACK被再次发送出去;

        2. 允许老的重复分节在网络中消逝;使得本链接持续的时间内所产生的所有报文段都从网络中流失;不允许在此期间建立一个新的连接;

    3. 为什么是三次 而不是两次或者是四次?

  9. tcp是如何确保可靠传输的

    1. 链接管理 三次握手四次挥手

    2. 数据破坏--校验和

    3. 丢包---应答与超时重发

    4. 分片乱序---序列号

    5. 窗口滑动---提高发送效率,对发送端和接收端进行流量控制;

    6. 加快通信速度,快速重发,三次收到相同消息进行重发;

    7. 流控制--避免网络流量浪费

    8. 拥塞控制---慢启动算法,拥塞窗口;

  10. tcp中的确认应答机制

    1. tcp发送端的数据到达接收主机的时候,接收主机都会返回一个消息,告诉对方已经收到了,这个消息叫做确认应答;发送确认应答的时候,tcp首部中的ACK标志设置为1;

    2. tcp中的确认应答机制是通过序列号和确认应答号来实现的。

    3. 经受时延的确认应答:为了降低确认应答包的数量,提出的;如果在延时内有新的数据,就更新应答,如果没有新的数据到达就发出应答数据包;

    4. Nagle算法:等待服务器应答包到达后再发送下一个数据包;数据在发送端被缓存;如果缓存到达指定大小就发送,或者是上一个数据的应答包到达将缓存区数据一次性发出;

  11. TCP窗口

    1. 窗口是tcp为了解决应答机制等待时间过长而引入的方法,如果没有窗口的话,则tcp每发送一次数据就必须等待应答,收到应答后继续发送;如果没有收到应答则等待一段时间继续重发,如果很长时间都无法收到应答则判断为网络断开。而使用窗口后,窗口的大小指无需等待应答就可以连续发送 多个数据包;

  12. 超时重传

    1. tcp是可靠的传输协议,意味着必须按序,无差错的传送数据和目的端;通过校验和、确认应答和重传来保证

    2. 重传分为:超时重传和快速

      1. 超时重传:开启一个定时器,定时范围内没有收到应打包,则重传

      2. 快速重传:发送端连续收到一个包的三次应答包、立即重传,更高效;

  13. 拥塞控制:慢启动算法和拥塞避免算法

  14. tcp、udp服务器模型

  15. 域名解析过程 ARP RARP DNS

  16. ping和treceroute工作原理

    1. ping使用icmp协议,ping程序的主机向目标主机发送icmp报文,并且等待应答;

    2. traceroute用来侦测源主机到目的主机所经过的路由的情况的重要工具;(ping受ip头的限制,不能完全记录所经过的路由器;

十二、HTTP

 

  1. http1.0 1.1 2.0的区别

    1. http1.0 链接无法复用;线头阻塞

    2. http1.1

      1. 支持持久链接 :在request 和response中的header中的connection是close 或者是keep-Alive来控制;

      2. 增加了请求头和响应头来扩充功能

    3. http2.0

      1. 支持多路复用

      2. 将通信的基本单位缩小为帧;

      3. 首部压缩 支持default和 HPACk算法的压缩;

      4. 服务端推送,服务端可以对一个客户端的一个请求发送多个响应;

  2. http的请求过程 hTTp事务=请求命令+响应结果

    1. 域名解析 DNS协议解析

    2. 建立TCP连接 三次握手

    3. WEB服务器想WEB服务端发送HTTP请求报文;

    4. 服务端响应http请求;

    5. 浏览器解析html代码,并请求html代码中的资源;

    6. 浏览器对页面进行渲染呈现给客户;

    7. 断开tcp链接;

  3. get和post的异同

    1. 区别:都是向服务器发送某种资源请求,主要区别

      1. get:可以在请求的URL地址以?的形式带上交给服务器的数据,多个数据之间以&号进行分割

      2. post:则可以在请求的实体中向服务器发送数据,特点是:传送的数据量无限制;

    2. 标准答案:

      1. get在回退的时候是无害的,post会再次提交请求;

      2. get请求产生的URL地址可以被markbook,而post不可以;

      3. get请求会被浏览器cache,post不会,除非手动设置;

      4. get请求只能进行URL编码;而post支持多种编码方式;

      5. get请求参数会被完整保留在浏览器记录里面,post不会

      6. post请求在url中传递的参数是有长度限制的,而post没有

      7. get更不安全,因为参数直接暴露在URL上;所以不能用来传递敏感的信息;

      8. get参数通过URL传递,post放在request body中;

    3. 但是二者都是httop协议中的两种发送请求

      1. 都是基于tcp、ip;都是tcp链接 所以本质上二者能做的事情都是一样的;

      2. get产生一个tcp数据包;浏览器吧http header和data一并发送出去,服务器相应 200(返回数据)

      3. post产生两个tcp数据包;浏览器先发送header,服务器相应100continue 浏览器再发送data,服务器相应200 ok(返回数据);

    4. 状态码

      1. 2开头: 请求成功,表示成功处理了请求的状态代码

      2. 3开头 请求呗重定向;表示要完成请求,需要进一步操作,通常这些状态代码用来重定向

      3. 4开头:请求错误;这些状态代码表示请求可能出错,妨碍了服务器的处理;

    5. http与https的区别

      1. http:超文本传输协议,以明文方式发送内容,不提供任何方式的数据加密。

      2. https:是以安全为目标的http通道,是http的安全版本,在http下加入SSL层;

        1. https协议需要到ca申请证书,一般需要费用

        2. http是超文本传输,信息是明文的,https则具有安全性的ssl加密传输协议

        3. 二者使用的事不同的链接方式,端口不同 一个是80/443;

        4. http的链接是无状态的;https协议是由ssl+http协议构建的可加密传输身份认证的网络协议,更安全;

      3. https的工作原理:步骤如下:

        1. 客户端使用https的URL访问web服务器,要求web服务器简历ssl链接

        2. web服务器收到客户端的请求后,会将网站的证书信息发送一份给客户端;

        3. 客户端的浏览器与web服务器开始协商ssl链接的安全灯,也就是信息加密的等级;

        4. 客户端的浏览器根据双方同意的安全等级,建立会话秘钥,然后利用网站的公钥将会话私钥进行加密,并传送给网站;

        5. web服务器利用自己的私钥解密出会话密钥

        6. web服务器利用会话密钥机密与客户端的通信;

    ​​

十三、安全相关

 

十四、数据库

  • SQL语言(内外连接,子查询,分组,聚集,嵌套,逻辑)

  • MySQL索引方法?索引的优化?

  • InnoDB与MyISAM区别?

  • 事务的ACID

  • 事务的四个隔离级别

  • 查询优化(从索引上优化,从SQL语言上优化)

  • B-与B+树区别?

  • MySQL的联合索引(又称多列索引)是什么?生效的条件?

  • 分库分表

十五、linux

一、进程与线程

  1. 进程与线程的区别

    1. 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间、资源以及一个或者多个线程;

    2. 线程可以看成是轻量级的进程,是cpu调度和分配的基本单位;

    3. 区别

      1. 调度:

      2. 共享地址空间:

        1. 资源:进程拥有独立的地址空间,资源,所以说共享复杂,需要用到ipc,同步简单;

        2. 线程共享进程的资源,共享简单,但是同步复杂,需要通过枷锁等措施;

      3. 占用内存:cpu:进程占用内存多,切换复杂,cpu利用率低;

      4. 相互影响:进程之间不会相互影响;一个县城挂掉会导致整个系统崩溃

  2. 线程相比进程有哪些优势

    1. 易于调度

    2. 提高并发性

    3. 开销小

    4. 利于充分发挥多处理器的性能;

  3. 什么时候使用多进程?什么时候使用多线程

    1. 多线程

      1. 优点

        1. 无需跨进程边界

        2. 程序逻辑和控制方式简单

        3. 所有线程可以直接共享内存和变量等

        4. 线程消耗的总资源比进程方式少;

      2. 缺点:

        1. 每个线程与主程序公用地址空间,受限于2gb地址空间

        2. 线程之间的同步和加锁控制比较麻烦

        3. 一个线程崩溃可能影响到整个程序的稳定性

        4. 到达一定的线程数之后,即使再增加cpu也无法提高性能;

        5. 线程能提高的总性能有限;线程多了之后调度麻烦,需要消耗较多的cpu

    2. 多进程

      1. 优点

        1. 进程之间相互独立,不影响主程序的稳定性,子进程崩溃没关系;

        2. 通过增加cpu可以扩充性能;

        3. 可以尽量减少线程加锁 解锁的影响,极大提高性能;

        4. 每个子进程都有2GB的地址空间和相关资源,总体能够达到性能上限大;

      2. 缺点:

        1. 逻辑控制复杂,需要和主程序交互

        2. 需要跨进程边界,

        3. 多进程调度开销大

    3. 总而言之:

      1. 需要频繁的创建销毁优先使用线程

      2. 需要大量计算的优先线程

      3. 相关性较强的用线程

      4. 可能扩展到多机分布使用进程;可靠;

  4. linux中进程和线程使用的几个函数

  5. 线程同步

  6. 进程间通信的方式

    1. 匿名管道和命名管道的区别

    2. 共享文件映射 mmap

    3. 常见的信号有哪些

      1. SIGINT

      2. SIGKILL

      3. SIGTERN

      4. SIGSEGV

      5. SIGCHILD

      6. SIGALRM

二、内存管理

  1. 虚拟内存的作用

    1. 可以控制物理内存的访问权限

    2. 最主要的作用是让每个进程拥有独立的地址空间

    3. VA到PA的映射户给分配和释放带来方便

    4. 一个系统如果同时运行着很多进程,为各进程分配的内存之和可能大于实际可用的物理内存,虚拟内存可以使得多进程仍然能够运行;

  2. 虚拟内存的实现

    1. 请求分页存储管理

    2. 请求分段存储管理

    3. 请求段页式存储管理

  3. 操作系统层面对内存的管理?

  4. 内存池的作用 :

    1. 减少内存碎片

    2. 避免内存泄漏

  5. 进程空间和内核空间对内存的管理不同?

  6. Linux的slab层,VAM?

  7. 伙伴算法

  8. 高端内存

十六、

十七、

十八、

十九、

二十、

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值