前些天老师说我们要进行linux基础知识的笔试测试,因为都没看过多少书,了解的知识仅限于课堂上讲的知识,所以考试结果可想而知,对我来说是一次教训,让我明白知识是需要自己去课后学习并加以总结的,所以仅对此次测试题目所涉及的内容做以下总结:
1.简述如下目录的功能
[1]. /boot:放置linux系统启动时用到的一些文件。
[2]. /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件。
[3]. /mnt:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
[4]. /lib:/usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
[5]. /bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
[6]. /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间。
[7]. /root:系统管理员root的家目录,系统第一个启动的分区为 /,所以最好将 /root和 /放置在一个分区下。
[8]. /usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录,使用 man ls 时会查询 /usr/share/man/man1/ls.1.gz 的内容建议单独分区,设置较大的磁盘空间。
[9]. /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,~edu 表示用户 edu 的家目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。
[10]. /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
[11]. /var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。建议单独分区,设置较大的磁盘空间。
[12]. /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
2.写15个熟悉的linux命令,并简述其功能
[1]. ls:列出当前目录下所有文件内容
[2]. madir:创建目录
[3]. touch:创建文件
[4]. rm:删除目录或文件
[5]. cp:复制文件
[6]. mv:移动文件
[7]. cd:进入目录,切换路径
[8]. man:查看帮助手册
[9]. history:查看终端中所有使用过的命令的历史记录
[10]. mount:将某一设备挂载
[11]. umount:将某一设备从挂载点上移除
[12]. top:查看当前系统进程信息
[13]. cat:cat 代表了连结(Concatenation),连接两个或者更多文本文件或者以标准输出形式打印文件的内容
[14]. pwd:在终端中显示当前工作目录的全路径
[15]. chmod:改变文件的权限
3.linux有哪些文件类型
[1]. 普通文件:-
[2]. 纯文本文件
[3]. 二进制文件
[4]. 数据格式文件
[5]. 目录文件:d
[6]. 连接文件:l
[7]. 设备文件
块设备文件:b
字符设备文件:c
[8]. 套接字文件:s
[9]. 管道文件:p
4. 增加一个用户使用哪个命令,它会修改哪些系统文件?
命令:useradd
系统文件:/etc/shadow:用户密码文件
/etc/group:用户组文件
5. 系统关机和重启的命令,su是用来做什么的?
关机命令:shutdown
重启命令:reboot
su:用来切换用户
6. 简述makefile文件的功能
makefile文件用于对多个源文件进行编译链接,生成可执行文件。
7. 调试程序用什么工具?说明工具中常用的命令及功能。
linux中的调试工具是gdb,
1). debug版本:可调式版本 (文件较大) 编译阶段决定是否生成debug版本
eg:gcc -o main*.o -g —>release gcc -o .o—>debug gcc -o exe .c -g —>debug
2). release:发行版本 (文件较小)
gdb main 调试
list 显示主函数所在.c文件的代码
list filename:num 显示指定.c文件的代码
b +行号(N) 将断点添加到最近一次显示的文件的第N行上
b +funtion_name 将断点添加到指定函数执行的第一行代码处
b +代码行号 if(条件) 添加条件断点
bt 查看函数调用堆栈关系
info b 查看断点信息
disable +断点号 暂停,断点不起作用 enable+断点号 断点继续起作用
d + 断点号 删除断点 (delete 1)
r 运行程序 (run)
p +变量名 查看变量值
p +数组名 显示数组内容 p+ &变量名 显示数组的地址 p *指针名@len 通过指针显示数组元素或者堆区空间的值 p+变量名.成员变量名 显示结构体变量的成员变量值
n 下一行执行(next)
c 执行到下一个段点处(continue)
s 进入将要被调用的函数里执行
finish 退出函数
display +变量名 以展台显示变量的值
info +display 查看display信息
undisplay num 退出显示
x /n f(四个字节显示) b(一个字节显示) 查看内存中的值
ptype +变量名 查看变量类型
q 退出gdb调试(quit)
进程
set follow-fork-mode mode (mode 的值可选项为parent和child) 跟踪父进程或子进程
线程
info threads 显示当前线程
thread n 切换到第n个线程(注:n是线程编号)
set scheduler-locking [off/on/step] off 表示不锁定任何线程 on 表示只当前被调试的线程会继续执行 step 表示在单步执行的时候,只有这个线程会继续执行
8. 什么是库,请简述共享库和静态库的区别。使用库文件时,“-L”和“-l”选项分别用来指定什么?
这里的库也称为函数库,很多的软件之间都会相互使用彼此提供的函数库来进行特殊功能的运行。函数库依据是否被编译到程序内部而分为动态与静态函数库。动态函数库又称为共享库。
静态函数库与共享库的区别如下:
[1]. 扩展名:静态库的扩展名通常为.a,而共享库的扩展名通常为.so;
[2]. 编译行为:静态库在编译时会直接整合到执行程序中,所以利用静态库进行编译的可执行文件会大一些;而共享库是在编译的文件中只有一个“指向”,也就会说共享库没有被整合到可执行文件中,而是当可执行文件要使用到共享库中的机制时,程序才会根据“指向”去读取共享库,因此它的可执行文件会小一些。
[3]. 独立执行的状态:使用静态库编译的可执行文件可以独立执行,而不需要再向外部要求读取函数库的内容。而共享库编译出的可执行文件不能独立执行,只有用到共享库的机制时,才会去读取共享库,所以共享库必须存在,且目录不能改变,因为我们的可执行文件中只有“指向”,用到该共享库时,才会主动去某个路径下读取,所以共享库不能移动也不能删除。
[4]. 升级难以程度:由于使用静态库编译的可执行文件被整合到该文件中,所以升级库后,必须将可执行文件进行重新编译整合到该文件中,所以升级难度相对较大;而使用共享库的可执行文件只有“指向”,所以在升级了共享库之后,不需要对可执行文件进行重新编译看,所以难度就较小。
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld
上面这句表示在编译hello.c时-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,
寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include
-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,
寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib
-lworld表示在上面的lib的路径中寻找库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)
但注意:-static显得有些暴力,因为他会把命令行中-static后面的所有-l指明的库都静态链接。而一般的是采用如-Wl,-Bstatic告诉链接器使用-Bstatic选项,该选项是告诉链接器,对接下来的-l选项使用静态链接;-Wl,-Bdynamic就是告诉链接器对接下来的-l选项使用动态链接
.#include <>直接到 指定的某些目录中去找某些头文件。 注意-I 属于该类型
.#include “”先到源文件所在文件夹去找,然后再到系统指定的某些目录中去找某些头文件。
“”中可以用类似“../inc/bluetooth/hci.h”:包含源文件上层目录中Inc下Bluetooth中的hci.h.
头文件搜索顺序:
1.由参数-I指定的路径(指定路径有多个路径时,按指定路径的顺序搜索)
2.然后找gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
3.再找内定目录
/usr/include
/usr/local/include
当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式: gcc test.cpp -L. -Wl,-Bstatic -ltestlib -Wl,-Bdynamic -ltestlib ,另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接。
库搜索路径搜索的先后顺序是:
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib;
5.默认的动态库搜索路径/usr/lib。
通过设定环境变量# export LD_LIBRARY_PATH=/zz/mydir/,可以指定动态库搜索路径,(运行时)。
9.什么是进程,什么是进程描述符,linux系统最多可以运行多少个进程?
进程是运行中的程序,而进程描述符是表示一个进程的唯一标识。linux系统最多可以运行64个进程,我们可以使用ulimit -a查看我们系统的所有限制。
10. 画出进程的状态转移图(三个状态模型)
1.就绪到执行:处于就绪状态的进程,在调度程序为之分配了处理器之后,该进程就进入执行状态;
2.执行到就绪:正在执行的进程,如果分配给它的时间片用完,则暂停执行,该进程就由执行状态转变为就绪状态;
3.执行到阻塞:如果正在执行的进程因为发生某事件(例如:请求I/O,申请缓冲空间等)而使进程的执行受阻,则该进程将停止执行,由执行状态转变为阻塞状态;
4.阻塞到就绪:处于阻塞状态的进程, 如果引起其阻塞的事件发生了, 则该进程将解除阻塞状态而进入就绪状态。
11. 什么是用户态,什么是内核态,什么时候会从用户态切换到内核态?
用户态:应用程序在用户空间执行,它们只能看到允许它们使用的部分系统资源,并且只能使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划给别人的内存范围。当执行一个普通用户程序时,系统将以用户态进入用户空间执行。
内核态:通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络,进程间通信等系统服务程序共同组成。其独立于普通应用程序,一般处于系统态,当内核运行时,系统以内核态进入内核空间执行。
用户态切换到内核态有以下三种方式:
1.系统调用
2.产生中断
3.发生异常
12. linux环境下main函数有几个参数,并说明各个参数的意义。
main函数的声明int main(int argc,char* argv[],char* env[]);
1. argc代表该程序运行是参数的个数;
2. argv代表这些参数(字符串);
3. env代表的是环境变量的字符串(各种路径)。
13. 什么是系统调用,它和函数有什么关系?
系统调用:通俗的讲,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。
系统调用与函数的区别如下:
通俗的讲,函数调用是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。函数调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。
1. 函数调用:在所有的ANSI C编译器版本中,C库函数是相同的 ;
系统调用 :各个操作系统的系统调用是不同的 ;
2. 函数调用:它调用函数库中的一段程序(或函数);
系统调用:它调用系统内核的服务 ,与用户程序相联系, 是操作系统的一个入口点;
3. 函数调用:在用户地址空间执行
系统调用:在内核地址空间执行
4. 函数调用:它的运行时间属于“用户时间”
系统调用:它的运行时间属于“系统”时间
5. 函数调用:属于过程调用,调用开销较小
系统调用:需要在用户空间和内核上下文环境间切换,开销较大
6. 函数调用:在C函数库libc中有大约300个函数
系统调用:在UNIX中大约有90个系统调用
7. 函数调用:典型的C函数库调用有system fprintfmalloc
系统调用:典型的系统调用有chdir fork write brk;
14. 进程间通信有哪几种方式?
进程间通信的方式有:管道,共享内存,消息队列,信号量,套接字
15. 简述有名管道与无名管道的区别,并说明管道是全双工还是半双工?
有名管道与无名管道的区别:有名管道可以在任意两个进程之间进行通信,而无名管道由于其无名,所以只能以fork出子进程的形式在父子进程之间进行通信。
管道是半双工的。
16. 简述共享内存的实现原理。
两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。
17. 简述与信号有关的系统调用signal和kill的功能。
系统调用signal是进程用来设定某个信号的处理方法,系统调用kill是用来发送信号给指定进程的。
18. 简述fork进程的流程,及写时拷贝的意义是什么?
fork进程的流程:
[1]. 为新进程分配页表;
[2]. 为新进程分配pid;
[3]. 调用do_fork
写时拷贝的意义:
写时拷贝是一种可以推迟甚至是免拷贝数据的一种技术,内核此时并不复制整个进程的地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝,资源的复制只有在需要写入时才进行,在此之前,只是以只读的方式共享,这种技术使得地址空间上的页的拷贝被推迟到实际发生写入的时候才进行。
19. 调用系统调用后,如何从用户态切换到内核态。
[1]:读取tr寄存器,访问TSS段
[2]:从TSS段中的sp0获取进程内核栈的栈顶指针
[3]: 由控制单元在内核栈中保存当前eflags,cs,ss,eip,esp寄存器的值。
[4]:由SAVE_ALL保存其寄存器的值到内核栈
[5]:把内核代码选择符写入CS寄存器,内核栈指针写入ESP寄存器,把内核入口点的线性地址写入EIP寄存器
20. 什么是僵死进程?怎么做可以处理僵死进程
当父进程还未获取子进程的退出码,而子进程已经先于父进程结束,此时的子进程称为僵死进程。
处理僵死进程可以使父进程调用wait()或者调用waitpid()来等待子进程结束并获取退出码。
21. 什么是临界资源,什么是临界区?
某一时刻只能被一个进程访问的资源称为临界资源。而每个进程中使用临界资源进行操作的一段程序称为临界区。
22. 什么是信号量,它的作用是什么?
信号量是在多线程环境下使用的一种设施,它的作用是可以用来保证两个或多个关键代码段不被并发调用。
23. 什么是虚拟内存,引入虚拟内存后对系统运行程序有什么作用?
虚拟内存是指通过分页分段以及段页式管理方式,使得在实际物理地址上可能不连续的内存空间映射成为逻辑上连续的一段空间,每一个进程都感觉自己独立拥有一块属于自己的连续内存空间而不受其他进程的打扰。
引入虚拟内存之后系统在加载运行程序的时候,可以不必一次性将该进程所需的所有页全部调入内存,而是采用一定的策略去动态调度所需要的页信息,而使得进程感觉自己的所有页是一次性全部调入内存一样,并且引入虚拟内存,使得系统效率大大提高并且节省开销,有效合理利用资源。
24. 这条语句fork()&&fork()产生几个进程?
产生了2个新进程,算上父进程一共3个进程。
25. 线程是什么?和进程有什么区别,简述线程的实现方式。
[1]. 线程是线程是进程中的一条执行流,CPU独立运行和独立调度的基本单位;
[2]. 进程是资源分配的基本单位;
两者的联系:进程和线程都是操作系统所运行的程序运行的基本单元。
区别:
[1]. 进程具有独立的空间地址,一个进程崩溃后,在保护模式下不会对其它进程产生影响。
[2]. 线程只是一个进程的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
线程的实现方式:用户级线程,内核级线程以及组合模型
26. 同步线程有哪些方法?
同步线程的方法包括信号量,互斥锁以及条件变量。
27. 请描述OSI模型的分层结构以及各层功能
物理层:规定通信设备的机械、电气、功能和过程的特性,用以建立、维持和释放数据链路层实体间的连接,它的任务就是提供网络的物理连接进行二进制传输。
数据链路层:数据链路连接的建立与释放,构成数据链路数据单元,数据链路连接的分裂、定界与同步,顺序和流量控制,差错的检测和恢复等。通俗来讲,就是输入介质
网络层:关心通信子网的运行控制,选择合适的路由使得发送站的运输层分送下来的分组能够正确无误的按照地址找到目的站,并交付目的站的运输层,以及实现拥塞控制,网络互联等功能。简单来说就是寻址以及找到最短路径。
运输层:传输地址到网络地址的映射,多路复用与分割,传输连接的建立与释放,分段与重新组装,组块与分块,实现端到端的连接。
会话层:会话连接到传输连接的映射,数据传送,会话连接的恢复与释放,会话管理,令牌管理和活动管理。通俗来讲就是互联主机通信
表示层:进行数据语法转换,语法表示。表示层连接管理,数据加密和数据压缩。简单来说就是数据表示
应用层:提供应用进程所需要的信息交换和远程操作,并且作为互相作用的应用进程的用户代理来完成一些进行语义上有意义的信息交换所必须的功能。简单来讲就是处理网络应用。
28. 画出tcp协议三次握手以及四次挥手的过成图,简述TIME_WAIT状态的意义
TIME_WAIT状态系统大约会持续两分钟,其意义在于:
a) 可靠地终止TCP的连接。
b) 让迟来的报文能够有足够时间被识别,并且被丢弃。
可靠地终止TCP的连接意思是说当最后确认服务器关闭连接的最后一个tcp报文段丢失,那么服务器会重新发送结束报文,所以客户端需要停留在某个阶段来处理这些重复收到的结束报文段,即向服务器端发送确认结束报文段。
让迟来的报文能够有足够的时间被识别并丢弃是说如果没有TIME_WAIT状态,那么该端口会立即被其他连接所使用,重新建立一个与本连接具有相同的ip地址以及端口号的新连接,本连接一些迟来的数据报文便可能会被该新连接所接收,但这是不正确的,所以这就是对于迟到的报文为什么要被丢弃的原因。
29. 简述tcp与udp协议的特点与区别
tcp是面向连接的,可靠地流式服务;udp是面向非连接的,不可靠的流式服务。tcp比较适合用于传输大量数据,但速度比较慢,建立连接需要相对较大的开销,而udp传输数据的速度比较快,用于传输少量数据,但不保证数据可达。
30. 简述tcp协议中慢启动,快速重传以及快速恢复的功能。
慢启动是说在流量控制时,我们需要初始化一个拥塞窗口的初始值,然后发送端每收到一个来自接收方的ack确认,便按照一定的规则或公式增加数值,当tcp模块刚开始发送数据时并不知道网络状况,需要用一种试探的方式来平缓的增加CWND的值。
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时才进行捎带确认。
快速恢复是说当接收到新的数据的确认时,设置拥塞窗口CWND等于慢启动门限值ssthresh,即新的慢启动门限值(使其回到拥塞避免阶段而非慢启动阶段)。
31. 简述tcp滑动窗口协议的功能
提高数据传输效率,进行差错控制和流量控制。其基本思想是:发送方发送完一帧后,不是停下来等待确认帧,而是可以接着发送数据帧。由于减少了等待时间,整个通信的吞吐量就提高了。在此过程中有发送窗口与接收窗口,发送方根据接收方接收窗口的大小来计算最多发送多长的数据。
32. 简述bind,connect,listen以及accept的功能。
bind:将一个接收客户端请求的服务器套接字关联上一个众所周知的地址。
connect:在开始交换数据之前,在请求服务的进程套接字(客户端)和提供服务的进程套接字(服务器)之间建立一个连接。
listen:服务器用来监听请求的连接并宣告是否愿意接受连接请求。
accept:服务器调用该函数获得连接请求并建立连接。
33. 简述select和epoll实现上有什么区别,并说明epoll的LI模式和ET模式的区别?
select是采用轮询的方式来关注文件描述符上是否有事件发生,而epoll是在每个关心的文件描述符上注册一个回调函数,等到事件发生后进行相应处理;select监听的事件类型比epoll少。
LI模式是默认工作模式,当epoll_wait检测到数据就绪并将此事件通知给应用程序之后,应用程序不必立即处理,因为后续该函数会一直向应用程序通知这件事,直到该事件被处理。而ET模式在epoll_wait检测到数据就绪之后,只向应用程序通知一次,所以应用程序必须立即处理。ET模式降低了epoll事件被重复触发的次数,效率更高一些。
34. 端口是什么,协议是什么?
端口是设备与外界通讯交流的出口,一般在应用层被指定。
协议是通信双方必须共同遵守的一组约定。
35. http协议是那一层的协议,它使用的端口号是多少?http应答状态码都有哪些,分别代表什么意思,请求方法有哪些,功能分别是什么?
http协议是应用层协议,使用80端口。
http应答码及意义:
http请求方法及功能:
36. 在浏览器中输入www.baidu.com敲回车,接下来会发生什么,描述整个过程。
首先先通过浏览器缓存,系统缓存或DNS找到要访问的服务器的ip地址,进行三次握手建立连接,浏览器向服务器发送http请求报文,服务器接收到该请求并发送一个应答报文并将网页数据发送给浏览器,由浏览器通过解析将目标百度网页呈现出来,如果为短连接,则关闭连接,如果为长连接,则完成请求,不做后续。
37. 描述多线程与线程池的不同点
线程池是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
多线程解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。
38. 由写好的c代码到可执行程序,都经过了哪几个阶段,每个阶段的作用是什么?
[1]. 预编译:执行宏替换,头文件复制替换,以及删除注释等工作,生成.i文件
[2]. 编译:进行词法分析,语法分析,语义分析,并将高级语言翻译为汇编语言,生成.o文件
[3]. 汇编:将汇编语言翻译为机器语言,即二进制文件
[4]. 链接:链接外部文件,重定向生成可执行文件,即.exe文件