21秋招准备(操作系统基础)笔记本

1.进程与线程的本质区别、各自的使用场景

先了解一下相关的定义
程序:由若干条具有一定功能的指令所组成的解题顺序和步骤。
进程: 程序的一次执行,是操作系统进行资源分配和调度的独立单位
线程: 是系统独立调度和分派的基本单位,是进程的一个实体。它有一个执行入口,通常会是某个函数的指令入口。

相关比较
1)调度
线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一个进程中,线程的切换不会引起进程的切换,但是在不同进程中进行线程切换,就会引起进程切换。
2)拥有资源
线程不拥有系统资源(但是会有一些必不可少的资源),线程可以访问其所属进程拥有的资源。
3)并发性
进程之间可以并发执行,线程之间也可以并发执行,这使得操作系统具有良好的并发性,提高了系统的吞吐量。
4)系统开销
创建和撤销进程的时候,系统会为它分配/回收资源(空间、IO设备等)。所以进程切换时的系统开销较大,但是线程切换时只需要保存少量的寄存器内容,开销很小。
5)通信方面
进程之间的通信需要同步和互斥来辅助完成,而线程之间的通信则可以通过直接读写进程数据段来进行。

使用场景总结
1.需要频繁创建和销毁的优先使用线程(web服务器)。
2.需要大量进行计算的优先使用线程。
3.强相关的任务使用线程,弱相关的任务使用进程。

2.创建进程/线程的过程

创建进程
1.申请空白的PCB(过程控制块)
2.为进程分配资源
3.初始化PCB
4.将新进程插入就绪队列
PCB含有的信息:页目录、ID、父进程的ID、状态、句柄表

创建线程
操作系统在用户空间和内核空间分配两段栈

3.进程的状态(3态模型)

运行态:进程占有cpu正在运行
就绪态:进程已经具有了所有的运行条件,正在等待系统分配cpu以进入运行态
阻塞态:进程不具备运行的条件,正在等待某个事件的完成
进程状态的转换

4.进程调度算法的特点以及使用场景

不同的环境需要的调度方法也不同,简要划分出3类环境:批处理;交互式;实时

批处理系统
1.先来先服务(FCFS):非抢占式,虽然容易实现,但是效率较低。对长作业有利,对短作业不利,对CPU繁忙型作业有利,不利于I/0繁忙型作业。

2.最短作业优先(SJF):非抢占式。对长作业不利(导致“饥饿”现象),且作业长短是根据用户估计的运行时间而定,有一定主观因素在。
(注意:SJF算法的平均等待时间和平均周转时间最少)

3.最短剩余时间有限(SRT):抢占式,可以使得新来的短作业获得良好服务。

4.高响应比有限:响应比 = (等待时间+要求服务时间)/要求服务时间。是一种折中的方法,但是会导致系统开销增大(因为要计算响应比)。

交互式系统
1.轮转调度:选择就绪队列的第一个进场,且仅分配一个时间片。兼顾了长短作业,但是平均等待时间过长,上下文切换费时。

2.优先级调度:选择优先级最高的进程。分为抢占、非抢占式,一般对实时性要求比较高的系统就选择使用抢占式。

3.多级队列:时间片轮转调度和优先级调度的综合发展。

实时系统

5.实现多线程的几种方式(JAVA)

1.继承Thread类的方式
2.实现Runnable接口的方式
以下两种jdk1.5新增
3.实现callable接口
4.使用线程池
线程池:将很多小任务交给一组线程来执行,而不是一个任务对应一个新线程,这种能接收大量小任务并进行分发处理的就是线程池。

线程池内部维护了若干个线程,当没有任务的时候,这些线程都处于等待状态,如果有任务,就分配一个空闲线程执行。如果所有的线程都处于忙碌状态,新任务要么等待,要么增加一个新线程进行处理。
Java标准库提供了ExecutorService接口表示线程池。
Java标准库提供的几个常用实现类:FixedThreadPool:线程数固定的线程池
CachedThreadPool:线程数根据任务动态调整的线程池
SingleThreadExecutor:仅单线程执行的线程池

6.协程的作用

协程(Coroutine):单线程下的并发,又称作微线程,纤程。简单理解成线程中的线程。
协程不被操作系统内核所管理,而是完全由程序所控制,在用户态执行。
优点:轻量级,创建成本小,内存消耗少。

7.常见的进程同步问题

