面试之路一---总结

1.动态库和静态库的区别?

当时的我是这样回答的:对于动态库,程序在编译时是一起编译的,而静态库是直接编译到函数里面。

正确答案:

(其实我之前有过总结,但面试就很慌)

首先明白什么是什么是库,库的本质就是很多函数的封装集合,只是里面没有main函数

那什么是动态库呢?(.so,.dll)

动态库的特点是,动态库本身是直接放在机器中的,所以我们变编译的时候直接调用动态库,并不会连动态库一起编译。所以使用动态库编译生成的文件比较小。既然不需要与程序一起编译,生成的程序大小也小这就意味着,动态库的系统移植性好。

那什么是静态库呢?(.a、lib)

静态库的特点是,静态库本身并不会放到机器中,而是和程序一起编译,所以生成的文件本事是比较大的,因此静态库的系统移至性比较差

2.IO模型

简单聊一聊IO模型吧

首先IO模型分为以下几类,阻塞IO,非阻塞IO、多路复用IO、信号驱动IO、异步IO

什么是阻塞IO呢,

        阻塞IO实际上就是最原始的IO,当双端在读取数据和写入数据时都会发生阻塞现象,并且阻塞状态时一直存在的,只有当内核(kernel)将数据拷贝到用户线程,并且返回后,线程才会解除block的状态。

        自然而然解决欸办法也很好想到,那就是分配一个线程专门用来解决阻塞,问题在于使用线程会消耗大量的资源所以。。。

什么是非阻塞IO呢

        看名字就知道了,顾名思义非阻塞IO,就是不会阻塞(废话),实际上设置了非阻塞IO后,当用户线程发起读取操作后,并不需要等待,而是返回一个成功或者失败的状态,如果数据还没有准备好(返回时失败),那么用户线程就会不断的询问数据是否就绪,不断循环上面的过程,直到成功为止,但是实际上不断的循环本身就是一件非常严肃的问题,循环会导致CPU的占用率比较高,所以大家自己揣摩。

什么是多路复用IO呢,(看到多路复用我就很烦)

        实际上多路复用IO在实际生活中应用是比较广泛的,原因在于(1vn),就是说,多路复用可以实现一个线程管理多个socket,并且只有当socket真正有读写事件发生时,才会进行实际的多谢操作。

        下面详细讲讲实现的原理把,在多路复用中,会有一个线程不断的询问多个socket状态,当发现有读写操作时,他才会实现实际的IO操作,这样就不需要去使用大量的线程,导致资源大大减少了。就是说在这个线程能够在很多连接中找到需要发送的接口,然后实现传输,

什么是信号驱动呢,

        信号,肯定就是会发信号啦,当用户发起一个IO操作,他会给对应的接收端注册一个信号函数,然后继续运行,当内核数据就绪时就会发送一个信号给用户线程,当用户接收到信号时,就会在信号函数中进行实际的IO操作。这个不适用于TCP、UDP。因为信号产生太过于频繁了,不好用。

什么是异步IO呢,

        首先在重点说明,异步IO真好用,当用户线程发起一个read操作后,线程就不管它了(自己该干嘛干嘛),然后内核就会收到一个 异步读取(asynchronous read),之后内核则会立法法你返回,并说明read请求已成发出了,所以并不会block。之后内核会等待数据准备完成,完成后他又会向用户线程发送信号,说read完成。用户线程收到信号后就可以直接使用了。

        我们发现,异步IO模型中,IO操作的两个阶段都不会阻塞,这两个阶段是由内核协助完成的,然后告诉线程就可以了,而且用户线程也不用再去调用IO函数进行具体的读写,(信号IO是需要自己进行具体的读写的),另一个方面我们也因该看到,内核调用代表需要你的系统底层能够在支持。

        当然实际工作中我们大多使用的时多线程和线程池完成,在这里就不多说了,

        还有就是两种高性能的IO设计模式 :reactor和proactor,大家自行了解。

