1、说一说常用的 Linux 命令
mkdir创建文件夹,touch创建文件,mv移动文件内容或改名
rm-r 文件名:删除文件
cp拷贝:cp 文件1 文件2,cp-r跨目录拷贝 cp-r 路径1 路径2
vi 插入 :wqb保存退出 :q!强制退出 :w另存为 :set nn显示行号
查看文件内容:cat(看内容少的文件) cat还可以合并两个文件内容 cat a.c b.c>c.c
more分屏显示,回车下一页,按b回滚,按空格往下,到最后自己退出
less上下查看也很方便,而且可以反复查看
head tail 看文件前几行、后几行
find 路径 -name(还可以加cmin\ctime按最近几分钟几天查找)文件名
grep-i “字符串” 文件名 查找该文件里的字符串,grep用来过滤
ps显示正在运行的进程,ps-e显示所有进程信息,ps-f详细信息,ps-L显示线程id
pstree树状显示进程和其子进程
kill pid 杀死进程
tar-z压缩、解压,tar cvf打包,tar xvf释放包,最简单解压tar zxf
tcpdump抓包
netstat 监控tcp/ip网络的工具,可以显示与ip、tcp、udp、icmp协议相关数据,一般检验本机各端口的网络连接情况。
可以参考tcpdump详解&实战 - 知乎
2、静态库和动态库如何制作及使用
静态库的制作:命名规则libxxx.a(linux),libxxx.lib(windows);先用.c文件生成.o文件,打包生成静态库:ar crv libfoo.a add.o max.o;
使用:gcc -o main main.c -l路径 -l库名
动态库的制作:命名规则libxxx.so (linux),libxxx.dll(windows);先用.c文件生成.o文件,gcc -c –fpic/-fPIC a.c b.c,打包生成动态库:gcc -shared a.o b.o -o libfoo.so
使用:gcc -o main main.c -l路径 -l库名
静态链接时——依赖静态库,把所需要的函数二进制代码都包含进可执行程序中(本质是代码拷贝)。
动态链接时——依赖动态库,它用过一系列符号或者参数在函数执行或加载时把信息传递给操作系统,由操作系统赋负责将需要的依赖库加载到内存中,程序在执行时加载已经存在于内存的代码。
3、请你说说动态库静态库的区别和优缺点
1.使用方式不同:静态链接把静态库编译进目标文件,直接运行;动态链接运行时加载已经存在于内存的代码(需要给程序环境指定动态库查找环境)
2.占用空间:静态库会存在多个副本(内存和磁盘),比较浪费系统资源;动态库只有一个副本
3.库文件发生改变时:静态库当接口(参数、函数名等)发生改变时,需要重新编译,依赖其的程序也要重新编译链接;动态库发生改变时,只需要重新编译动态库
4.移植程序时:依赖静态库的可执行文件不需要做什么,静态库的代码已经被编译进可执行文件了;依赖动态库的可执行文件移植时需要把动态库也移植过去
4、简述一下 GDB 常见的调试命令
用gdb调试时,首先要把它转为debug版本,加个-g
l显示代码,b加断点,bt查看函数堆栈信息,info查看断点,r运行,p打印某个参数,
s进入函数,info break查看断点信息
5、说一说进程调度算法有哪些
先来先服务调度算法——从进程队列中选择最先到达的一个或几个进程,将它们调入内存,为他们分配资源、创建进程。当每个进程就绪后,将它们加入就绪队列。当前正在执行的进程停止运行时,选择存在于就绪队列中最久的进程开始执行。
短作业优先调度算法——从后背队列中选择运行时间最短的一个或多个作业(进程),将它们调入内存,将处理机分配给它使之立即执行,直到任务完成或阻塞,才释放处理机。
高响应比优先调度算法——它是一种基于先来先服务和短作业优先的一种平衡。考虑到每个作业的等待时间和运行时间。先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
优先级调度算法——作业调度中,从后备队列里选择优先级最高的作业,将它们调入内存、分配资源,创建进程并加入就绪队列,进程调度中,每次选择就绪队列中优先级最高的进程为其分配处理机,使之运行。
时间片轮转调度算法——cpu从作业队列队首开始给每个都分配一定的时间(时间片不固定),当执行完时间片,由时钟发出一个中断请求,调度程序收到信号就让它停止执行,把它放去就绪队列的队尾,然后再把处理机分配给新队首,也让它执行一个时间片。
多级反馈队列调度算法——时间片轮转调度算法和优先级调度算法的综合和发展,通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。
6、说一说什么是大端、小端,如何判断大端和小端
小端——整数的低位存在低地址,高位存在高地址
大端——整数的低位存在高地址,高位存在低地址
判断:在32为平台下,int占4个字节,char类型的指针占1个字节,先用char类型的取一个字节,再用int取四个,再把int强转成char就只能取出一个字节了,如果两个一样说明是小端,不一样就是大端。
7、什么是孤儿进程,什么是僵尸进程,如何解决僵尸进程
孤儿进程——父进程已经释放,子进程还在(被init,进程号为1的进程收养),孤儿进程一般无危害。
僵尸进程——使用fork()创建的子进程退出了,但父进程不知道(没有使用wt()或wtpid()取得子进程的终止状态),子进程还占着系统资源。
解决僵尸进程:在fork()子进程时,父进程及时wt、wtpid获取子进程的状态,子进程退出时,释放pcb资源。退出时内核都会给父进程一个SIGCHILD信号,所以我们可以建立一个信号捕获函数,在函数体中调用wt\wtpid。
8、说一说进程通信的方式有哪些?
socket套接字、管道、共享内存、消息队列、信号
socket——主要用于不同主机之间的通讯
管道——有名(任意进程)和无名(亲缘关系进程),他有读写两个文件描述符,写在前读在后,并且读写完还可以循环从另一端重新开始。
共享内存——把一个进程的数据复制到共享内存中,别的同一个段(物理内存的一个区域)的进程可用。
消息队列——一个消息链表,有读权限的可以读消息队列上的信息,有写权限的可以在上面写信息。
信号——有事件发生时对进程通知,也称为软中断。它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。
9、说一说进程有多少种状态,如何转换
创建 就绪 运行 阻塞 终止
创建进程,获得许可,资源已经准备好但还未分配处理机时是就绪状态,获得处理器资源后,被系统调度,开始运行,如果时间片用完会回到就就绪态,或者阻塞住了就会进入阻塞状态,阻塞结束后又进入就绪状态,运行结束就进入终止状态。
10、请你说说共享内存
进程的数据放入共享内存,同段进程可以使用就像用自己内存区域的数据一样,其中有进程改了数据同段其他进程也会受影响。共享内存在各种进程间通信方式中具有最高的效率,不需要系统或切入内核,也避免了数据不必要的复制。缺点是没有同步机制(不能避免同时操作或读脏数据)。进程间的同步是通过其他机制来实现的,比如使用信号量、互斥锁等。 这些同步机制可以保证多个进程之间对共享内存的访问是有序的,避免了多个进程同时访问同一段内存而导致的数据不一致的问题。