阿里云面试

  1. 静态关键词

  2. 在C++中的强制类型转换

  3. static_cast和dynamic_cast这两个的区别,应用场景

  4. c++设计模式

  5. 单例模式(并发二阶段锁)

  6. map底层实现

  7. 为什么建hash更耗时(hash函数计算)

  8. 僵尸进程

  9. 僵尸进程怎么简单创建

  10. 信号是怎么用的(没答出来)

  11. 构造函数和析构函数是否可以定义为虚函数

  12. 构造函数和析构函数是否可以调用虚函数

  13. 数据库的了解,mysql的底层引擎

  14. 隔离性

  15. TCP数据包结构,

  16. 操作系统的TCP的状态

  17. 很多Time Wait怎么解决

static_cast和dynamic_cast的区别
1、static_cast<type_id>(exdivssion)
该运算符吧exdission转换为type_id类型,但没有运行时类型检查,来保证转换的安全性。它主要有如下几种方法:
①用于类层次结构中基类和子类之间指针或引用的转换
进行上行转换(把子类的指针或引用转成基类表示)是安全的
进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种准换的安全性也要由开发人员来保证
③把空指针转换成目标类型的空指针
④把任何类型的表达式转换成viod类型
注意:static_cast不能换掉exdivssion的const、volitale、或者_unaligned属性

dynamic_Cast
用法:dynamic_cast<type_id>(exdivssion)
该运算符把exdivission转换成type-id类型的对象。Type-id必须是一个类的指针类的引用或者void*
如果type-id是类指针;类型,那么exdivssion就必须是一个指针,如果type-id是一个引用那么exdivission也必须是一个引用

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换
在类层次进行上下行转换时,dynamic_cast和static_cast效率是一样的
在进行dynamic_Cast的下行转换的时候,具有类型检查功能,比static_cast更安全

map和unorderd_map的比较
优点:有序性、查找效率O(lgn)
缺点:map空间占用大,因为红黑树还要保存父节点和子节点;

unordered_map
优点:查找速度非常快
缺点:哈希表建立比较耗时,因为哈希映射的函数计算。查找合适。
哈希冲突,rehash

进程的信号
产生信号的方式:
① 用户在终端按下某键时,终端驱动程序会发送信号给前台进程,例如Ctrl+C产生SIGINT信号,Ctrl-\产生SIGOUT信号,Ctrl-Z产生SIGSTP信号
硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释为SIGPFE信号,发送给进程。在比如当前进程访问了非法内存地址,MMU会产生异常,内核会将这个异常解释为SIGSEGV信号发送给进程。
③ 一个进程调用kill(2)函数可以发送信号给一个进程。可以用kill(1)命令发送信号给某个进程,kill(1)命令也调用kill(2)函数实现的,如果不明确指定信号则发送SIGTERM信号,该信号默认处理动作是终止进程。当内核检测到某种软件条件时也可以通过信号通知进程,如闹钟超时产生SIGALRM信号,向读端已关闭的管道写数据时产生SIGPIPE信号。如果不想按默认动作处理信号,用户程序可以调用sigaction(2)函数告诉内核如何处理某种信号
④软件产生条件
进程收到信号后,常见的三种信号处理操作:
1、忽略此信号
2、执行该信号的默认处理动作(终止该信号)
3、提供一个信号处理函数(自动以动作),要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉一个信号

Time_wait 过多怎么解决

  1. 编辑内核文件/etc/sysctl.conf:
    ①:表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
    第二次握手的时候,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态称为半开连接。
    **SYN Coolies:**在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
    ②:表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
    ③:表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
    ④:修改系统默认的timeout的时间
    主要就是:是打开系统的TIMEWAIT重用和快速回收
  2. 扩展端口,允许更多的连接
  3. 增加SYN队列的长度。默认为1024,加长队列,可以容纳更多等待连接的网络连接
  4. 设置系统能保留的最大TIME_EAIT套接字的最大数量,如果超过则报错
  5. 扩展服务器

