OS知识点总结

转自:https://blog.csdn.net/csdn_chai/article/details/78002202

1.什么是操作系统?

OS是用户与硬件之间的接口,管理计算机的软件和硬件资源。

2.计算机的硬件包括:CPU、输入输出设备、存储器、总线等。

3.什么是进程?什么是线程?

进程是资源分配的独立单位,进程有独立的地址空间。是程序的一次执行,包含代码和数据。

线程是CPU调度的基本单位,线程使用父进程的数据空间,调度线程比调度进程更快,开销更小。

*资源分配中的资源是指:CPU时间、 存储器、文件和IO设备。

4.进程和线程的区别,相比进程,线程有哪些好处?

 线程切换开销小。(我能想到的就这么多,具体是指哪些开销呢?我不知道)

 区别:

1)一个进程可以有多个线程,多个线程可以并发。

2)进程和线程是不同的资源管理方式,进程拥有独立的地址空间,线程没有,同一进程的线程共享数据

3)线程不占用系统资源,调度线程比调度进程开销小。

4)对于要求同时进行并且共享变量,只能使用多线程。

但是到底进程切换都有哪些操作呢?如果明白了肯定会加深这个的理解。

转自:https://blog.csdn.net/shadow2512/article/details/73611805

概念:进程切换就是被中断进程与待运行进程之间的上下文切换(必须在内核模式下进行进程切换)。

具体过程

转换为内核模式,压入程序状态字和程序计数器,将被中断进程的栈指针保存到进程控制块,调整被中断进程的状态,把被中断的进程加入相关队列等待,选中下一个进程改变其状态,设备被选中的进程的地址空间,将被选中进程的栈指针存到处理寄存器中;切换到用户模式并且弹出程序状态字和程序计数器。

进程切换发生在时间片中断、IO中断;终止系统调用、发生异常。

//看完上边这个还是不太懂啊,很抽象啊。

上下文包括:通用目的寄存器,浮点寄存器,程序计数器,用户栈,状态寄存器,内核栈,各种内核数据结构。

内核可以处于进程上下文和终端上下文

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资源。

10.PCB保存了哪些信息?

 保存了进程的标识信息(进程的id),进程的状态信息(就绪、运行、阻塞),进程的控制信息(调度相关信息:进程优先级;正文段指针、数据段指针)

 系统对进程的管理通过管理PCB实现;每个进程创建时否会分配PCB,在进程撤销时,收回PCB;提供进程调度需要的资源。

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位哲学家拿左筷子,这样就可以允许有一位哲学家就餐,就餐完之后放下筷子,。 

 

 

 

3)生产者-消费者问题

消费者不能消费空的缓冲区,生产者不能向满的缓冲区产生数据。

那么在运行生产者代码的时候先P一下empty判断是否是满的,并且对缓冲区的访问也是互斥的,有一个互斥量;生产完之后就V一下通知缓冲区有内容。

消费者也是如此,通知缓冲区有空闲。

 

15.互斥量和信号量

互斥量是一种特殊的信号量。

互斥量:它总被初始化为1,它的PV操作是在一个函数内,主要就是对临界区的进行封锁。

信号量:它是线程间通信的方法,PV操作在两个线程中,PV操作在两个线程中,通常一个线程释放信号量,另一个在信号量上排队。初始化为非负数0~n.。

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先进先出、尔二次机会等。

分段:

转载于:https://www.cnblogs.com/BlueBlueSea/p/9651761.html

发布了0 篇原创文章 · 获赞 10 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览