1. 进程与线程通信上的区别 windwj000 - 阿里AE部门春招一面

进程通信方式:

管道:半双工,固定的读端和写端;只能在有亲缘关系的进程直接进行通信;

FIFO命名管道:也是半双工,但是可以在无关的进程之间进行数据交换;FIFO有路径名与之关联,以一种特殊的设备文件的形式存在于文件系统中。

消息队列:消息队列是消息的链表,存放在内核中。一个消息队列有一个队列标识符来标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限制等缺点。

信号量:信号量是一个计数器,信号量常作为一种锁机制,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

共享内存:共享内存指两个或多个进程共享一个给定的存储区。

Socket:套接字也是一种进程间通信机制,与其他通信机制不同的是,它用于不同机器间的进程通信。

线程间通信方式:

全局变量:线程间的内存共享,多个线程同时监听一个变量,当这个变量发生变化时,线程能够感知并执行相应的操作。

消息传递:线程之间没有公共的状态,线程之间必须通过明确的发送消息来进行通信。wait/notify。

锁机制:互斥锁、条件变量、读写锁。 互斥锁以排他方式防止数据结构被并发修改。 条件变量阻塞线程,直到某个特定条件为真。条件变量与互斥锁一起使用。 读写锁允许多个进程同时读共享数据,对写操作是互斥的。

2. 操作系统中的调度算法 windwj000 - 腾讯看点春招一面

先来先服务算法(FCFS)、短作业有限调度算法(SJF)、优先调度算法、高响应比优先调度算法、时间片轮转调度算法、多级反馈队列调度算法。

先来先服务算法:FCFS调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。

在进程调度中,FCFS每次从就绪队列中选择最先进入该队列的进程,将处理机分配给它,使之投入运行,知道完成或因某种原因阻塞才释放处理机。

作业号

提交时间

运行时间

开始时间

等待时间

完成时间

周转时间

带权周转时间

1

8

2

8

0

10

2

1

2

8.4

1

10

1.6

11

2.6

2.6

3

8.8

0.5

11

2.2

11.5

2.7

5.4

4

9

0.2

11.5

2.5

11.7

2.7

13.5

计算上表中的平均等待时间、平均周转时间、平均带权周转时间。带权周转时间 = 周转时间 / 运行时间。

平均等待时间 = (0 + 1.6 + 2.2 + 2.5) / 4 = 1.575 平均周转时间 = (2 + 2.6 + 2.7 + 2.7) / 4 = 2.5 平均带权周转时间 = (1 + 2.6 + 5.4 + 13.5) = 5.625

FCFS调度算法是不可剥夺算法,看似对所有作业都公平,但是如果一个长作业先到达系统,就会使许多短作业等待很长时间。常常结合其他调度策略使用,如在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程使用FCFS原则。

特点:算法简单,效率低;长作业有利,短作业不利;利于CPU繁忙型作业,不利于IO繁忙型。

短作业有限调度算法(SJF):短作业优先调度算法是指对短作业优先调度的算法。短作业优先调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将他们调入内存运行。短进程优先调度算法,是指从就绪队列中选择一个或若干个估计运行时间最短的进程,将处理机分配给它,使之立即运行。

作业号

提交时间

运行时间

开始时间

等待时间

完成时间

周转时间

带权周转时间

1

8

2

8

0

10

2

1

2

8,4

1

10.7

2.3

11.7

3.3

3.3

3

8.8

0.5

10.2

1.4

10.7

1.9

3.8

4

9

0.2

10

1

10.2

1.2

6

平均等待时间 t = (0+2.3+1.4+1)/4=1.175 平均周转时间 T = (2+3.3+1.9+1.2)/4=2.1 平均带权周转时间 W = (1+3.3+3.8+6)/4=3.525

特点:对长作业不利,如果一个长作业进入系统后备队列,由于调度程序总是优先调度短作业,将导致长作业长期不被调度,发生“饥饿”现象;算法未考虑紧迫程度,不能保证紧迫性作业会被及时处理。

SJF调度算法的平均等待时间、平均周转时间最少。

优先级调度算法:又称优先权调度算法,即可用于作业调度,也可用于进程调度,算法中的优先级用于描述作业运行的紧迫程度。在作业调度中,优先级调度算法每次从后备队列中选择优先级最高的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给他,使之投入运行。

根据优先级更高的进程是否能抢占正在运行的进程,又可分为:抢占式优先级调度算法、非抢占式优先级调度算法。

根据进程创建后其优先级能否改变,分为:静态优先级、动态优先级。

