操作系统面试题(四)

时间:2022-01-27 18:29:23

操作系统之进程的描述与控制

● 请解释一下,LINUX下的线程,GDI类

考察点:线程

参考回答:

LINUX实现的就是基于核心轻量级进程的”一对一”线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。

GDI类为图像设备编程接口类库。

● 进程和线程的区别是什么?

考察点:JAVA进程

参考回答:

进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

● 谈一谈,系统线程数量上限是多少?

考察点:线程

参考回答:

Linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX。

这个限制可以在/usr/include/bits/local_lim.h中查看 ,对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源。

这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是8M=8192KB。

● 讲一讲,线程与进程的区别

考察点:进程,线程

参考回答:

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4) 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

● 请问,如何杀死一个进程?

考察点:进程

参考回答:

Kill pid

 

操作系统之输入输出系统

● 请介绍一下,socket编程的三种通信模型,BIO,NIO,AIO 

考察点:I/O多路复用

参考回答:

阻塞,非阻塞,io多路复用,epoll支持文件符数目没有限制,fd集合只会从用户进程拷贝到内核一次,自己维护一个事件队列,不用每次遍历fd集合发现是否有就绪状态。

 

操作系统之存储器管理

● 你怎么理解操作系统里的内存碎片,有什么解决办法?

考察点:内存碎片

参考回答:

内存碎片分为:内部碎片和外部碎片。

内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。

单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。

外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

使用伙伴系统算法。

● 介绍一下,什么是页式存储?

考察点:页式存储

参考回答:

主存被等分成大小相等的片,称为主存块,又称为实页。

当一个用户程序装入内存时,以页面为单位进行分配。页面的大小是为2n ,通常为1KB、2KB、2n KB等

 

操作系统之处理调度与死锁

● 请谈一谈,系统如何提高并发性?

考察:操作系统综合性

参考回答:

1、提高CPU并发计算能力

(1)多进程&多线程

(2)减少进程切换,使用线程,考虑进程绑定CPU

(3)减少使用不必要的锁,考虑无锁编程

(4)考虑进程优先级

(5)关注系统负载

2、改进I/O模型

(1)DMA技术

(2)异步I/O

(3)改进多路I/O就绪通知策略,epoll

(4)Sendfile

(5)内存映射

(6)直接I/O

● 请你解释一下,通常系统CPU比较高是什么原因?

考察点:处理机

参考回答:

1、首先查看是哪些进程的CPU占用率最高(如下可以看到详细的路径)

ps -aux --sort -pcpu | more

# 定位有问题的线程可以用如下命令

ps -mp pid -o THREAD,tid,time | more

2、查看JAVA进程的每个线程的CPU占用率

ps -Lp 5798 cu | more        # 5798是查出来进程PID

3、追踪线程,查看负载过高的原因,使用JDK下的一个工具

jstack 5798                        # 5798是PID

jstack -J-d64 -m 5798       # -j-d64指定64为系统

jstack 查出来的线程ID是16进制,可以把输出追加到文件,导出用记事本打开,再根据系统中的线程ID去搜索查看该ID的线程运行内容,可以和开发一起排查。

● 请谈一谈,什么情况下会发生死锁?解决死锁的策略有哪些?

考察点:死锁

参考回答:

(一)互斥条件:一个资源一次只能被一个进程访问。即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占 有。这种独占资源如CD-ROM驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。

(二)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。

(三)不剥夺条件:进程已经获得的资源,在未使用完之前不能强行剥夺,而只能由该资源的占有者进程自行释放。

(四)循环等待条件:若干资源形成一种头尾相接的循环等待资源关系。

解决方法:银行家算法