linux 文件系统
1、机械硬盘的物理存储机制
机械硬盘能够被磁化,磁化有两个方向可以用来表示0和1
硬盘:把这种磁性介质做成一个个盘片。使用磁性读写头对磁盘读写
物理、逻辑概念:
①一个硬盘有多张盘片,不同盘片有编号
②每张盘片上的存储颗粒成环形一圈圈排布,每一圈称为磁道,有编号
③每条磁道上有一圈存储颗粒,每512*8 个存储颗粒作为一个扇区,扇区是硬盘上存储的最小物理单位
④N个扇区可以组成簇,N取决于不同的文件系统或文件系统的配置,簇是文件系统中最小存储单元
⑤ 所有盘面上的同一磁道构成一个圆柱,成为柱面,柱面是系统分区的最小单位
在这里插入图片描述
磁头读写文件,首先分区读写,由iNode编号(区内位移的编号)找到对应的磁道和扇区,然后一个柱面一个柱面的今次那个读写。
2、Linux文件系统
对计算机中的数据和硬件资源进行管理,一切皆文件。
一切皆文件和文件目录树的资源管理方式都成了Linux文件体系
Linux文件类型:
普通文件(-)
1. 从linux的角度来说,类似MP4等应用层面上的文件类型属于普通文件
2. linux用户可以根据访问权限对普通文件进行查看、更改和删除
目录文件(d)
1. 目录也是一种文件
2. 目录文件包含了各自目录下的文件名和指向这些文件的指针,打开目录事实上就是打开目录文件,只要有访问去哪先就可以随意访问这些目录下的文件(普通文件的执行权限就是目录的访问权限),但是只有内核的进程能够修改他们
3. 虽然不能修改,但是可以通过vim去查看目录文件的内容
符号链接(l)
1. 指向另一个文件的间接指针,也就是我们常说的软链接
块设备文件(b)字符设备文件(c)
1. 这些文件一般隐藏在**/dev目录下,在进行设备读取外设交互时会被使用到
2. 比如磁
盘光驱就是块设备文件**,串口设备则属于字符设备文件
3. 系统中的所有设备要么是块设备文件,要么是字符设备文件,无一例外
FIFO(p)
1.管道文件主要用于进程间通讯。比如使用mkfifo命令可以创建一个FIFO文件,启用一个进程A从FIFO文件数据,启动进程B往FIFO里数据,先进先出,随写随读。
套接字(s)
1. 用于进程间的网络通信,也可以用于本机之间的非网络通信
2. 这些文件一般隐藏在**/var/run目录**下,证明着相关进程的存在

虚拟文件系统(VFS),对内实现文件系统抽象,对外提供统一的接口
虚拟文件系统VFS是一个超级块,以双向环形链表的形式链接到一起
超级块
索引结点innode
- 文件系统处理文件所需要的所有信息都放在称为索引节点的数据结构inode
- 具体文件系统的索引节点是存放在磁盘上的, 是一种静态结构, 要使用它, 必须调入内存, 填写VFS的索引节点, 因此, 也称VFS索引节点是动态节点
- 文件名可以随时更改, 但是索引节点对文件是唯一的, 并且随文件的存在而存在
- 每个inode节点的大小, 一般是128字节256字节
innode索引结点
dentry目录对象
每个文件除了有一个索引节点inode数据结构外, 还有一个目录项dentry数据结构。
dentry结构代表的是逻辑意义上的文件, 描述的是文件逻辑上的属性, 目录项对象在磁盘上并没有对应的映像
inode结构代表的是物理意义上的文件, 记录的是物理上的属性, 对于一个具体的文件系统, 其inode结构在磁盘上就有对应的映像
一个索引节点对象可能对应多个目录项对象
dentry目录对象
文件对象(file)
- 进程是通过文件描述符来访问文件的
- Linux中专门用了一个file文件对象来保存打开文件的文件位置, 这个对象称为打开的文件描述(open file description)
- 文件描述符是用来描述打开的文件的。 每个进程用一个files_struct结构来记录文件描述符的使用情况, 这个files_struct结构称为用户打开文件表, 它是进程的私有数据
- file结构中主要保存了文件位置, 此外, 还把指向该文件索引节点的指针也放在其中。
- file结构形成一个双链表, 称为系统打开文件表
文件对象
在这里插入图片描述

超级对象是一个文件系统的藐视
索引结点是对文件物理属性的描述
目录项是对一个文件逻辑属性的描述
一个进程所在的位置是由fs_struct来描述的,而一个进程(或用户)打开的文件是由file_struct来描述的,而整个系统所打开的文件是由file结构来描述

gdb调试功能
- 启动程序,可以按照自定义的要求随心所欲的运行程序
- 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
- 当程序被停住时,可以检查此时程序中所发生的情况
- 动态的改变程序的执行环境
gdb启动

  • 直接在shell中运行gdb命令,进入gdb界面后用file program装载程序
  • 在shell 中启动gdb并加载可执行文件 gdb
  • 在shell同时调试一个运行程序和core文件(core是程序非法执行后core dump后产生的文件) gdb program core
  • 调试正在运行的程序 gdb program 或者进入gdp后attach 调试正在运行的进程

gdb断点调试
断点设置命令break(缩写b) 格式:break [LOCATION] [thread THREADNUM] [if CONTION]
watchpoint观察点,数值发生变化停住

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值