Linux系统编程复习(用于面试)

1.
熟知一些命令的作用,比如说用vi操作多个文件之类的:
man 对你熟悉或不熟悉的命令提供帮助解释
chmod 权限修改
ls 查看目录、文件的属性、列举相应目录下文件
clear 清屏
cp 拷贝文件
data 显示当前时间
rm 删除文件和目录
mount 加载一个硬件设备
mv 移走目录或者改文件名
su 在不退出登陆的情况下,切换用户
cd 改变当前目录 whoami 确认自己身份
pwd 查看当前所在目录完整路径
whereis查询命令所在目录及帮助文档所在目录
cat 将文件中内容显示出来;一直打印出来
which:查询该命令所在目录(类似whereis)
more 将文件中的内容显示出来;分屏显示
id:打印出自己的UID以及GID
grep 文本内容搜索;
find 文件或者目录名以及权限属主等匹配搜索
kill 可以杀死某个正在进行或者已经是dest状态的进程
passwd 可以设置口令
history 用户用过的命令
!! 执行最近一次的命令 mkdir命令
tar 解压命令
finger 可以让使用者查询一些其他使用者的资料

2.
系统调用和库函数的区别;
系统调用是操作系统提供给用户程序访问并使用操作系统内核提供的各种服务的一组特殊接口
库函数调用
·在所有的ANSI C编译器版本中,C库函数是相同的;
·通常调用的是代码库中的函数;
·这些库函数和程序链接,静态链接和动态链接都可以;
·用户态,即在用户地址空间内执行;
·属于过程调用,调用开销较小;

系统调用:
·各个操作系统的系统调用是不同的;
·由操作系统提供的一类函数;
·提供操作系统才能实现的服务;
·内核态,即在内核地址空间内执行;
·需要在用户空间和内核空间环境上下切换,开销较大;

3.
线程和进程的区别;(一定要背下来,并且能够结合自己的项目行进阐述)
线程是指进程内的一个执行单元,也是进程内的可调用实体,与进程的区别:
(1)调度:线程作为调度和分配的基本单元,进程作为拥有资源的基本单位;
(2)并发性:不仅进程之间可以并发执行,同一个进程之间的多个线程也可以并发执行;
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源但可以访问隶属于进程的资源;
(4)系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销;

4.
Linux进程间通信的方式有那些?以及在什么情况下用什么通信方式?他们的优缺点;
管道( pipe ) 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道(named pipe) 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量( semophore ) 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列(message queue) 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存(shared memory) 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

5.
OSI七层网络模型
应用层 应用层的功能一般包括标识通信伙伴、定义资源的可用性和同步通信。
表示层 提供多种功能用于应用层数据编码和转化,以确保一个系统应用层发送的信息可以被另一个系统应用层识别。
会话层 建立、管理和终止表示层与实体之间的通信会话。
传输层 向高层提供可靠的端到端的网络数据流服务。
网络层 负责在源和终点之间建立连接。一般包括网络寻径、流量控制、错误检查等。
数据链路层 通过物理网络链路提供可靠的数据传输。
物理层 负责最后将信息编码成电流脉冲或其它信号用于网上传输。
TCP/IP四层网络模型
应用层 对应于OSI七层参考模型的应用层和表达层。
传输层 解决的是计算机程序到计算机程序之间的通信问题。
网络层 解决的是计算机到计算机间的通信问题。
网络接口层 包括用于协作IP数据在已有网络介质上传输的协议。

6.
5种IP的范围;
A类 1.0.0.0 ~ 126.255.255.255
B类 128.0.0.0 ~ 191.255.255.255
C类 192.0.0.0 ~ 223.255.255.255
D类 224.0.0.0 ~ 239.255.255.255 用于多点广播;
E类 240.0.0.0 ~ 255.255.255.255 仅作实验和开发用;

7.
动态库和静态库的区别以及怎么制作动态库和静态库;
动态库名称格式:lib*.so (lib为前缀;.so代表为动态库;代表有意义的名称)
静态库名称格式:
.a (一般会表示成lib*.a ,但前缀lib并不是必须的)
(1)动态库和静态库的区别:
动态库只有在使用它的程序执行时才被链接使用,而不是将需要的部分直接编译入可执行文件中,并且一个动态库可以被多个程序使用故可称为共享库,而静态库将会整合到程序中,因此在程序执行时不用加载静态库。 从而可知,链接到静态库会使你的程序臃肿,并且难以升级,但是可能会比较容易部署。而链接到动态库会使你的程序轻便,并且易于升级,但是会难以部署。
(2)动态库的制作
动态库的创建:gcc -shared -fPIC -o 库名.so 源文件.c
(-fPIC位置无关代码选项;-shared 共享库)
动态库的使用:gcc 源文件.c ./库名.so -o 可执行文件名
(3)静态库的制作
把代码编译为目标文件形式: gcc -c 源文件.c
使用工具ar创建静态库文件: ar rcs 静态库名 目标文件1 目标文件2
(rc 静态库不存在,就创建该库文件;s 更新库文件)
编译程序时把程序和静态库链接起来:gcc -o file flie.c -L . -lname