高响应比优先调度算法:高响应比优先调度算法主要用于作业调度,该算法那是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑每个作业的等待时间和估计运行时间。在每次进行作业调度时,先计算后备作业队列中每个作业的优先比,从中选出响应比最高的作业投入运行。

Threadx消息队列_面试

特点:

  • 根据公式可知,在等待时间相同时,服务时间越短,响应比越高,有利于短作业。
  • 要求服务时间相同时,等待时间越长,响应比越高。
  • 对于长作业,作业的响应比随着等待时间增加而提高,等待时间足够长时,也能获得处理机。克服了饥饿,兼顾长作业。

时间片轮转调度算法:时间片轮转调度算法主要适用于分时操作系统。在这种算法中,系统将所有就绪进程按到达时间先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,即先来先服务,但仅能执行一个时间片,比如100ms。使用完一个时间片后,即便进程并未完成其运行,也必须释放出来处理机给下一个就绪进程,并返回到就绪队列的末尾重新排队等待运行。

时间片大小对系统性能影响很大。时间片足够大,则退化为先来先服务算法。时间片很小,处理机在进程间频繁切换,增大开销。因此要选择适当的时间片。

时间片长短由以下因素决定:系统响应时间、就绪队列中进程数目、系统的处理能力。

多级反馈队列调度算法:多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合和发展。

Threadx消息队列_面试_02

多级反馈队列调度算法可以兼顾多方面的系统目标:为提高吞吐量和缩短平均周转时间而照顾短进程,为获得较好的IO设备利用率缩短响应时间而照顾IO进程。

多级反馈队列调度算法的实现思想如下:

  1. 应设置多个就绪队列,并为各个队列赋予不同的优先级。
  2. 赋予各个队列中进程执行时间片的大小也各不相同,在优先级越高的队列中,每个进程的运行时间片就越小。
  3. 当一个新进程进入内存后,首先将它放入第1级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第2级队列的末尾,再同样地按FCFS 原则等待调度执行;如果它在第2级队列中运行一个时间片后仍未完成,再以同样的方法放入第3级队列……如此下去,当一个长进程从第1级队列依次降到第 n 级队列后,在第 n 级队列中便釆用时间片轮转的方式运行。
  4. 仅当第1级队列为空时,调度程序才调度第2级队列中的进程运行;仅当第1 ~ (i-1)级队列均为空时,才会调度第i级队列中的进程运行。如果处理机正在执行第i级队列中的某进程时,又有新进程进入优先级较高的队列(第 1 ~ (i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i级队列的末尾,把处理机分配给新到的更高优先级的进程。

特点:短作业优先、周转时间短、长作业不会发生饥饿。

原文链接 操作系统典型调度算法

3. CFS调度算法 windwj000 - 腾讯看点春招一面

CFS(Completely Fair Scheduler)调度算法,又称完全公平调度算法。Linux2.6内核使用CFS作为默认调度器。

CFS通过计算进程消耗的CPU时间来确定谁来调度,从而达到公平性。

绝对公平性:cfs定义了一种新的模型,其基本思路很简单,他把CPU当做一种资源,并记录下每一个进程对该资源使用的情况,在调度时,调度器总是选择消耗资源最少的进程来运行。这就是所谓的“完全公平”。但这种绝对的公平有时也是一种不公平,因为有些进程的工作比其他进程更重要,我们希望能按照权重来分配CPU资源。

相对公平性:为了区别不同优先级的进程,就是会根据各个进程的权重分配运行时间。进程的运行时间计算公式为:

分配给进程的运行时间 = 调度周期 * 进程权重 / 所有进程权重之和
调度周期很好理解,就是将所处于就绪态进程都调度一遍的时间。

原理:Linux通过引入virtual runtime(vruntime)来完成这个思想。实际运行时间到vruntime的换算公式:

vruntime = 实际运行时间 * 1024 / 进程权重

各个进程对资源的消耗可以通过比较vruntime来知道,vruntime越小,消耗的CPU资源越少。具体实现上,Linux采用了红黑树记录每一个进程vruntime,需要调度时,从红黑树中选取vruntime最小的进程出来运行。

原文链接:Linux的公平调度原理

4. 任务调度中如何控制进入某一节点的流量。使用消息队列,或者设计一个调度中心 windwj000 - 腾讯看点春招一面

不懂求补充

5. java中的线程有没有对应os上的线程 windwj000 - 网易互联网杭州研究院春招二面

在java1.2之后,Linux的JVM基于pthread,可以说java的线程就是依赖操作系统实现的,是1:1的关系。现在的java中线程的本质,其实是操作系统中的线程。

Threadx消息队列_操作系统_03