进程同步(互斥)遵循的原则:
空闲让进;
忙则等待(保证对临界区的互斥访问);
有限等待(避免死等);
让权等待(当进程无法进入自己的临界区时,释放cpu,避免进入忙等);

8.进程通信方法的特点以及使用场景

进程通信,指进程之间的信息交换,分为高级通信(用户利用操作系统提供的一组通信命令传送大量数据)和低级通信(信号量)。
1.管道:管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。当进程试图读空管道时,在有数据写入管道之前,进程将一直阻塞。同样地,当管道满时,进程试图写管道,在管道内数据被移走之前,写进程也将一直阻塞。

2.消息队列:是一个在系统内核中用来保存消息的队列,在系统内核中以消息链表的形式出现。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

3.共享内存:共享内存允许两个或者多个进程访问同一个逻辑内存,这一段内存被两个或多个进程映射至自身地址空间,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程通过简单的内存读取操作读出,也就实现了进程之间的通信。共享内存是最快的IPC方式。

4.套接字:套接字也是一种进程之间通信的机制,与其他通信机制不同的是,它可以用于不同机器间的进程通信。

9.死锁必要条件、解决死锁策略,能写出和分析死锁的代码,能说明在数据库管理系统或者 Java 中如何解决死锁

死锁产生的3个必要条件,1个充分条件:
互斥:至少有一个资源属于非共享模式,一次只能被一个进程使用,若其他进程申请使用该资源,那么申请进程必须等待到该资源被释放为止。

占有且等待:一个进程必须占有至少一个资源,并且等待另一个资源,而该资源为其他进程所占有。

非抢占

循环等待:若干进程形成一种头尾相接的环形等待资源关系

解决死锁策略:
1.死锁预防(破坏死锁产生的4个条件)
打破互斥(无实用价值)

打破占有且等待(实行资源预分配策略,但是很多时候进程执行前所需所有资源是无法被预知的)

打破非剥夺(实现困难,会导致系统性能降低)

打破循环等待(实行资源有序分配策略),对所有资源排序编号,所有对资源的请求必须严格按照资源序号递增的顺序提出。

2.死锁避免
动态地检测系统资源分配状态(资源分配图算法、银行家算法),避免系统进入不安全状态。

3.死锁检测和解除
允许死锁的发生,系统负责检测出死锁并解除死锁。

JAVA中如何解决死锁

信号量??

10.虚拟内存的作用,分页系统实现虚拟内存原理

虚拟内存从逻辑上扩充内存空间,但是实际上内存并没有增加。在内存中可以保留多个进程,系统并发度提高。

每个进程拥有独立的地址空间,这个空间被分为大小相等的很多个块,称为页(Page),每个页都是一段连续的地址。这些页被映射到物理内存,但是并不是所有的页面都必须在内存中才能运行程序。实际上,当程序引用到一部分在物理内存中的地址空间时,由硬件立刻进行必要的映射,当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。

一些页面置换算法:
FIFO先进先出
LRU最近最少使用
LFU最少使用次数
OPT最优置换(理论最优)

11.页面置换算法的原理,特别是 LRU 的实现原理,最好能手写,再说明它在 Redis 等作为缓存置换算法。

//待看

12.比较分页和分段的区别

段是信息的逻辑单位,段式存储管理是一种符合用户视角的内存分配管理方式。在段式存储管理中,将程序的地址空间划分为若干段,如代码段、数据段、堆栈段,段大小可变。段式管理的优点:没有内部碎片。但是在段换入
换出时会产生外碎片。(4k的段换5k的段,会产生1k的外部碎片)

页是信息的物理单位,页式存储将程序的逻辑地址划分为多个固定大小的页,物理内存也划分为同样大小的页框,程序加载时,将任意一页放入内存中任意一个帧,帧不必连续,实现了离散分离。页式存储的优点:没有外部碎片,但是可能有内部碎片。

二者不同
1.目的不同:分页是为了系统管理的需要和方便,而分段则是为了更好地满足用户的需求。

2.大小不同:页的大小固定且由系统决定,段的长度不固定,由其完成的功能决定。

3.地址空间不同:段向用户提供二维地址空间(段号,段内位移量);页向用户提供一维地址空间。

13.分析静态链接的不足,以及动态链接的特点

静态链接的不足:
1.浪费空间,每个可执行程序中对所有目标文件都有一个副本

2.更新困难,每当库函数的代码修改,就需要重新编译链接形成可执行程序

动态链接的特点:
// 这一部分没太懂网上找到的大部分是c/c++

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值