参考回答:
CentOS 是 Linux 众多得发行版本之一, Linux 有三大发行版本(:Slackware,debian,RedHat), 而 RedHat 有收费的商业版和免费的开源版, 商业版的业内称之为 RHEL 系列, CentOS 是来自于依照开放源代码规定而公布的源代码重新编译而成. 可以用 CentOS 替代商业版的 RHEL 使用. 两者的不同, CentOS 不包含封闭源代码软件, 是免费的.
● 请解释一下, 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 驱动器, 打印机等等, 必须在占有该资源的进程主动释放它之后, 其它进程才能占有该资源. 这是由资源本身的属性所决定的.
(二)请求与保持条件: 一个进程因请求资源而阻塞时, 对已获得的资源保持不放. 进程至少已经占有一个资源, 但又申请新的资源; 由于该资源已被另外进程占有, 此时该进程阻塞; 但是, 它在等待新资源之时, 仍继续占用已占有的资源.
(三)不剥夺条件: 进程已经获得的资源, 在未使用完之前不能强行剥夺, 而只能由该资源的占有者进程自行释放.
(四)循环等待条件: 若干资源形成一种头尾相接的循环等待资源关系.
解决方法: 银行家算法
来源: http://www.bubuko.com/infodetail-3051702.html