8.
造成进程死锁的原因有那些?并且提出解决方案;
进程死锁的原因:(1)资源竞争;(2)进程推进顺序非法;
解决方案:鸵鸟策略、预防策略、避免策略(银行家算法)、检测与解除死锁;
死锁的4个必要条件:(1)互斥;(2)请求保持;(3)不可剥夺;(4)环路等待;

9.
什么是进程同步?进程死锁?进程互斥?
同步:多个进程协同运行,B进程需要A进程的运算结果才能运行,所以要等A算完,叫做同步
互斥:多个进程共同抢资源,互斥的结果就是进程死锁。
死锁:多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放 所占有的资源;

10.
三次握手的过程要清楚;

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包 (syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

11.
TCP和UDP的区别(一定要清楚);
TCP面向连接的传输控制协议,传输可靠(保证数据的正确性和数据顺序)、用于传输大量数据(流模式)、速度慢,建立链接需要开销较多(时间,系统资源等);
UDP面向非连接的数据包服务,传输不可靠,用于传输少量数据(数据包模式)、速度快,具有较好的实时性,工作效率较TCP协议高;

12.
Critical Section和Mutex的不同点;
对几种同步对象的总结
1.Critical Section
A.速度快 B.不能用于不同进程
C.不能进行资源统计(每次只可以有一个线程对共享资源进行存取)
2.Mutex
A.速度慢 B.可用于不同进程
C.不能进行资源统计
3.Semaphore
A.速度慢 B.可用于不同进程
C.可进行资源统计(可以让一个或超过一个线程对共享资源进行存取)
4.Event
A.速度慢 B.可用于不同进程
C.可进行资源统计

13
请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP和UDP呢?
IP(Internet Protocol)协议工作在网络层,是无连接的,不可靠的数据包协议,主要是用于路由数据包及主机之间寻址 。
TCP UDP 是传输层协议,用于端到端的通信(进程—进程),TCP是面向连接的 UDP 是面向无连接的。

14.
请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
一般意义上说交换机是工作在数据链路层。但随着科技的发展,现在有了三层交换机,三层交换机已经扩展到了网络层。也就是说:它等于“数据链路层 + 部分网络层”。交换机中传的是帧。通过存储转发来实现的。
路由器是工作在网络层。路由器中传的是IP数据报。主要是选址和路由。

15.
用两组数据,都在内存中,对他们排序分别需要1和2分钟;那么使用两个线程一起排序,大概需要多少时间?
理论上是3分钟,都是用一个cpu来处理的,如果你的CPU是双核的话,可能用2分钟.

16.
UNIX进程包括那三个部分;
在UNIX系统中进程由以下三部分组成:①进程控制块PCB;②数据段;③正文段。
UNIX系统为了节省进程控制块所占的内存空间,把每个进程控制块分成两部分。一部分常驻内存,不管进程是否正占有处理器运行,系统经常会对这部分内容进行查询和处理,常驻部分内容包括:进程状态、优先数、过程特征、数据段始址、等待原因和队列指针等,这是进行处理器调度时必须使用的一些主要信息。另一部分非常驻内存,当进程不占有处理器时,系统不会对这部分内容进行查询和处理,因此这部分内容可以存放在磁盘的对换区中,它随用户的程序和数据部分换进或换出内存。
UNIX系统把进程的数据段又划分成三部分:用户栈区(供用户程序使用的信息区);用户数据区(包括用户工作数据和非可重入的程序段);系统数据区(包括系统变量和对换信息)。
正文段是可重入的程序,能被若干进程共享。为了管理可共享的正文段,UNIX设置了一张正文表,每个正文段都占用一个表目,用来指出该正文段在内存和磁盘上的位置、段的大小以及调用该段的进程数等情况。

17.
.Setsockopt,ioctl都可以对Socket的属性进行设置,他们有什么不同?
ioctl改变的是系统内核的行为,setsockopt改变的是应用socket的行为;

18.
程序什么时候应该使用线程,什么时候单线程效率高?
(1)耗时的操作使用线程,提高应用程序响应
(2)并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求
(3)多CPU系统中,使用线程提高CPU利用率
(4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。
其他情况都使用单线程。

19.
Linux有内核级线程吗?
线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。 Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程

20
使用线程的如何防止出现大的波峰;
意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。

21
.一般数据库如出现日志满了,会出现什么情况,是否能使用?
只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。也就是说基本上处于不能使用的状态。

22
1、进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2、线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1、速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2、资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3、同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内

23
操作系统中进程调度策略有哪几种?
FCFS(先来先服务),优先级,时间片轮转,多级反馈队列

24
进程的经典三态以及切换过程,详细描述;
1、进程的三种基本状态
就绪(Ready)状态 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
执行(Running)状态 当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
阻塞(Blocked)状态 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
2、进程间转换过程
(1)就绪→执行:处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2)执行→就绪:处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
(3)执行→阻塞:正在执行的进程因等待某种事件发生而无法继续执行时便从执行状态变成阻塞状态。
(4)阻塞→就绪:处于阻塞状态的进程,若其等待的事件已经发生,进程由阻塞状态转变为就绪状态。

你可能感兴趣的:(系统编程,通信,网络)