• 操作系统面试题(四)


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

    ● 请解释一下,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驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。

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

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

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

    解决方法:银行家算法

  • 相关阅读:
    Problem: 八中上厕所
    Problem: 最短路上的统计
    股票买卖问题
    Redis(十二)——Redis为什么是单线程的?
    链表题汇总
    Redis(十一)——集群模式
    Redis(十)——哨兵模式
    Redis(九)——主从复制
    Redis(八)——客户端与服务器
    Redis(七)——事件
  • 原文地址:https://www.cnblogs.com/cmgg/p/11150873.html
Copyright © 2020-2023  润新知