1、说说Linux中常见命令
ls | 查看文件夹下文件与文件夹 |
---|---|
cd | 切换目录 |
grep | 筛选 |
cp | 拷贝 |
mv | 移动 |
rm | 删除 |
ps | 显示当前进程的状态 |
kill | 杀死进程 |
tar | 解压压缩 |
cat | 连接文件并打印到标准输出设备上 |
top | 监控linux的系统状况 |
pwd | 显示工作目录 |
free | 查看内存状态 |
2、Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数
一、必选参数
-c,表示创建压缩文件,c代表create -x,表示解压缩文件 -t,表示查看压缩包里面的文件 -r,向压缩归档文件末尾追加文件 -u,更新原压缩包中的文件
二、辅助参数
-z,用 gzip压缩/解压缩 -j,用 bzip2压缩/解压缩 -v,显示压缩/解压缩的进度条,即详细列出处理的文件 -f,指定文档名,是必选的参数。注意f后面不要接参数,比如-zxfv是不对的,要写成-zxvf。 -C,此参数用来指定解压到哪个目录。
3、文件权限怎么修改
chmod 755 linuxmi.txt
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute(运行)权限
r | w | x |
---|---|---|
4 | 2 | 1 |
4、如何以root权限运行某个程序
修改分组、修改权限
sudo chown root app(文件名) #修改分组,root:root
sudo chmod u+s app(文件名) #修改权限,RWX==421
5、说说软连接与硬链接含义与区别
软链接 | 硬链接 |
可对不存在的文件或目录创建软链接;可交叉文件系统 |
只能对已存在的文件进行创建;不能交叉文件系统进行硬链接的创建; |
可对文件或目录创建; | 不能对目录进行创建,只可对文件创建; |
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接 | 删除一个硬链接文件并不影响其他有相同 inode 号的文件 |
6、动态库与静态库的制作与使用、区别
静态库的制作
1.首先生成你需要加入的文件的.O文件。使用如下代码
gcc -c add.c div.c mult.c sub.c
然后将这些文件装到库中(lib为静态库的前缀,中间的calc为动态库的名字,动态库的后缀为.a 使用如下代码:
ar rcs libcalc.a add.o sub.o mult.o div.o
生成libcalc.a文件,及静态库
静态库的使用(生成app)
运行这里边的main.c文件 1.之前就是这样生成app文件的,但是head.h和add.c等文件不在一个目录下
gcc main.c -o app -I ./include/ -l calc -L ./lib
动态库的制作
1.和静态库一样,首先将你要打包的程序生成.O文件,就是将.C文件生成.O文件,-fpic :生成与位置无关的代码
gcc -c -fpic add.c div.c mult.c sub.c
2.然后将生成的.O文件称作成动态库,要用到以下代码(*.o表示文件夹中所有的.o文件,lib为动态库的前缀,中间的calc为动态库的名字,动态库的后缀为.so)
gcc -shared *.o -o libcalc.so
动态库的使用
生成main文件(后面的一串和静态库一样)
gcc main.c -o main -I include -L lib -l calc
区别
-
静态库代码装载的速度快,执行速度略比动态库快。
-
动态库更加节省内存,可执行文件体积比静态库小很多。
-
静态库是在编译时加载,动态库是在运行时加载。
-
生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
7、简述GDB常见调制命令,什么是条件断点,多进程下如何调试
gcc -g test.c -o test #生成带调试信息的可执行文件test
gdb test #开始GDB调试
quit | 退出gdb,结束调试 |
list | 查看程序源代码 |
list 5,10:显示5到10行的代码 |
|
list test.c:5, 10: 显示源文件5到10行的代码,在调试多个文件时使用 |
|
list get_sum: 显示get_sum函数周围的代码 |
|
list test,c get_sum: 显示源文件get_sum函数周围的代码,在调试多个文件时使用 | |
reverse-search | 字符串用来从当前行向前查找第一个匹配的字符串 |
run | 程序开始执行 |
help list/all | 查看帮助信息 |
break | 设置断点 |
break 7:在第七行设置断点 |
|
break get_sum:以函数名设置断点 |
|
break 行号或者函数名 if 条件:以条件表达式设置断点 | |
watch 条件表达式 | 条件表达式发生改变时程序就会停下来 |
next | 继续执行下一条语句 ,会把函数当作一条语句执行 |
step | 继续执行下一条语句,会跟踪进入函数,一次一条的执行函数内的代码 |
条件断点:break if 条件 以条件表达式设置断点
多进程下如何调试:
set follow-fork-mode child //子进程
set follow-fork-mode parent //父进程
8、说说什么是大端小端,如何判断大端小端?什么是网络字节序,是否需要转换
小端模式:低的有效字节存储在低的存储器地址。计算机内部存储方式。
大端模式:高的有效字节存储在低的存储器地址。大端为网络字节序。(反转)
相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。
判断:联合体
int fun1(){
union test{
char c;
int i;
};
test t; t.i = 1;
//如果是大端,则t.c为0x00,则t.c == 1,反之是小端
return (t.c == 1);
}
9、调度算法有哪些?含义是什么?抢占式与非抢占式有什么区别?
linux平台使用的调度算法有:时间片轮转+高优先级
-
先来先服务调度算法
-
短作业(进程)优先调度算法
-
高优先级优先调度算法
-
时间片轮转法
-
多级反馈队列(MLFQ) 规则
-
规则 1:如果 A 的优先级 > B 的优先级,运行 A(不运行 B)。
-
规则 2:如果 A 的优先级 = B 的优先级,轮转运行 A和 B。
-
规则 3:工作进入系统时,放在最高优先级(最上层队列)。
-
规则4:一旦工作用完了其在某一层中的时间配额(无论中间主动放弃了多少次 CPU),就降低其优先级(移入低一级队列)。
-
规则 5:经过一段时间 S,就将系统中所有工作重新加入最高优先级队列。
10、操作系统如何申请及管理内存
申请内存:*brk和mmap
管理内存:物理内存、虚拟内存
- 物理内存:物理内存有四个层次,分别是寄存器、高速缓存、主存、磁盘。
- 虚拟内存:操作系统为每一个进程分配一个独立的地址空间,但是虚拟内存。虚拟内存与物理内存存在映射关系,通过页表寻址完成虚拟地址和物理地址的转换。
11、简述Linux系统态与用户态,什么时候会进入系统态,为什么区分用户态与内核态
-
内核态与用户态:内核态可以访问所有系统指令;用户态则只能访问一部分指令。
-
什么时候进入内核态:a、系统调用。b、异常。c、设备中断。其中,系统调用是主动的,另外两种是被动的。
-
为什么区分内核态与用户态:出于安全考虑,让用户态不能访问危险资源
12、简述LRU(最近最少使用)算法及其实现方法
思路:将缓存中最近最少使用的对象删除掉
实现方式:链表和hashmap
struct DLinkedNode {
int key, value;
DLinkedNode* prev;
DLinkedNode* next;
DLinkedNode(): key(0), value(0), prev(nullptr), next(nullptr) {}
DLinkedNode(int _key, int _value): key(_key), value(_value), prev(nullptr),