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¬ω¬)