【操作系统专题】进程与线程通信/区别基本问题(超高频)
本问题对应的项目链接:高频题回答模版训练
PS:操作系统的面试,基本就是问这个问题,烂大街问题,所以最好可以说出自己的理解,而不是只会背诵
1、说一说进程间的通信方式有哪些?
2、那线程之间的通信方式又有哪些呢?
3、那你觉得有了进程,为啥还需要线程呢?他们有啥区别?
4、刚才说到了线程切换保存上下文,那你觉得上下文都有哪些内容需要保持呢?
5、进程里面有哪些内容?简单说一些
6、说一下进程(任务)调度算法
本问题对应的项目链接:高频题回答模版训练
PS:操作系统的面试,基本就是问这个问题,烂大街问题,所以最好可以说出自己的理解,而不是只会背诵
1、说一说进程间的通信方式有哪些?
2、那线程之间的通信方式又有哪些呢?
3、那你觉得有了进程,为啥还需要线程呢?他们有啥区别?
4、刚才说到了线程切换保存上下文,那你觉得上下文都有哪些内容需要保持呢?
5、进程里面有哪些内容?简单说一些
6、说一下进程(任务)调度算法
共以下 2 个回答
2、那线程之间的通信方式又有哪些呢?
线程间的通信模型有两种:共享内存和消息传递
基于共享内存,可以使用 volatile,并发包下的 CountDownLatch,ReentrantLock,LockSupport。基于消息传递,可以使用 Object 类提供的 wait,notify 方法。
4、刚才说到了线程切换保存上下文,那你觉得上下文都有哪些内容需要保持呢?
线程内部私有的是程序计数器和栈空间,因此线程切换的时候保存程序计数器当前的状态和栈空间数据即可。
1、说一说进程间的通信方式有哪些?
大致有五种:两种管道,消息队列,共享内存,信号和 Socket。
首先第一个管道,管道在 Linux 中分为匿名管道和命名管道,Linux 命令中的 | ,> 等都是匿名管道,作用是将前一个命令的输出作为后一个命令的输入。命名管道可以用 mkfifo 命令创建,可以用在一个进程往里写,另一个进程从里读的场景。
管道的优点是使用简单,但只能用于有亲缘关系的进程间通信,且为单向通信。
然后是消息队列,这个消息队列不是中间件那些 MQ,它是保存在操作系统内核的消息链表,A 进程要给 B 进程发消息,只需将数据写入这个消息链表,B 进程需要时读取即可。
消息队列的优点是支持独立于进程的消息传递,缺点是传递的数据要在用户和内核空间来回复制,效率低,同时数据大小受操作系统限制。
共享内存的出现解决了消息队列中的数据要在用户和内核空间复制的问题,它是让所有进程的某块虚拟地址,都映射到一块相同的物理内存中。这样某个进程对这块地址的写入,其它进程都能立马看到。
这种方式是进程间通信速度最快的,但需要考虑共享资源的同步问题。
还有就是信号 signal,信号是进程通信中唯一的异步通信机制,任何时候都可以对某个进程发送某种信号,比如常见的 kill 命令,Cltr + C 发送终止信号,Cltr + Z 发送暂停信号等。
除了同一台主机上不同进程的通信,还可以使用 Socket 实现不同主机上进程间通信,期间需要建立连接,然后使用 write 和 read 来传递数据。
2、那线程之间的通信方式又有哪些呢?
线程间的通信模型有两种:共享内存和消息传递
基于共享内存,可以使用 volatile,JUC 下的 CountDownLatch,ReentrantLock,LockSupport。基于消息传递,可以使用 Object 类提供的 wait,notify 方法。
3、那你觉得有了进程,为啥还需要线程呢?他们有啥区别?
引入进程,是为了使多个程序并发执行,以改善资源利用率、提高系统吞吐量。引入线程,则是为了减少程序并发执行时的所付出的时空开销。
进程相当于一个容器,线程只是里面的一个东西。并且程序的本质是线程在运行。从内存结构的角度出发,进程的内存结构包括代码段,数据段,堆栈等,统称为 PCB。而线程之间共享同一进程的代码段和数据段资源,但也有自己的栈空间等等,这些统称为 TCB;从包含关系出发,一个进程至少存在一个线程,也可以拥有多个线程,但一个线程只属于一个进程。
4、刚才说到了线程切换保存上下文,那你觉得上下文都有哪些内容需要保持呢?
由于线程是由进程创建的,同一个进程下的所有线程共享进程的代码段和数据段等资源,除此之外,线程还有自己的栈空间,以及自己的线程存储空间。
所以当线程切换时,只需要保存线程私有的栈空间以及私有数据等等。
5、进程里面有哪些内容?简单说一些
在操作系统中,使用进程控制块,也就是 PCB 来描述进程的。PCB 中主要包含进程描述信息,如进程标识符和用户标识符,前者用于唯一标识一个进程,后者用于标识进程所归属的用户;还有进程控制和管理信息,包括进程当前的状态和进程优先级等等;还有 CPU 相关信息,包括 CPU 中各个寄存器的值,当进程切换时,CPU 相关信息都保存在相应的 PCB 中,以便后续断点恢复。
6、说一下进程(任务)调度算法
常见的大约有六种:先来先服务,最短作业优先,高响应比优先,时间片轮转,最高优先级,多级反馈队列算法。
“首先先来先服务” 调度算法是最简单的。顾名思义,就是最先达到就绪队列的进程,优先运行。这对长作业有利,而短作业可能需要很长时间的等待时间。
“最短作业优先” 调度也是顾名思义,优先选择就绪队列中运行时间最短的运行。这对短作业有利,但对长作业不利,可能会造成多作业很多,长作业不断被延后的极端情况。
这两种算法都没有很好的权衡长短作业,而 “高响应比优先调度” 解决了这个问题,它给每个作业都定义了一个响应比:等待时间 + 要求服务时间➗要求服务时间,谁的响应比高就优先运行谁。当两个进程等待时间相等时,要求服务时间越小,响应比就越高,短作业就更容易运行;当两个进程要求服务时间相同,等待时间越长,响应比越高,这也兼顾了长作业进程。
还有就是使用最广,最公平的 “时间片轮转” 调度算法,它轮流为每个进程都分配一个时间片,进程只有获得时间片时才能运行,运行的时间取决于时间片的大小。如果时间片太大,会导致短作业的响应时间边长。如果时间片太小,又会带来过多的进程上下文切换,降低 CPU 效率。所以通常时间片设置为 20ms – 50ms 是一个合理的折中值。
由于 “时间片轮转” 算法是基于所有的进程同等重要,对于多用户计算机系统来说,它希望进程的调度具有优先级,每次从都从就绪队列中挑选出具有最高优先级的进行优先运行,这种算法叫做 “最高优先级” 调度算法。具体的优先级可以分为静态优先级和动态优先级。前者是指进程创建时就确定了优先级,后者是进程可以根据等待时间等等因素动态提高或降低优先级。
但 “时间片轮转” 也有缺点,比如低优先级的进程可能永远不会运行。而 “多级反馈队列” 调度算法综合了前面 “时间片轮转” 算法和 “最高优先级” 算法,它有多个就绪队列,每个队列代表的优先级从高到低,优先级越高时间片越短。它的工作流程为:新创建的进程会被放入到第一级队列的末尾,按先来先服务的原则排队等待被调度,如果在第一级队列规定的时间片没运行完成,则将其转入到第二级队列的末尾,以此类推,直至完成;这样的话,对于短作业来说,会在前几个锁分配时间片较小的队列就能优先完成。对于长作业来说,虽然经过的队列多,等待时间长,但同时分配的时间片也变长了。这个算法很好的兼顾了长短作业,同时也有较好的相应时间。