来自https://www.cnblogs.com/inception6-lxc/p/9073983.html
15.内存池、进程池、线程池
线程池:启动若干数量的线程,让他们处于睡眠状态,当需要开辟一个线程完成某个具体的工作,就唤醒。工作完成后不销毁线程,而是让它再次处于睡眠状态。
进程池:类似于线程池。
内存池:先向系统申请一块足够大的内存,程序需要申请内存时,不向操作系统申请,而是直接从内存池获取;程序释放内存时,直接返回内存池;只有当程序退出时,才真正把内存池申请的内存释放。
16.动态链接和静态链接的区别
静态链接:在形成可执行程序前,将所有的目标文件链接,执行时不能修改。
动态链接:将程序分成多个模块,在运行时再链接成一个完整的程序。(为了解决静态链接占用内存大,更新困难的问题)
动态链接执行效率低,占用空间小,更新简单。
C++的静态库和动态库:
静态库:链接时会与其他文件一起被链接到可执行文件中。
动态库:链接时通过exe的符号表查找然后调用,实现动态链接。(不是运行时链接而是链接时动态查找)
17.虚拟内存优缺点
虚拟内存:一种具有请求调入和置换功能,能从逻辑上对内存容量加以扩充的存储系统。其逻辑容量由内存之和和外存之和决定。
虚拟内存的特点:
a.多次性:允许作业被分成多次调入内存运行
b.对换性:允许作业在运行时换进换出,无需作业运行时常驻内存
c.虚拟性:从逻辑上扩充内存的容量,使用户看到的容量,远大于实际的容量。
18.中断与系统调用
中断:计算机执行程序的过程中,由于出现了特殊的事情,使得CPU暂停程序的执行。
分为三类:
软中断:由于执行了引起中断的指令而造成的中断,如系统调入。
硬中断:由于计算机硬件异常或故障而引起的中断。
外部中断:由于外部设备而引起的中断
中断优先级:机器错误>时钟>磁盘>网络设备>终端>软件中断
系统调用:程序的执行一般是在用户态下执行的,但当程序需要使用操作系统提供的服务时,比如说打开某一设备、创建文件、读写文件(这些均属于系统调用)等,就需要向操作系统发出调用服务的请求,这就是系统调用。
19.C++多线程,互斥,同步
20.内部碎片,外部碎片
内部碎片是已经分配的比请求空间大的内存空间。
外部碎片是因为太小无法分配给请求空间的进程的空间。
分页存储系统存在内部碎片,分段存储系统存在外部碎片。
为了有效利用内存,内存用页为单位来使用,最后一页往往装不满,就形成了内部碎片。
为了共享要分段,在段的换入换出时形成了外部碎片,比如5K的段换出去,4K的段换进来,就形成了外部碎片。
21.什么是线程安全
如果多线程的程序运行结果是可预期的,并且和单线程运行结果一样,那么说明是线程安全的。或者说线程安全能保证多个线程按照一定的顺序执行,所以得到的结果也是符合预期的。
22.同步与异步
分为调用者和被调用者
同步:调用者在调用之后,没得到结果之前就不回继续调用,必须等有结果了才行。
异步:调用者调用后可以继续调用。
异步还需要通知机制,让调用者知道某个请求被完成了
主要通知机制有:
a.让调用者不断的轮询
b.让被调用者通知调用者
c.完成后调用调用者的回调函数(和2一样,通过回调函数告诉调用者)
同步和异步的区别:请求发出后是否需要等待结果,才能继续执行其他操作
23.系统调用和库函数的区别
系统调用:用户在用户态需要使用内核态的功能就可以使用访管指令来进行系统调用,是一种特殊的中断指令。
库函数:把常用的函数编写完放到一个文件里,编写应用程序时调用,由第三方提供,发生在用户空间。
移植性:不同操作系统的系统调用一般不同,系统调用移植性差;而在所有的ANSI C编译器版本中,C库函数是相同的。
调用开销:系统调用需要在用户态和核心态之间切换,开销大;库函数属于“过程调用”,开销小。
24.守护,僵尸,孤儿进程的概念
守护进程:运行在后台独立于控制终端并周期性的执行某些任务的进程
僵尸进程:一个进程fork子进程,子进程退出,而父进程没有wait/waitpid某子进程,那么进程的描述符仍在系统中。
孤儿进程:一个父进程退出,而他的一个或多个子进程还在运行。(孤儿进程将由init进程收养并完成对他们的状态收集)。
25.信号量和互斥锁
信号量:在初始化变量的时候,可以控制多少个线程或进程同时访问一个临界区,其他的线程或进程会被阻塞,直到有人解锁。
互斥锁:相当于只允许一个线程或进程访问的信号量。
26.IO多路复用
IO多路复用:内核一旦发现进程指定的一个或多个IO准备读取,就通知该进程。
27.线程共享资源和独占资源问题
28.进程间通信
每个进程都拥有自己的地址空间,一个进程的全局变量另一个进程看不到,进程间通信必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷贝到内核缓冲区,进程B再从内核缓冲区把数据读出来,内核提供的这种机制称为进程间通信。
有管道(一般是匿名管道):半双工通信数据只能单向流动,并且只能在具有亲缘关系的进程间使用。
命名管道:半双工,允许无亲缘关系进程通信。
消息队列:有消息组成的链表,存放在内核中由消息队列符标识。
首先在一个进程中创建消息队列,再往消息队列写数据,消息队列是以文件的形式创建的,如果另一个进程没有从消息队列中取出数据,即使向消息队列写数据的进程已经结束,保存在消息队列的数据并没有消失,也就是说下次再从这个消息队列读数据,就是上次的数据。
信号量:计数器,控制多个线程对资源的访问 。
信号:通知接收进程某个事件已经发生。
共享内存:由一个进程创建,但多个进程都可以访问。两个进程A,B共享内存的意思是同一个物理块被映射到A,B各自的进程地址空间,可以互相看到对进程的更新。
是最快的IPC方式,与信号量配合使用。
套接字:用于不同机器进程间的通信。
29.缓冲区溢出
计算机向缓冲区填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
30.中断的类型,中断和函数调用的区别:
外部中断:来自I/O事件、时钟中断
内部中断:CPU自己的错误,比如越界、堆栈溢出
系统调用:陷入,指令叫访管指令
中断和函数调用的区别:
中断:
(1)何时发生是不可预料的;当CPU正在处理某件事情,外部发生的某一事件请CPU立即去处理,CPU只能先去处理,再回到原来被终止的地方继续执行。
(2)对于可剥夺型内核,中断结束后,CPU不一定回到原来被终止的地方继续执行,而是到就绪队列优先级最高的任务开始运行。
(3)没有返回值
(4)没有参数
函数调用:
(1)何时发生是可预料的
(2)函数调用结束后回到原来的代码片段继续执行
(3)可有返回值
(4)可有参数
相同点:调度之前都有保存现场,都是调用一个subcode。
31.线程间通信机制
锁机制:
a.互斥锁:保证资源的互斥访问
b.读写锁:允许多个线程同时读取,但对写是互斥的
c.条件变量:条件不满足时让线程等待,一般与互斥锁一起使用。生产者消费者中,如果产品池=0,则无法消费,对于消费来说需要等待。
信号机制:信号就是事件,一个线程完成了某件事,通知另一个线程,这就是一个信号机制。
信号量机制:能保证多少个线程同时访问资源,对其他资源互斥。
操作系统面经(全部不是原创)
最新推荐文章于 2022-01-11 17:08:12 发布