1. 进程的有哪几种状态,状态转换图,及导致转换的事件。
就绪 运行 阻塞
1. 就绪->运行: 进程调度. 当进程获得了除cpu之外的一切所需资源,一旦得到cpu即可运行. 2. 运行->就绪: 当占用cpu的进程时间片用完后,不得不让出cpu.(或者在可剥夺的系统中,当有更优先级的进程就绪时,进程调度会将正在运行的进程强行转换为就绪,让更高优先级的进程执行) 3. 当进程正在等待某一事件(如I/O操作)而暂停运行,这时即使CPU空闲,进程也不能运行 4.当进程等待的事件到来时,如IO操作结束或者中断结束时,中断处理程序需把相应进程的状态转换为就绪状态
2. 进程与线程的区别。
答: 1. 意义不同: 进程是程序实体的运行过程,是系统进行资源调度分配的一个独立单位,引入目的是为了使多个程序可以并发执行,以提高系统的资源利用率和吞吐量. 线程是比进程更小的可独立运行的基本单位.引入目的是为了减少程序并发执行过程中的开销,提升OS并发效率
2.调度方面: 在引入线程的OS中,线程是独立的调度和分派单位,而进程只是作为资源的拥有单位,在此线程不拥有资源(或者只是拥有很少的一部分资源,但可以访问所隶属的进程资源).
3.并发性: 进程可以并发,而一个进程内部的多个线程也可以并发
4.创建或者撤销进程时系统要为之创建或回收PCB以及系统资源等,而创建撤销切换线程只需要少量寄存器的保存与恢复 工作,不涉及存储器管理方面的工作,所以开销小
5.通信方面: 进程通信比较相比 在同一进程中的多个线程之间互相通信要麻烦一点. 线程通信由于共享地址空间,所以通信同步比较方便.而进程的通信则通过 共享空间 消息传递 管道通信 开销相对来说都比较大
3. 进程通信的几种方式。
共享空间: 在对通信的进程之间有一块可直接访问的共享空间,通过对这片共享空间进行读写操作实现进程之间的信息变换
管道通信:向pipe文件(共享文件)提供输入的发送进程(写进程),以字符流的形式将大量数据送入写管道,而接收方则从管道里面接收数据. (管道必须提供三个协调能力: 互斥 同步 确定对方存在)(半双工通信 数据只能单向流动)
消息传递: 利用 系统提供的消息传递方法(发送消息和接收消息两个原语)进行数据交换.(分为直接通信 和间接通信 两种)
信号量: 主要是作为进程间以及统一进程内部不同线程之间的同步手段
4. 线程同步几种方式。(一定要会写生产者、消费者问题,完全消化理解)
临界区
事件
互斥量
信号量
5. 线程的实现方式. (也就是用户线程与内核线程的区别)
用户级线程
内核级线程
使用用户级线程的优点: 进程不需要为了线程管理切换到内核态 可以不扰乱底层操作系统的调度程序 可以在任何操作系统运行
使用用户级线程的缺点: 当用户级线程执行一个系统调用时,不仅这个线程会阻塞,这个进程中所有线程都会阻塞 在纯粹的用户级线程策略中不能利用多处理技术
使用内核级线程的优点: 内核可以同时把同一个进程的多个线程调度到多个处理器中;如果进程中的一个线程被阻塞,内核可以调度同一个进程中的另一个线程
使用内核级线程的缺点:把控制从进程的一个线程传送到另一个线程时,需要内核的状态转换
6. 用户态和核心态的区别。
当进程执行的是用户写的代码时,就是用户态。权利很小。运行在用户态的程序不能访问内核的系统程序和数据结构
当进程执行的是系统内核代码时,就是和核心态.权利很大
用户态到核心态的转换有3种方式: 系统调用(主动) 异常 外围设备中断 (三种方式的核心其实都是中断机制)
7. 用户栈和内核栈的区别。
当进程在运行内核态时,CPU堆栈指针寄存器指向的是内核堆栈地址,使用的是内核堆栈(内存低端部分)
当进程运行在用户态时,CPU堆栈指针寄存器指向的是用户堆栈地址,使用的是用户堆栈(内存高端部分)
两种栈状态的切换是通过中断或系统调用(通过指令产生中断,被称为"软中断")来实现的
8. 内存池、进程池、线程池。(c++程序员必须掌握)
"池化技术" 就是提前保存大量资源,以备不时之需以及重复使用
为什么要池化? 答: 由于在实际应用当做,分配内存、创建进程、线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。
内存池 可参考Apache 和 NGINX 等web服务器的内存池构造. 内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放。
线程池:类似于操作系统中的缓冲区,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。
9. 死锁的概念,导致死锁的原因.
一组相互竞争同一系统资源或者进行通信的进程间的永久阻塞 被称为 "死锁"
导致死锁的原因: 系统资源不够 进程推进顺序不当 资源分配不当
10. 导致死锁的四个必要条件。
相互排斥: 一次只有一个进程可以获得同一资源.(一山不容二虎)
不可剥夺: 一个进程不可强行抢占已被其他进程占有的资源(不可虎口夺食)
请求和保持: 当一个进程等待其他进程时,它会持续占有已有资源(吃着嘴里的,看着碗里的,让别人看着)
循环等待: 在该进程链中,每个进程都至少占有下一个进程所需要的资源(管它用不用,占着再说)
11. 处理死锁的四个方式。
预防 : 尽量让以上三个必要条件不要发生. 或者直接让第四个条件不要发生
策略: 预提交资源(上文的内存池方法) 资源排序 抢占
避免: 允许前三个条件
检测
不限制资源访问或约束进程行为,只要有可能,被请求的资源就被授权给进程。操作系统周期性地执行一个算法检测前面的循环等待的条件。
综合
12. 预防死锁的方法、避免死锁的方法。
预防: 预提交资源(不需要抢占 低效 必须知道到底有多少待请求的资源) 抢占 资源排序(编译时检测 不需要并行时再计算 但是如果所需资源增加了?)
避免: 在死锁避免中,是否允许当前资源分配请求是通过判断该请求是否可能导致死锁来决定的。因此,死锁避免需要知道将来的进程资源请求的情况。
13. 进程调度算法。
先来先服务算法 : FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。
短作业优先调度算法 : 但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。
高优先权优先调度算法: 将以上两种算法的优点都包括 并且没有以上的缺点
基于时间片的轮调度算法: 时间片轮转法一般用于进程调度,每次调度,把CPU分配队首进程,并令其执行一个时间片。 当执行的时间片用完时,由一个记时器发出一个时钟中断请求,该进程被停止,并被送往就绪队列末尾;依次循环。
14. Windows内存管理的方式(块式、页式、段式、段页式).
15. 内存连续分配方式采用的几种算法及各自优劣。
16. 动态链接及静态链接.
静态链接就是在编译链接时直接将需要的执行代码拷贝到调用处,优点就是在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行,但是体积可能会相对大一些
动态链接(类似于dll)就是在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝,缺点是由于是运行时加载,可能会影响程序的前期执行性能。
动态链接库dll的两种链接方式: 装载时动态链接(Load-time Dynamic Linking)(有利于代码共享) 运行时动态链接(Run-time Dynamic Linking)
17. 基本分页、请求分页储存管理方式。
18. 基本分段、请求分段储存管理方式。
19. 分段分页方式的比较各自优缺点。
1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要(也是对用户透明的)。
段是信息的逻辑单位,它含有一组其意义相对完整的信息(比如数据段、代码段和堆栈段等)。分段的目的是为了能更好的满足用户的需要(用户也是可以使用的)。
2)页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。
段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
3)分页的作业地址空间是维一的,即单一的线性空间,程序员只须利用一个记忆符(线性地址的16进制表示),即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名(比如数据段、代码段和堆栈段等),又需给出段内地址。
4)页和段都有存储保护机制。但存取权限不同:段有读、写和执行三种权限;而页只有读和写两种权限
20. 几种页面置换算法,会算所需换页数。(LRU用程序如何实现?)
21. 虚拟内存的定义及实现方式。
虚拟内存是指为了扩充主存空间而在外存上开辟的一块存储空间.虚拟内存用来保存实际内存中暂时不用的程序或数据,使实际内存有更多的空闲空间来存放将要执行的程序或访问的数据,当需要执行的程序或访问的数据不在主存时,就从虚拟内存将其调入到主存,以便处理器执行或访问,这样就扩大了内存空间,操作系统对实际内存和虚拟内存统一编址和统一管理,这就是虚拟内存技术.
大多数的多任务操作系统都采用分页存储方式,使用虚拟内存技术。UNIX操作系统采用页面存储方式,Windows NT采用请求分页的虚拟存储方式,Linux系统采用按需调页的模式。在AIX系统中,也使用分页的存储方式管理存储器,并将虚拟内存称为页面空间(Paging Space),所有对实际物理内存和虚拟内存的访问都是由虚拟内存管理器(VMM)完成的
22. 操作系统的四个特性。
并发性 虚拟性 共享性 异步性
23. DMA。
DMA是指外部设备不通过CPU而直接与系统内存交换数据的接口技术。(直接内存存取技术)
24. Spooling。
SPOOLING技术(Simultaneous Peripheral Operating On Line)(假脱机技术)
利用这种技术可把独占设备转变成共享的虚拟设备,从而提高独占设备的利用率和进程的推进速度。
25. 外存分配的几种方式,及各种优劣。