本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1. 请说说Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数
(1)查看进程运行状态的指令:ps命令。 "ps -aux | grep PID",用来查看某PID进程状态。
(2)查看内存使用情况的指令:free命令。 "free -m",命令查看内存使用情况。
(3)tar解压文件的参数:五个命令中必选一个 -c:简历压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件
2.文件权限怎么修改?
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限
修改权限指令:chmod
文件的权限字符为 -rwxrwxrwx 时,这九个权限是三个三个一组。其中,我们可以使用数字来代表各个权限。
各权限的分数对照如下:
| r | w | x |
|---|---|---|
| 4 | 2 | 1 |
| 每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的, |
例如当权限为: [-rwxrwx---] ,则分数是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0
所以我们设定权限的变更时,该文件的权限数字就是770!变更权限的指令chmod的语法是这样的:
[root@www ~]# chmod [-R] xyz 文件或目录
选项与参数: xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
# chmod 770 test.c //即修改test.c文件的权限为770
3.说说常用的Linux命令
(1)cd命令:用于切换当前目录
(2)ls命令:查看当前文件与目录
(3)grep命令:该命令常用于分析一行的信息,若当中有我们所需要的信息,就将改行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。
(4)cp命令:复制命令
(5)mv命令:移动文件或文件夹的命令
(7)ps查看进程情况
(8)kill命令:向进程发送终止信号(杀死进程)
(9)tar命令:对文件进行打包,调用gzip或者bzip对文件进行压缩或者解压
(10)cat命令:查看文件内容,与less、more功能相似
(11)top命令:可以查看操作系统的信息,如进程、CPU占用率、内存信息等
(12)pwd命令:命令用于显示工作目录
4.说说如何以root权限运行某个程序
#输入以下两条命令即可
sudo chown root app(文件名)
sudo chmod u+s app(文件名)
5.说说软链接和硬链接的区别
(1)定义不同
软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。
硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。
(2)限制不同
硬链接只能对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建;
软链接可对不存在的文件或目录创建软链接;可交叉文件系统;
(3)创建方式不同
硬链接不能对目录进行创建,只可对文件创建;
软链接可对文件或目录创建;
(4)影响不同
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
6.说说静态库和动态库怎么制作以及如何使用
静态库的制作:
gcc hello.c -c //这样就生成hello.o目标文件
ar rcs libhello.a hello.o//生成libhello.a静态库
静态库的使用:
gcc main.c -lhello -o staticLibrary//main.c和hello静态库链接,生成staticLibrary执行文件
main.c:是指main主函数 -lhello:是我们生成的.a 文件砍头去尾(lib不要 .a也不要)前面加-l -L:是指告诉gcc编译器先从-L指定的路径去找静态库,默认是从/usr/lib/ 或者 /usr/local/lib/ 去找。 ./:是指当前路径的意思 staticLibrary:是最后想生成的文件名(这里可随意起名字)
动态库的制作:
gcc -shared -fpic hello.c -o libhello.so -shared
指定生成动态库 -fpic :fPIC选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。
动态库的使用: gcc main.c -lhello -L ./ -o dynamicDepot /* main.c:是指main主函数 -lhello:是我们生成的.so 文件砍头去尾(lib不要 .so也不要)前面加-l -L:是指告诉gcc编译器先从-L指定的路径去找静态库,默认是从/usr/lib/ 或者 /usr/local/lib/ 去找。 ./:是指当前路径的意思 dynamicDepot:是最后想生成的文件名(这里可随意起名字) */
区别:
静态库代码装载的速度快,执行速度略比动态库快。
动态库更加节省内存,可执行文件体积比静态库小很多。
静态库是在编译时加载,动态库是在运行时加载。
生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
7.简述GDB常见的调试命令,什么是条件断点,多进程下如何调试?
GDB调试:
gdb调试的是可执行文件,在gcc编译时加入 -g ,告诉gcc在编译时加入调试信息,这样gdb才能调试这个被编译的文件 gcc -g tesst.c -o test
GDB命令格式:
1.quit:退出gdb,结束调试
2.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函数周围的代码,在调试多个文件时使用
3.reverse-search:字符串用来从当前行向前查找第一个匹配的字符串
4.run:程序开始执行
5.help list/all:查看帮助信息
6.break:设置断点
break 7:在第七行设置断点
break get_sum:以函数名设置断点
break 行号或者函数名 if 条件:以条件表达式设置断点
7.watch 条件表达式:条件表达式发生改变时程序就会停下来
8.next:继续执行下一条语句 ,会把函数当作一条语句执行
9.step:继续执行下一条语句,会跟踪进入函数,一次一条的执行函数内的代码
条件断点:break if 条件 以条件表达式设置断点
多进程下如何调试:用set follow-fork-mode child 调试子进程或者set follow-fork-mode parent 调试父进程
8.说说什么是大端存储和小端存储,如何判断大端小端?
小端模式:低的有效字节存储在低的存储器地址上。小端一般为主机字节序;常用的X86结构是小端模式。很多的ARM、DSP都为小端模式。
大端模式:高的有效字节存储在低的存储器地址上。大端为网络字节序;keil C51则为大端模式。
有些ARM处理器还可以由硬件来选择大端模式还是小端模式。
如何判断:我们可以根据联合体来判断系统是大端还是小端。因为联合体变量总是从低地址存储。
int fun1(){
union test{
char c;
int i;
};
test t;
t.i = 1;
//如果是大端,则t.c为0x00,则t.c != 1,反之是小端
return (t.c == 1);
}
9.说说进程调度算法有哪些?
(1)先来先服务调度算法
每次调度都是从后备作业(进程)队列中选择一个或多个最先进入该队列的作业(进程),将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
(2)短作业(进程)优先调度算法
短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业(进程),将它们调入内存运行。
(3)高优先级优先调度算法
当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程
(4)时间片轮转法
每次调度时,把CPU 分配给队首进程,并令其执行一个时间片。时间片的大小从几ms 到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
(5)多级反馈队列调度算法
综合前面多种调度算法
10.调度算法中,抢占式和非抢占式的区别是什么?
(1)非抢占式优先权算法
在这种方式下,系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。这种调度算法主要用于批处理系统中;也可用于某些对实时性要求不严的实时系统中。
(2)抢占式优先权调度算法
在这种方式下,系统同样是把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理机分配给新到的优先权最高的进程。因此,在采用这种调度算法时,是每当系统中出现一个新的就绪进程i 时,就将其优先权Pi与正在执行的进程j 的优先权Pj进行比较。如果Pi≤Pj,原进程Pj便继续执行;但如果是Pi>Pj,则立即停止Pj的执行,做进程切换,使i 进程投入执行。显然,这种抢占式的优先权调度算法能更好地满足紧迫作业的要求,故而常用于要求比较严格的实时系统中,以及对性能要求较高的批处理和分时系统中。
(3)两者区别
非抢占式(Nonpreemptive):让进程运行直到结束或阻塞的调度方式,容易实现,适合专用系统,不适合通用系统。 抢占式(Preemptive):允许将逻辑上可继续运行的在运行过程暂停的调度方式可防止单一进程长时间独占,CPU系统开销大(降低途径:硬件实现进程切换,或扩充主存以贮存大部分程序)