文章目录
- 一、操作系统总说
- 二、进程与线程
- 三、调度
- 四、重难点问题
-
- 4.什么是临界资源
- 4.介绍一下内存池、进程池、线程池
- 4.动态链接库与静态链接库的区别
- 4.说下对虚拟内存的理解(谈谈物理内存与虚拟内存)
- 4.局部性原理
- 4.虚拟存储器
- 4.虚拟内存技术的实现呢?
- 4.请求分页与分页存储管理,两者有何不同呢?
- 4.页面置换算法的作用?常见的页面置换算法有哪些?
- 4.逻辑(虚拟)地址和物理地址
- 4.CPU 寻址了解吗?为什么需要虚拟地址空间?
- 4.系统调用与库函数的区别
- 4.中断与系统调用了解吗?
- 4.什么是用户态和系统态?
- 4.用户态切换到内核态的方式有哪些?
- 4.用户态和核心态(内核态)之间的区别是什么呢?
- 4.内部碎片与外部碎片分别是什么?
- 4.守护、僵尸、孤儿进程的概念
- 4.操作系统的内存管理主要是做什么?
- 4.操作系统的内存管理机制了解吗?内存管理有哪几种方式?
- 4.快表和多级页表
- 4.分页机制和分段机制的共同点和区别
一、操作系统总说
1.什么是操作系统?
- 操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。 举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。
- 操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。
1.一个程序从开始运行到结束的完整过程(四个过程)
笔记:笔记
预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。
编译:将预处理后的文件转换成汇编语言,生成.s文件
汇编:汇编变为目标代码(机器代码)生成.o的文件
链接:连接目标代码,生成可执行程序
二、进程与线程
2.说下线程的状态
新建态—就绪态—运行态—阻塞态—等待态—超时等待态—终止态
由上图可以看出:线程创建之后它将处于 NEW(新建)
状态,调用 start()
方法后线程这时候处于 READY(就绪)
状态。就绪状态的线程获得了 CPU 时间片(timeslice)后就处于 RUNNING(运行)
状态。
当线程执行 wait()
方法之后,线程进入 WAITING(等待)
状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态;
而 TIME_WAITING(超时等待)
状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(long millis)
方法或 wait(long millis)
方法可以将 Java 线程置于 TIMED WAITING
状态。
当超时时间到达后 Java 线程将会返回到 RUNNABLE运行
状态。
当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 BLOCKED(阻塞)
状态。线程在执行 Runnable 的run()
方法之后将会进入到 TERMINATED(终止)
状态。
2.Java里的进程有哪些状态?
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
- 等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
- 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
- 其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5、终止状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
2.说下进程和线程的联系与区别
进程的概念、线程的概念、进程和线程的区别、进程和线程的联系等等,记住下面的就够了
- 概念:
进程是程序的一次执行过程,是系统运行程序的基本单位
线程是一个比进程更小的执行单位。一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 - 资源:资源分配给进程,同一进程的所有线程共享该进程的所有资源。(进程是资源分配的最小单位,线程是CPU调度的最小单位)
- 地址:进程有自己的独立地址空间,线程没有
- 上下文切换:进程上下文切换开销大,线程开销小
- 挂了:一个进程挂掉了不会影响其他进程,而线程挂掉了会影响其他线程对进程进程操作一般开销都比较大,对线程开销就小了
- 通信:进程和线程通信方式不同(线程之间的通信比较方便,同一进程下的线程共享数据。而进程之间的通信只能通过进程通信的方式进行。)
2.使用多线程可能带来什么问题?
内存泄漏、上下文切换、死锁
2.什么是多线程的上下文切换?
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。
当前任务执行一个时间片后会切换到下一个任务。
但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态
2.为什么进程上下文切换比线程上下文切换代价高?
- 线程上下文切换和进程上下文切换一个最主要的区别是线程的切换并
不需要使用新的地址空间
,但是进程需要切换页目录以使用新的地址空间
,切换进程最显著的性能损耗是将寄存器
中的内容切换出 - 另外一个隐藏的损耗是上下文的切换会扰乱
处理器的缓存机制
。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题
2.说下你对进程同步的理解
进程同步的主要任务:是对多个相关进程在执行次序上进行协调
,以使并发执行的诸进程之间能有效地共享资源和相互合作
同步机制遵循的原则:
- 空闲让进;
- 忙则等待(保证对临界区的互斥访问);
- 有限等待(有限代表有限的时间,避免死等);
- 让权等待(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)
2.进程的通信方式有哪些?
- 管道/匿名管道(Pipes) :用于具有
亲缘关系的父子进程
间或者兄弟进程
之间的通信。 - 有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机
任意两个进程
通信。 - 信号(Signal) :信号是一种比较复杂的通信方式,用于通知
接收进程
某个事件已经发生; - 消息队列(Message Queuing) :消息队列是
存放消息的链表
,管道和消息队列的通信数据都是先进先出
的原则。与管道不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。 - 信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
- 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
- 套接字(Sockets) : 此方法主要用于在
客户端和服务器之间
通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
2.线程间如何通讯
- 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
- 信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量
- 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操
三、调度
3.进程调度的种类有哪些?
短程调度:在内存里从ready到running这个是短程调度(内存—>cpu)
中程调度:从外存的挂起队列里选进程将其激活是中程调度(外存—>内存)
长程调度(作业调度):从外存把作业通过创建进程进到内存去这个时候发生的是长程调度。(外存—>内存)
3.非抢占式调度与抢占式调度的区别是什么?
- 抢占式:操作系统将
正在运行的进程
强行暂停,由调度程序将CPU分配给其他就绪进程的调度方式 - 非抢占式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生进程调度进程调度某事件而阻塞时,才把处理机分配给另一个进程
3.说下你知道的调度算法
先来先服务
公平、简单(FIFO队列)、非抢占、不适合交互式
未考虑任务特性,平均等待时间可以缩短
最短的作业(CPU区间长度最小)最先调度
SJF可以保证最小的平均等待时间
最短剩余作业优先
SJF的可抢占版本,比SJF更有优势
SJF(SRJF): 如何知道下一CPU区间大小?根据历史进行预测: 指数平均法
优先权调度
每个任务关联一个优先权&#