常见面试题(总结)- Linux/系统

C++工程师常见面试题-Linux/系统

1.进程和线程的区别

参考链接

  • 进程是程序执行时的一个实例。程序运行时系统就会创建一个进程并且为它分配资源,进程是资源分配的最小单位。进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成
  • 线程是程序执行的最小单位,它是进程的一个执行流。一个进程可以由很多个线程组成,各个线程之间共享程序的内存空间(也就是所在进程的内存空间),一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以进程间专门通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
  • 线程与进程关系的示意图:

2.进程间通信方式有哪些?

——参考链接

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcessCommunication)。

通信方式主要有:

3.怎么理解Linux文件系统中的inode节点?

文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个
sector组成一个 block。
文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inodetable),存放inode所包含的信息。 磁盘在格式化时会给每一个inode编一个号码,操作系统用inode号码来识别不同的文件。

Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

4.硬连接、符号连接、复制三者关系

  • 每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向,想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode 号码才能读取。
  • 硬连接、符号连接都会创建一个文件指向目标文件,不同的是硬连接创建的文件指向的inode指向的是目标文件的inode;符号链接会创建一个inode指向目标文件,相当于windows下的快捷方式;而复制文件,会重新再物理空间上创建一个新文件,新文件除了和原来的文件内容一模一样外,其他毫无关系。

具体三者关系如下:(1.txt是原文件,2、3、4分别是硬链接、符号连接、复制创建的文件)

综上可以得出:

  • 删除文件 2、3、4对源文件一点影响都没有
  • 删除源文件1.txt,对硬连接文件2和复制文件4没有影响,但是会导致符号连接文件3失效。(因为删除文件1.txt,相当于只是删除了1.txt指向他的inode节点)

5.常用Linux命令

初级命令

命令名命令说明实例实例说明
ls列文件和目录ls -l /root列出/root目的长格式(完全属性)列表
cd变换路径cd /root进入到 /root 目录
pwd显示当前路径pwd显示当前目录完整的路径
cp复制cp 1.txt /home/abc将1.txt文件复制到 /home/abc下
mv移动/改名 文件mv * /home/abc将当前目录下所有文件移动到/home/abc下
rm删除rm -rf /home/abc无需提示删除/home/abc目录及其所有子目录和文件
mkdir建立目录mkdir /test创建/test目录
cat查看文件全部内容cat test.txt查看test.txt的全部内容

中级命令

命令名命令说明实例实例说明
chmod改变文件访问权限chmod ug+w,o-x text即设定文件text的属性为:文件属主(u) 增加写权限与文件属主同组用户(g) 增加写权限其他用户(o) 删除执行权限
ln给文件建立多个名字。这样可以方便的节约空间或通过不同名字引用同一文件ln -s a.txt b.txt创建一个b.txt文件,他相当于是a.txt 的快捷方式
find根据文件名查找find . -name 'file在当前目录下查找file开头的文件
grep根据内容检索grep 'printf' /usr/include -R到系统头文件目录下查找所有包含printf的文件
kill向指定进程发送信号kill -9 123456彻底杀死进程id为123456的进程
mount挂接光盘镜像文件mount /dev/sdb1 /mnt挂载存储设备sdb1到挂载点/mnt目录

高级命令

  • tar——解压缩包管理

语法:tar [选项] 文件/目录 常见选项:
-c:创建一个档案
-x:从档案中解开文件
-v:详细显示过程(verbose)
-f:指定操作的tar文件名
-t:浏览档案的内容

对/home目录进行压缩备份,备份文件名为home.tar.gz

tar   zcvf   home.tar.gz   /home

解压home.tar.gz到 /home 目录

tar   zxvf   home.tar.gz   /home
  • ps——察看进程及其属性

ps的命令选项:

-e (-A):显示所有进程
-f :全格式
-H (f):显示树状结构,表示程序间的相互关系。
-l :长格式
e :列出程序时,显示每个程序所使用的环境变量。
c :列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
a :显示现行终端机下的所有程序,包括其他用户的程序。
u :以用户为主的格式来显示程序状况。
x :显示所有程序,不以终端机来区分。

最常见的参数组合是ps -efps -aux

6.什么是死锁?产生条件?如何避免死锁

死锁概念:

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

产生死锁的四个必要条件:

  • 1.互斥性:线程对资源的占有是排他性的,一个资源只能被一个线程占有,直到释放。

  • 2.请求和保持:一个线程对请求被占有资源发生阻塞时,对已经获得的资源不释放。

  • 3.不剥夺:一个线程在释放资源之前,其他的线程无法剥夺占用。

  • 4.循环等待:发生死锁时,线程进入死循环,永久阻塞。

产生死锁的原因

1.竞争不可抢占性资源
    p1已经打开F1,想去打开F2,p2已经打开F2,想去打开F1,但是F1和F2都是不可抢占的,这是发生死锁。
 2.进程推进顺序不当
    进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
    
死锁的解除和预防:

理解了死锁的原因,以及产生死锁的四个必要条件,就可以最大可能地避免和预防和解锁死锁。所以在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。对资源的分配要给予合理规划

1.破坏“请求和保持”条件

想办法,让进程不要那么贪心,自己已经有了资源就不要去竞争那些不可抢占的资源。比如,让进程在申请资源时,一次性申请所有需要用到的资源,不要一次一次来申请,当申请的资源有一些没空,那就让线程等待。不过这个方法比较浪费资源,进程可能经常处于饥饿状态。还有一种方法是,要求进程在申请资源前,要释放自己拥有的资源。

2.破坏“不可抢占”条件

允许进程进行抢占,方法一:如果去抢资源,被拒绝,就释放自己的资源。方法二:操作系统允许抢,只要你优先级大,可以抢到。

3.破坏“循环等待”条件

将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出

7.内存分区

在这里插入图片描述
栈(stack)区:栈是由编译器自动分配并释放,用户存放程序临时创建的局部变量,存放函数的参数值,局部变量等。也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味这在数据段中存放变量)。除此以外在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也回被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上将我们可以把栈看成一个临时数据寄存、交换的内存区。

堆(heap)区:堆是由程序员分配和释放,用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用realse释放内存时,被释放的内存从堆中被剔除(堆被缩减),因为我们现在iOS基本都使用ARC来管理对象,所以不用我们程序员来管理,但是我们要知道这个对象存储的位置。

全局(静态)区包含下面两个分区:

  • 数据区:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。
  • BSS区:BSS段包含了程序中未初始化全局变量。

常量区:常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,

代码区:代码段是用来存放可执行文件的操作指令(存放函数的二进制代码),也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值