转自:https://blog.csdn.net/csdn_chai/article/details/78002202
1.什么是操作系统?
OS是用户与硬件之间的接口,管理计算机的软件和硬件资源。
2.计算机的硬件包括:CPU、输入输出设备、存储器、总线等。
3.什么是进程?什么是线程?
进程是资源分配的独立单位,进程有独立的地址空间。是程序的一次执行,包含代码和数据。
线程是CPU调度的基本单位,线程使用父进程的数据空间,调度线程比调度进程更快,开销更小。
*资源分配中的资源是指:CPU时间、 存储器、文件和IO设备。
4.进程和线程的区别,相比进程,线程有哪些好处?
线程切换开销小。(我能想到的就这么多,具体是指哪些开销呢?我不知道)
区别:
1)一个进程可以有多个线程,多个线程可以并发。
2)进程和线程是不同的资源管理方式,进程拥有独立的地址空间,线程没有,同一进程的线程共享数据。
3)线程不占用系统资源,调度线程比调度进程开销小。
4)对于要求同时进行并且共享变量,只能使用多线程。
5.进程间通信的方式?
Linux和windows都有的通信方式:管道、socket、共享内存、消息。
但是具体都是怎么操作的呢?不知道
6.线程同步?进程同步?是什么?方式有哪些?
线程同步是指多线程通过特定的方式来控制线程之间的执行顺序(同步)。
1)互斥量。只能有一个线程访问公共资源,拥有互斥对象才能访问公共资源,保证公共资源不会被多个线程同时访问。
2)信号量。保证了访问公共资源的最大的线程个数。
3)临界区,同时只能由一个线程进入临界区,互斥访问。
//进程同步:信号量、管程、分布式系统。
7.那么什么是临界区呢?
临界区就是每个进程中访问临界资源的那段代码,不能多个进程同时进入。
1)如果一个进程进入了临界区,那么其他进程等待;
2)如果当前进程不能进入临界区,那么就要释放CPU资源。
3)进入临界区的进程有访问控制时间,以便其他进程进入。
比如访问打印机的代码,
实现临界区:软件实现,中断屏蔽,硬件指令法。
8.进程有几种状态?及其之间的转换?
就绪:进程已经获得了除CPU以外的所有资源,正在等待CPU调度。
运行:获得了CPU资源。
阻塞:进程等待某些条件,在某些条件达成前无法执行。
需要注意的是:运行到就绪状态转换是超时、时间片用完。
9.进程创建的过程
1. 给进程分类一个唯一的标识符
2.给进程分配存储空间
3.初始化进程控制块PCB(PCB见下)
4.放入队列,等待CPU资源。
11.进程调度的几种算法?
1)时间片轮转调度:给每个进程固定的时间片来执行,按照顺序,时间片使用完了之后就执行下一个。属于抢占式调度,平均等待时间较长,而且上下文切换频繁,
2)先来先服务:属于非抢占调度,实现简单,但是对短作业不利。
3)多级反馈队列调度:多个优先级队列,根据优先级的降低时间片长度增加,先执行优先级高的,每个队列内部使用时间片轮转,如果没在当前时间片内执行完,那么就放到下一优先级队列的队尾;高优先级队列为空时,去执行低优先级队列内容。
12.进程调度和线程调度
两者均有3种状态,当线程进行系统调用时会阻塞进程,但是线程还是处于运行态,不会阻塞。
用户级线程和内核级线程不太懂欸。
13.什么是死锁?
在两个以上的并发进程中,每个进程都保持某种资源,并且申请其他进程所占用的资源,而且又有循环等待,无法推进。
条件:互斥、循环等待(若干进程首尾相连形成环等待关系)、非剥夺(无法在进程结束前剥夺对资源的占有)、请求与保持(一个进程请求资源时,不释放自己占有的资源)
如何解决死锁?
1)死锁预防。
破坏后三个条件:
a.破坏循环等待,就是不让申请资源形成环路。对资源排序,进程如果申请到了R资源,那么下次只能申请排在R后面的,不能申排在其前面的,定制一个规则。
b.破坏非剥夺。当无法得到自己申请的资源时,先释放自己的资源,等需要时再申请。
c.破坏请求与保持条件,在程序运行前,必须申请所有需要的资源。(感觉b和c有点像啊!)
2)死锁避免。
没有采取上边三个措施预防,而是在资源动态分配的过程中,防止系统进入不安全状态。
代表算法:银行家算法。
寻找安全的进程序列,安全才分配资源。
对每个进程查看现在资源能否满足 其所需资源,如果可以,那么就分配,并且现有资源要变为现在有的资源数+已经分配进程的资源。
再对下一个进程进行同样的判定。看是否存在安全序列,如果存在才分配资源。
//没复习之前看见这两个感觉都是一样的,并且根本就不知道其中指的内容是什么。
死锁检测与解除:
资源分配图(其实看见资源分配图已经不知道是什么了)
转自:https://blog.csdn.net/ai977313677/article/details/72780203
有边和节点,边表示对资源的申请和占有,点表示进程,是有向图。
如果图中存在环路,那么可能存在死锁;如果图中不存在环路,那么肯定不存在死锁。
14.线程/进程同步和PV操作
//不知道这个会不会考到啊,但是好像什么都不记得了,还是复习一下吧!
-读者-写者问题
-哲学家就餐问题
1)读者写者问题
读文件时其他进程也可以读;写文件时,其他进程不能读也不能写。
读者优先:
将所有读者读完,才允许写者进来,会导致写者饥饿。
怎么实现呢?
这个就说的很好,有三个变量,因为readercount是一个全局的,那么它需要有个锁来保持它的更新统一。
当有读者时,读者数量++,如果是第一个读者,那么就P读写文件的互斥量;如果最后一个读者已经读完,那么就V互斥量,允许写者写了。
写者优先:
那么就让写者一直进来,对写者进行计数,如果是第一个写者,那么就将读取的锁P,如果是最后一个写者,那么就将读取的锁V;读者的代码是不变的。
总之就是对读者写者分别计数,第一个和最后一个的情况要做P和V的操作。
2)哲学家就餐问题
每次最多只允许4位哲学家拿左筷子,这样就可以允许有一位哲学家就餐,就餐完之后放下筷子,。
16.什么是物理内存?虚拟内存?
转自:https://blog.csdn.net/li187li/article/details/52802127
物理内存是实际的内存,在CPU中指的是寻址空间的大小,比如有20根总线,那么寻址空间就是1MB,32位内存寻址就是4GB。
那么为什么需要虚拟内存呢?
因为物理内存大小是有限的,如果现在运行的一个进程需要的内存可能是大于物理内存的,那么就不能所有的数据都加载到物理内存中,那么剩下的部分就需要先放到磁盘中,等需要时再调入内存,所以虚拟内存是进程运行时所用的内存空间的总和,并且有一部分是不在物理内存当中的。
什么是虚拟内存地址和物理内存地址呢?
计算机内存是分页的,有一个页表,映射虚拟内存页到磁盘,操作系统有页面失效功能,操作系统找到一个最少使用的页帧,并且将其写入磁盘,将需要访问的页调入内存,并且修改页表项的映射,保证了所有的虚拟页都会被调度。这就是处理虚拟内存到物理内存的步骤。
转自:http://www.cnblogs.com/dyllove98/archive/2013/06/12/3132940.html
在每个进程创建加载时,内核只是为进程创建了虚拟内存的布局,初始化PCB中的相关链表,建立起虚拟内存和磁盘的映射关系,并不需要立即把进程的程序和数据拷贝到物理内存中,等运行到对应的程序时,才通过缺页中断调入内存。
虚拟空间都被映射到了磁盘空间中,由页表映射到磁盘文件中,当访问到某个位置的时候,通过页表项判断是否在内存中,如果不是则缺页中断或会发生页面替换。
17.内存分区
四种:固定分区(内部碎片)、动态分区、分页、分段。
动态分区:最佳适配、首次适配、下次适配(从上次放置的位置开始选择一个满足大小的空闲块)
分页和分段的区别:
页表项映射到内存块中,每次CPU存取一个数据,都要两次访存,一次是访问页表,一次是访问实际物理地址,可以增加一个快表,
页面置换算法包括:NRU最近未使用、FIFO先进先出、尔二次机会等。
分段: