【Linux】Linux面试经典题目---进程和线程部分

一、 进程和线程的区别
进程与资源分配有关,进程有自己的独立地址空间,程序更加健壮,但是通信较麻烦,线程是资源调度的最小单位,是共享进程中的数据的,开销更小,通信更加便利。
它们二者之间的区别为:

  • 1、进程与资源分配有关,进程有自己的独立地址空间,程序更加健壮,但是通信较麻烦,线程是资源调度的最小单位,是共享进程中的数据的,开销更小,通信更加便利。
  • 2、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
  • 3、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此
    CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  • 4、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 5、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
    总的来说,进程是资源分配的最小单位,而线程是资源调度的最小单位。

二、写时拷贝技术
在多进程编程中,我们都知道fork()会产生一个子进程,而且子进程就是父进程的一个副本。按照传统fork的方式,子进程获得父进程数据空间、堆和栈的副本。这种实现方式是在过于简单,粗暴,效率低下。为什么这么说呢?因为在fork之后,往往紧接着就会跟随exec。这种拷贝完全是无意义的,而且会极大的限制创建进程的速度。
所以Linux引入了写时拷贝技术,简称COW。它是一种可以推迟甚至可以免除拷贝数据的技术。fork时,内核此时并不复制整个进程的地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说在此之前都是以只读的方式访问。这种技术使地址空间上的页的拷贝被推迟到真正需要写入的时候。
现在fork之后的实际开销就是复制进程的页表和子进程创建唯一的进程描述符。这是一种极大的优化,避免了大量的无意义的拷贝。对于Linux这种强调快速切换的操作系统来说,这个优化有着重大的意义。
简单来说,写时拷贝技术技术就是内核只为新生成的子进程创建虚拟空间结构,它们来复制于父进程的虚拟究竟结构,但是不为这些段分配物理内存,它们共享父进程的物理空间,当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间。

三、进程间通信方式有那些?

1、无名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2、高级管道:将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
3、有名管道 : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
4、消息队列: 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5、信号量: 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6、信号 : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
7、共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
8、套接字: 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

四、僵死进程是什么,如何避免僵死进程 ?

1、僵死进程的定义:一个进程执行结束也就是代码部分执行结束,但是进程的PCB没有被系统释放。
进程结束后,在PCB中还要保存进程退出码,以备其父进程获取其退出码。而僵死进程恰恰就是父进程没有获取退出码。也就是父进程未结束,子进程结束,并且父进程没有获取子进程的退出码,这样就形成了僵死进程
2、如何避免僵死进程?
详见博客https://blog.csdn.net/qq_43411563/article/details/105945845

五、 全双工和半双工通信的区别

半双工
1、允许数据在两个方向上传输,但是同一时间数据只能在一个方向上传输,其实际上是切换的单工。2、例子:对讲机。
全双工
1、允许数据在两个方向上同时传输。
2、例子:手机通话。

六、什么是线程安全

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
(当多个线程访问某个方法时,不管你通过怎样的调用方式或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。)

七、同步和异步的区别

1、同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
2、异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
3、我们的生活中存在着很多同步异步的例子。比如:你叫我去吃饭,我听到了就立刻和你去吃饭,如果我们有听到,你就会一直叫我,直到我听见和你一起去吃饭,这个过程叫同步;异步过程指你叫我去吃饭,然后你就去吃饭了,而不管我是否和你一起去吃饭。而我得到消息后可能立即就走,也可能过段时间再走。如果我请你吃饭,就是同步,如果你请我吃饭就用异步,这样你比较省钱。
4、实现同步的机制主要有临界区、互斥、信号量和事件
临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资 源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作 。

八、守护进程

1、守护进程的定义
(1)守护进程是脱离于终端并且在后台运行的进程
(2)守护进程脱离终端是为了避免在执行过程中的信息在任何终端上显示,并且不被任何终端产生的终端信息所打断
(3)守护进程通常在系统引导装入时启动
2、创建守护进程的过程:

  • 创建子进程,父进程退出子进程变成孤儿进程,然后由1号init进程收养
  • 子进程创建新会话。调用setsid创建新的会话,摆脱原会话,原进程组,原终端的控制,自己成为新会话的组长
  • 将当前目录改为根目录。正在运行的进程文件系统不能卸载,如果目录要回退,则此时进程不能做到,为了避免这种麻烦,以根目录为当前目录
  • 重设文件权限掩码。子进程的文件权限掩码是复制的父进程的,不重新设置的话,会给子进程使用文件带来诸多麻烦
  • 关闭不需要的文件描述符。子进程的文件描述符也是从父进程复制来的,那些不需要的文件描述符永远不会被守护进程使用,会白白的浪费系统资源,还可能导致文件系统无法结束

九、fork 后内核会干一些什么事情, fork 创建进程的底层原理

1、

  • fork()函数其实是调用发起_fork()系统调用,控制权由用户态转为内核态,
  • 内核会分配新的内存块和内核数据结构给子进程。
  • 然后内核会将父进程的部分数据内容以二进制形式拷贝到子进程,
  • 下来再将所谓的子进程PCB加入到管理链表中。
  • 然后从内核态返回用户态(父进程fork返回进程pid,子进程返回0)
  • 然后调度器开始调度

2、fork()系统调用通过复制一个现有进程来创建一个全新的进程。进程被存放在一个叫做任务队列的双向循环链表当中,链表当中的每一项都是类型为task_struct称为进程描述符的结构,也就是我们写过的进程PCB。
Tips:内核通过一个位置的进程标识值或PID来标识每一个进程。

十一、协程是什么

协程是一种可以暂停执行过程的函数,它可以中断当前的执行过程直到下一个 指令达成。
我的理解是可以把它当成为类似于CPU 在多个进程间切换,从而达到多个进程同时执行的效果。协程是一种比线程更加轻量级的存在,一个进程可以拥有多个线程,一个线程也可以拥有多个协程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值