3.如果你是和我一样嵌入式方面的linux环境下代码的调试你一定要懂

        我就写一种比较常用的调试方法:gdb调试

        ①在使用gdb调试时,需要在编译时使用-g参数

        

g++ -g test.cpp -o test
gdb ./test

start  //开始调试

list n   //使用list查看n行代码

b (行号 15/函数名 main)//设置断点

info b  //查看所设置的断点

d  (编号(可以在info b 中查看编号)) //删除节点

s    执行一行源代码,如果源代码中有函数则会进入对应的函数

n    执行一行源代码,代码中的函数调用一并执行

r     运行被调试的代码至断点处,

c    继续运行代码直到下一个断点

finish  函数结束

p (变量) 显示变量的值

display (变量) 追踪显示变量的值

undisplay (变量) 取消追踪显示变量的值

set args 设置在指定运行的参数  eg:(gdb)set args 10 20

show args  查看运行时的参数

q  退出调试

help  帮助命令

回车  重复之前的命令

4.熟练的使用linux下的一些命令也是我们嵌入式工程师需要掌握的的技能,很多面试会让你自己举几个例子,列出几个经常用的

①查找命令

       find

        find -name "*.txt" -print 查找txt结尾的文件并输出到屏幕上 
        find /cmd ".sh" -print 查找/cmd目录下所有sh文件,并输出 
        find . -perm 755 -print 查找当前目录下权限为755的文件,并输出 
        find `pwd` -user root -print 查找当前目录下属主为root的文件,并输出 
        find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件 
        find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件 
        find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件 
        find /var -newer "myfile1" ! -newer "myfile2" -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。 
        find /var -type d -print 查找/var目录下所有目录 
        find /var -type l -print 查找/var目录下所有的符号链接文件。 
        find . -size +1000000c -print 查找当前目录下大于1000000字节的文件 
        find / -name "con.file" -depth -print 查找根目录下有无"con.file",若无则在其子目录中查找 
        find . -type f -exec ls -l {} \; 查找当前目录下是否有普通文件,若有则执行ls -l 

②查找文本信息

        grep

        在 ‘/etc/passswd’ 中检索 ‘vivek’ 。                          grep vivek /etc/passwd

        在任何情况下都搜索 ‘vivek’  (即不区分大小):       grep -i -w vivek /etc/passwd

        不区分大小写地检索 ‘vivek’ 和 ‘raj’ :                     grep -E -i -w 'vivek|raj' /etc/passwd  

        索检‘vivek’ 开头的文本                                            grep ^vivek /etc/passwd

       检索以 ‘foo’ 结尾的文本格式:                                 grep 'foo$' FILENAME     

        搜索空白行                                                              grep '^$' FILENAME

        匹配 ‘Vivek’ 或 ‘vivek’                                              grep '[vV]ivek' FILENAME          

        匹配数字 (匹配 vivek1 或 Vivek2 )                     grep -w '[vV]ivek[0-9]' FILENAME

还有一些比较常见的:

        查找可执行文件位置       which ls   //ls就是好可执行文件的一种,cd就不是它属于内建命令

        获取Shell内建命令的帮助信息           help cd

        显示用法信息                                     mkdir --help    

        显示命令的手册页                              man

        打印当前目录                                     pwd

        创建目录                                            mkdir

        创建文件                                            touch

        文本编辑                                            vim

        查看磁盘空间                                     df

        查看内存使用情况                              free

        查看服务器进程信息                           ps -ef

        查看服务器进程占用资源                    top

        重启计算机                                          reboot

        查看网络连接状态                               netstat -tnlp

        文件权限设置                                       chmod 权限参数  文件路径

最后就是shell命令。我就不打算写了,可以去查查看看,上面这些算是比较常用的吧,太麻烦的还是直接查吧,记不住了(lll¬ω¬)

        


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值