什么是操作系统
操作系统就是运行在计算机上的一个程序,用于管理软件和硬件资源。就比如电脑上的应用程序都是通过操作系统来调用系统内存以及磁盘等等。操作系统帮助我们屏蔽了底层硬件的复杂性,相当于提供了接口给到我们去使用。
什么是系统调用
系统调用之前需要了解两个概念,也就是用户态和系统态
用户态就是说,用户态运行的进程可以直接读取用户程序的数据
系统态就是以系统态运行的程序几乎可以访问所有计算机资源,不受限制
我们所运行的程序基本都是在用户态的,也就是说,无法直接去访问系统级别的资源和操作,也就需要系统调用。
也就是说当涉及到系统态的操作的时候,就需要使用到系统调用向操作系统发起服务请求,就比如对文件的管理,进程控制等
说一下进程和线程的区别
根本区别:进程是操作系统分配的基本单位,线程是处理器调度和执行的单位
两者关联:进程有独立的代码和数据空间(程序上下文),因此程序直接切换的开销比较大;线程可以看做轻量化的进程,属于线程的一部分,共享进程代码和数据空间,线程也有自己的独立空间,运行栈和程序计数器,因此线程切换的开销会比较小。
内存分配:进程间地址空间和资源不共享,线程间地址空间和资源共享
影响关系:一个线程崩溃后,会使得整个进程崩溃,
一个进程就有多个线程,进程相当于执行的一个程序,被加载到内存中运行,线程相当于该程序的一段代码。
执行过程:每个独立的进程有程序运行的入口和执行顺序。但是线程不能够单独运行,依赖于应用程序。
比如java中的jvm虚拟机,就有5个区域,两个共享区域就属于进程的大区域,堆和方法区,而一个又一个的线程则有自己的独立空间,虚拟机栈,本地方法栈,程序计数器
进程一般有几种状态
- 创建
- 就绪
- 运行
- 阻塞
- 结束
说一下进程间的通信方式
- 匿名管道:父子进程或兄弟进程中通信
- 有名管道:任意两个进程通信
- 信号:通知进程某个事情发生了
- 套接字:客户端和服务器间通信,比如支持TCP/IP网络通信
- 信号量:一个共享资源,所有进程可以访问,目的是使进程间同步
- 消息队列:一个具有消息的列表,放在内核中,等待读取
- 共享内存:访问同一片内存空间
说一下进程间的同步方式
- 互斥量
- 信号量
- 事件:wait/notify
说一下进程调度算法
- FCFS先来先到
- LRU最近最久未使用
- SJF短作业优先
- 时间片轮转调度
- 多级反馈队列调度算法
- 优先调度算法
什么是死锁
多个线程竞争共享资源,当一个进程申请资源时,如果没有可用资源,线程会等待,而拥有资源的另一个线程占有资源,不释放,也就会导致死锁。
一般来说,产生死锁主要有四个条件
- 互斥:资源处于非共享状态,只能有一个进程使用
- 请求和等待:一个进程至少占有一个资源,等待另一个资源
- 循环等待:一组持有B等待A,另一组持有A等待B
- 非抢占:资源不能被抢占,只能在持有资源的任务完成后,才会释放
怎么去解决死锁
破坏死锁产生的条件
破坏互斥条件,让资源可以同时访问,也就解决了死锁的问题,但通常是互斥访问的。
破坏请求等待条件,当线程长时间没有去请求到资源的时候,释放当前所拥有的所有资源,让其他线程进行任务。
破坏循环等待条件,让每个任务有序的执行,规定让一个线程先去获取所有的资源,顺序完成任务
破坏非抢占:采用剥夺式算法,剥夺资源,先完成自己的任务
还有就是去避免死锁,比如使用银行家算法,模拟给一个进程分配资源后,会不会发生一个死锁的情况,如果发生了,就作废,否则成功分配
实际解决办法:
- 暴力,结束所有进程的执行
- 撤销涉及死锁的所有进程,解除死锁后继续运行
- 逐步撤销涉及死锁的进程,回收资源直到死锁解除
- 抢占资源
什么是内存管理
操作系统对内存的分配和回收
常用的内存管理机制有哪些
连续分配管理,也就是分配一块连续的内存,比如块式管理
非连续分配管理,也就是离散的储存,比如有页式管理、段式管理和段页式管理
页式管理就是把内存分为一片一片的页,页比较小,相比较于块来说,所以,一个程序离散的加载到不同的页中
段式管理就是将内存分为大小不同的每个段,因为对于页式管理来说,有的时候会太多,有的时候会太少,产生浪费,碎片等问题,因此使用了不定长的段式管理
段页式管理就是两者结合在一起,先分成若干段,再分层若干页
什么是快表和多级页表
快表:在页表方案基础之上引入了快表来加速访问,就相当于缓存的作用,当我们普通查询的时候,需要访问两次主存,当快表中有缓存的时候,就只需要查一次主存和高速缓冲储存器,也就是快表储存在的地方。
多级页表也就是在一张页表可能会存放过多的数据的情况下产生的,如果页表数据过多,那么将页表加载到主存中所需要的io时间更长,无用的数据也更多。所以就采用多级页表,将原页表的数据再分散到二级页表,三级页表,也就减少了最终所需加载的一个数据量
分页机制和分段机制的区别和共同点
共同点:
提高了内存利用率,都是离散储存
段页内都是连续的
区别:
段的大小是不固定的,页的大小是相同的
分页是为了满足操作系统的需求,分段则是满足用户的需求,比如程序的加载,大小肯定是不固定的
什么是逻辑地址和物理地址
逻辑地址也叫虚拟地址,也就是相当于内存中的一个地址,指向的并不是真实的数据
物理地址就是真实物理内存中的地址,指向真实的数据
有了解CPU寻址么?为什么需要虚拟地址空间?
CPU寻址就是虚拟寻址,将虚拟地址翻译成物理地址,从而访问到真实的物理单元
假设没有虚拟地址空间,用户都是直接访问物理空间,那么就会很容易破坏物理单元所储存的内容,并且很容易会发生冲突,比如开一个微信和QQ,可能都需要用到同一个内存地址,那就冲突了,也就会导致其中一个软件崩溃
所以需要虚拟地址,虚拟地址可以将内存中不相邻的地址转换成相邻的虚拟地址,
可以用来加载远远大于内存空间的程序,采用动态替换目前所需的内容的方式
不同的进程使用的虚拟地址彼此是隔离的,不会被另一进程修改
什么是虚拟内存
虚拟内存就是让系统拥有超过物理内存大小的可用内存。为每一个进程创建了一个进程独享整个内存的错觉,每个进程拥有一片连续的内存空间。也就是虚拟地址去映射物理地址,虚拟地址的分配是可以连续的分配在物理地址上不是连续的程序,应用。
就比如一个游戏,100多G,它不可能一次性加载到内存中,第一内存没这么大,第二有些资源也不是立刻要去使用的,所以就可以采用动态加载的一个方式,先给程序分配空间,启动之后,如果有需要加载的内容,有空闲空间的话就把它加载到内存中,如果没有空闲的空间,就替换掉目前无用的空间。这样也就是在物理上延续了内存的错觉,实现了虚拟内存
什么是局部性原理
空间局部性:如果一个储存单元被加载了,那么它附近的储存单元也可能被加载,因为程序通常是顺序访问、顺序执行的
时间局部性:程序中的某一条一旦执行,那么它之后可能会被再次访问,储存单元也是如此,一旦被访问,也有可能再次被访问
什么是虚拟储存器
基于局部性原理,将程序的一部分装入内存,其他留在外存,访问时候调入,通过页面置换算法
相当于用时间去换空间,增大了一个内存的错觉
虚拟技术是怎么实现的
有三种实现方式
- 请求分页
- 请求分段
- 请求段页
有哪些页面置换算法
- OPT最佳页面置换算法
- LRU 最近最久未使用
- FIFO 先进先出
- LFU 最少使用