2. 进程与线程的区别。
进程与线程都是操作系统实现并发的一种手段。从调度角度说:进程是资源分配的最小单位,线程是系统调度的最小单位;从内存分配上说:进程有自己独立的内存空间,而线程只占有较少的内存资源,线程是共享进程的内存空间;从并发实现来说:进程由于有独立的内存空间,所以切换会引起较大成本,而线程切换成本较低,但若线程切换引起进程切换同样会引起较高的成本。
3. 进程通信的几种方式。
主要有三种方式:共享存储空间、消息传递、管道;
管道可分为有名管道和匿名管道,匿名管道用于父子进程间的通信,有名管道可以用于两个普通进程的通信,但管道要求通信双方同时在线,而且传递的信息也是按序读取;
消息传递:将消息放入到消息队列当中,等待其他进程来读取,读取不一定按放入顺序;
共享存储空间:将信息放入到共享的内存区域供其他进程读取;和前两者不同,两个进程通信只通过了一次拷贝,而前两者需要先拷贝到第三方区域,所以经过2次拷贝。
4. 线程同步几种方式。(一定要会写生产者、消费者问题,完全消化理解)
线程同步主要有以下几种方式:互斥量、信号量、条件变量等;
5. 线程的实现方式. (也就是用户线程与内核线程的区别)
根据操作系统对线程是否能感知,可将线程分为用户线程和内核线程;
内核线程的创建、销毁、管理都是通过系统调用完成,由操作系统负责;
用户线程是不需要内核支持,在用户程序中实现的线程;其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态、核心态的切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞会导致整个进程的阻塞。由于这里的处理器时间分配是以进程为基本单位,所以每个线程执行的时间相对减少。为了在操作系统中加入线程支持,采用了在用户空间增加运行库来实现线程,这些运行库被称为“线程包”。
用户线程的优点:1)可以在不支持线程的操作系统中实现;
2)创建、销毁及切换线程的代价都比内核线程少的多;
3)允许每个进程定制自己的调度算法,线程管理更灵活;
4)用户线程能够利用的表空间和堆栈空间比内核线程多;
缺点:1)同一进程中只能同是只有一个线程在运行,如果一个线程阻塞,整个进程也会阻塞;
2)处理器的时间分配相对较短;
6. 用户态和核心态的区别。
内核态:进程执行的是内核代码;
用户态:进程执行的是用户自己的代码;
7. 用户栈和内核栈的区别。
1)进程的堆栈
内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。
2)进程用户栈和内核栈的切换
当进程因为中断或者系统调用而陷入内核态时,进程所使用的堆栈也要从用户栈转到内核栈。
进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态时,在内核态的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。
那么,我们知道从内核转到用户态时用户栈的地址是在陷入内核的时候保存在内核栈里面的,但是在陷入内核的时候,我们是如何知道内核栈的地址的呢?
关键在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为,当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。所以在进程陷入内核的时候,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了。
8. 内存池、进程池、线程池。(c++程序员必须掌握)
9. 死锁的概念,导致死锁的原因.
死锁产生的原因主要是多个进程间争夺资源。如两个进程A和B,同时需要使用两个资源a,b,其中a被A占有,b被B占有,而此时A需要使用b,B需要使用a,于是两个进程都进入等待状态,等待对方释放相应资源,从而导致死锁;
10. 导致死锁的四个必要条件。
互斥条件、请求与保持条件、不剥夺条件、环路等待条件;
11. 处理死锁的四个方式。
预防死锁、避免死锁、检测死锁解除死锁;
12. 预防死锁的方法、避免死锁的方法。
预防死锁方法:1)摒弃请求与保持条件,进程必须一次性申请此次运行所需的所有资源;
2)摒弃不剥夺条件,提出新请求的资源不能立即得到满足时,必须释放它已经保持了的所有资源,待以后需要时再重新申请;
3)摒弃环路等待条件,进程对资源的请求必须严格按照某一次序。
13. 进程调度算法。(周转时间 = 程序结束时间 -- 开始服务时间、带权周转时间= 周转时间 / 要求服务时间)
1)先来先服务:不利于短作业,有利于CPU繁忙性任务;
2)短作业优先:不利于长作业;
3)优先权调度算法:静态优先权和动态优先权;
4)时间片轮转调度算法
5)多级反馈轮转调度算法:轮询和动态优先权的结合;
14. Windows内存管理的方式(块式、页式、段式、段页式).
可以分为两大类:连续存储、离散存储;
连续存储:单一连续分配、固定分区分配、动态分区分配、伙伴系统、哈希分配;
离散存储:页式存储(将逻辑空间划分为大小相等的页,并将物理空间也划分为同样大小的块,将页放置到相就的块中,并建立页表)、段式存储(将逻辑空间按信息功能划分为段,如程序段、全局变量段等,然后将段放入到相应的物理块中,并建立段表)、段页式存储(先分段再分页,建立段表);段、页的存储方式会产生中断,所以需要硬件的支持。段、页存储方式是虚拟内存的实现方式。
15. 内存连续分配方式采用的几种算法及各自优劣。
单一连续分配:将内存空间分配给某一任务,逻辑地址即物理地址,只适合单任务操作系统;
固定分区连续分配:分区大小可相等也可不相等(划分为不同大小的分区),分区大小相等可能会引起分区碎片,同时也可能导致某些大型程序无法装入;
动态分区分配:根据进程的需要动态地分配内存空间,创建空闲链表,申请内存空间时按照某种算法在空闲链表中找到合适的内存空间,释放时将内存空间插入到空闲链表当中;分区分配算法包括:首次适应算法、循环首次适应算法、最佳适应算法、最坏适应算法、快速适应算法(将空闲链表按内存大小划分为多个链表);
伙伴系统:内存空间分配时按2的整数次方的大小进行分配,如需要1024的内存区域,如果不存在1024的区域,则将2048的区域划分为两个1024的区域,如果2048也没有,则将4096划分为两个2048的区域...内存分配和回收算法都比较复杂,系统成本较高;
哈希算法:构造以空闲内存空间大小为关键字的哈希表,需要时在哈希表中检索;
16. 动态链接及静态链接.
静态链接:将程序所需要的库直接嵌入到可执行程序当中,速度较快;但缺点也很明显:1)将所有库都的连接到可执行程序当中,会引起可执行程序的体积增大,占用较大的内存空间;2)不方便更新或升级,更新或升级需要程序重新编译;
动态链接:在需要的时候才将库函数的链接到可执行程序当中,速度较慢;但可以节省内存空间,方便升级等;
17. 基本分页、请求分页储存管理方式。
基本分页存储管理方式:将进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为块,也同样加以编号;在为进程分配内存空间时,把页放入到可以不相邻的物理块中,最后一个物理块会产生内存碎片。基本分布存储管理方式没有页面对换功能。
请求分布储存管理方式:在基本分布存储管理方式的基础上,增加了页面对换功能,这是虚拟存储技术的基石;
18. 基本分段、请求分段储存管理方式。
基本分段存储:将进程地址空间划分为若干个段,每个段都是有意义的逻辑信息;为每个段编号,每个段的逻辑地址都从0开始编址,并为每个段分配连续的内存空间,段的长度由相应的逻辑信息组长度决定,因而各个段的长度不等。段表包括基址和段长;
同样请求分段储存管理方式增加了页面对换功能;
19. 分段分页方式的比较各自优缺点。
分段分页是虚拟存储技术的基石;
1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存利用率;段是信息的逻辑单位,它含有一组完整的有意义的信息,分段是为了更好满足用户的需要;
2)页的大小是固定的,由操作系统决定;段的长度不固定,由用户所编写的程序决定;
3)分页的作业地址空间是一维的,即单一的线性地址空间,分段的作业地址空间是二维的,即需要段名,还需要段内地址;
20. 几种页面置换算法,会算所需换页数。(LRU用程序如何实现?)
1)最佳置换算法:将以后不再使用或暂时不会再使用的页面换出,不可能实现,只能用于评价其他置换算法;
2)先进先出置换算法:总是换出最先进入的页面;
3)最近最久未使用置换算法(LRU):为每个在内存的页面分配一个移位寄存器,当进程访问某个页面时,将最高位置为1;移位寄存器每隔一段时间向右移一次,换页时,寄存器值最小的页面被换出;
4)最少使用置换算法:换出最近最少使用的页面,在实现上和LRU类似;
21. 虚拟内存的定义及实现方式。
所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的存储器系统,其逻辑容量由内存容量和外存容量之和决定;虚拟内存主要以以下两种方式实现,一是分页请求系统,一是分段请求系统。
22. 操作系统的四个特性。
并发性:多个进程在同一时间间隔内执行;
共享性:系统中的资源可供多个并发执行的进程使用;
虚拟性:将一个物理实体变成若干个逻辑上的对应物;
异步性:在多道程序设计环境下,允许多个进程并发执行,但各个进程的执行并非一次完成,而是“走走停停”。
23. DMA。
直接存储器访问
三种I/O方式:程序I/O方式、中断驱动I/O控制方式、直接存储器访问I/O控制方式
24. Spooling。
SPOOLing(Simultaneous Peripheral Operation On-Line)技术,即外部设备联机并行操作,是为实现低速输入输出设备与高速的主机之间的高效率数据交换而设计的。通常称为“假脱机技术”,又称为排队转储技术。
具体来说,SPOOLing技术在输入输出之间增加了“输入井”和“输出井”的排队转储环节,以消除用户的“联机”等待时间。而所谓“输入井”和“输出井”则是在高速辅存(外存)中开辟的两个固定的转储区。在系统输入模块收到作业输入请求信号后,“输入管理模块”中的读过程负责将信息从输入装置中通过“通道”读入内存中的缓冲区,当缓冲区满时,则由写过程将信息从缓冲区写到外存的输入井中,读过程和写过程反复循环,直到一个作业输入完毕。当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入输入井并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存运行。系统在管理输入井过程中可以“不断”读入输入的作业,直到输入结束或输入井满而暂停。
对于其输出过程,可以以打印机为例来进行说明。当有进程要求对它打印输出时,SPOOLing系统并不是将这台打印机直接分配给进程,而是在输出井中为其分配一块存储空间,进程的输出数据以文件形式存在。各进程的数据输出文件形成了一个输出队列,由“输出管理模块”控制这台打印机进程,依次将队列中的输出文件实际打印输出。
从打印机的例子中,我们可以看到,在SPOOLing技术的支持下,系统实际上并没有为任何进程分配设备,而只是在输入井和输出井中为每个进程分配了一块存储区并建立了一张I/O请求表。这样,便把独占设备改造为共享设备,因此SPOOLing技术也是一种虚拟设备技术。
最后,通过总结,可知SPOOLing技术具有如下三个特点:
(1)提高了I/O速度。从对低速I/O设备进行的I/O操作变为对输入井或输出井的操作,如同脱机操作一样,提高了I/O速度,缓和了CPU与低速I/O设备速度不匹配的矛盾。
(2)设备并没有分配给任何进程。在输入井或输出井中,分配给进程的是一存储区和建立一张I/O请求表。
(3)实现了虚拟设备功能。多个进程同时使用一个独享设备,而对每一进程而言,都认为自己独占这一设备,从而实现了设备的虚拟分配。不过,该设备是逻辑上的设备。
25. 外存分配的几种方式,及各种优劣。