操作系统

1、进程和线程的区别和联系。
区别:

  • 根本区别:进程是系统进行资源分配的基本单位,实现了操作系统的并发**。线程是进程的子任务,是CPU调度和分派的基本单位,实现进程内部的并发
  • **在开销方面:**进程切换开销大(进程都有独立的代码和数据空间),线程切换开销小(同一类线程共享代码和数据空间)
  • 内存分配方面:系统会为每个进程分配不同的内存空间;系统不会为线程分配内存。

联系:

  • 一个进程至少包含一个线程,线程依赖于进程而存在
  • 进程和线程都可以并发执行
  • 进程在执行过程中拥有独立的内存单元,其中的所有线程共享进程的内存

2、进程间的通信的几种方式。

  • 管道:可用于具有亲缘关系的父子进程间的通信。
  • 命名管道:除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
  • 信号:信号是比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  • 消息队列:克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息。
  • 共享内存:最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
  • 信号量:主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段;
  • 套接字:简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

3、线程同步的方式

  • 互斥量 Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
  • 信号量 Semphare:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量
  • 事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

4、什么是死锁?死锁产生的条件?
两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。
死锁产生的四个必要条件:

  • 互斥至少有一个资源一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
  • 占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;
  • 非抢占:进程不能被抢占,即资源只能被进程在完成任务后自愿释放
  • 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系

3). 死锁的处理基本策略和常用方法
(1). 死锁预防基本思想:只要确保死锁发生的四个必要条件中至少有一个不成立,就能预防死锁的发生,具体方法包括:

  • 打破互斥条件:允许进程同时访问某些资源。
  • 打破占有并等待条件:可以实行资源预先分配策略。
  • 打破非抢占条件:允许进程强行从占有者哪里夺取某些资源。
  • 打破循环等待条件:实行资源有序分配策略。
    (2). 死锁避免
      死锁避免的基本思想是动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态
    (3). 死锁解除
      进程终止和资源抢占

5、进程有哪几种状态?

  • 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源;
  • 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数;
  • 阻塞状态: 进程等待某种条件,在条件满足之前无法执行;

6、线程有几种状态?
  创建、就绪、运行、阻塞、死亡。在给定的时间点上,一个线程只能处于一种状态。

7、分页和分段有什么区别(内存管理)?

  • 目的不同:页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地满足用户的需要。
  • 大小不同:页的大小固定且由系统决定;而段的长度却不固定,决定于用户所编写的程序。
  • 地址空间不同:分页的地址空间是一维的,只需一个记忆符即可表示一个地址;而分段的作业地址空间是二维的,既需给出段名,又需给出段内地址。

8、操作系统中进程调度策略有哪几种?

  • FCFS(先来先服务,队列实现,非抢占的):先请求CPU的进程先分配到CPU。
  • SJF(Short Job First,最短作业优先调度算法):平均等待时间最短。
  • 优先级调度算法:优先级越高越先分配到CPU,相同优先级先到先服务。存在的主要问题是:低优先级进程无穷等待CPU,会导致无穷阻塞或饥饿。
  • 时间片轮转调度算法(可抢占的):队列中没有进程被分配超过一个时间片的CPU时间,除非它是唯一可运行的进程。如果进程的CPU区间超过了一个时间片,那么该进程就被抢占并放回就绪队列。
  • 多级队列调度算法:将就绪队列分成多个独立的队列,每个队列都有自己的调度算法,队列之间采用固定优先级抢占调度。其中,一个进程根据自身属性被永久地分配到一个队列中。
  • 多级反馈队列调度算法:与多级队列调度算法相比,其允许进程在队列之间移动:若进程使用过多CPU时间,那么它会被转移到更低的优先级队列;在较低优先级队列等待时间过长的进程会被转移到更高优先级队列,以防止饥饿发生。

9、说一说进程同步有哪几种机制。
(1)信号量机制:一个信号量只能置一次初值,以后只能对之进行p操作或v操作。 由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。( P(S):①将信号量S的值减1,即S=S-1;②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。)
(2)自旋锁
旋锁是为了保护共享资源提出的一种锁机制。 调用者申请的资源如果被占用,即自旋锁被已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持着已经释放了锁,自旋锁是一种比较低级的保护数据结构和代码片段的原始方式,可能会引起以下两个问题;
(1)死锁
(2)过多地占用CPU资源

(3)管程
信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。因此后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。

(4)会合
进程直接进行相互作用

(5)分布式系统
由于在分布式操作系统中没有公共内存,因此参数全为值参,而且不可为指针。

10、什么是虚拟内存?

  • 虚拟内存将内存中暂时不需要的部分写入硬盘,看上去硬盘扩展了内存的容量,所以叫做“虚拟”内存。
  • 虚拟内存的作用是:使得应用程序认为它拥有连续的可用的内存,而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如随机存取存储器RAM)的使用也更有效率。

9.9看完了 9.10看完了

3.页面置换算法(某一时刻内存页帧已经被写满了,但这时又需要将一个页写到物理内存中,就需要将原本在物理内存中的某一页换出来。)

  • FIFO 先进先出算法:作业调度(实现简单,容易想到);
  • LRU(Least recently use)最近最少使用算法:根据使用时间到现在的长短来判断;
  • LFU(Least frequently use)最少使用次数算法:根据使用次数来判断;
  • OPT(Optimal replacement)最优置换算法:要保证置换出去的是不再被使用的页,或者是在实际内存中最晚使用的算法。

4.虚拟内存的应用与优点
  虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。

虚拟内存的使用可以带来以下好处:

  • 在内存中可以保留多个进程,系统并发度提高
  • 解除了用户与内存之间的紧密约束,进程可以比内存的全部空间还大

看完1遍:
1.颠簸
颠簸是指访问的页面被频繁地调入又调出的现象,导致进程的运行频繁地产生缺页中断,整个系统的效率急剧下降。

内存颠簸的解决策略:

  • 如果是因为页面替换算法,可以修改替换算法
  • 如果是因为运行的程序太多,造成程序无法同时将所有频繁访问的页面调入内存,则要降低多道程序的数量
  • 否则,还剩下两个办法:终止该进程或增加物理内存容量

2.局部性原理

  • 时间上的局部性:最近被访问的页在不久的将来还会被访问;
  • 空间上的局部性:内存中被访问的页周围的页也很可能被访问。

3.操作系统的演进
  无操作系统:人工操作,用户独占,CPU等待人工操作,资源利用率很低。
  批处理系统:批量输入任务,无需等待人工操作,资源利用率提升,提出多道程序设计。关于多道程序设计:是指在计算机内存中同时存放多个程序,多道程序在计算机的管理程序之下相互穿插运行。
  分时系统:人-机交互,多用户共享,资源利用率提升,及时调试程序。

4.操作系统的定义与目标

  • 定义:管理硬件,提供用户交互的软件系统。
  • 目标:方便性,有效性(提高资源的利用率),可扩充性,开放性

5.操作系统的功能

  • **设备管理。**对所有输人、输出设备的管理。
  • **存储管理。**主要是对内存的分配、保护和扩充。
  • **文件管理。**主要涉及文件的逻辑组织和物理组织,目录的结构和管理。
  • **进程管理。**主要是对处理机进行管理。
  • **作业管理。**为用户提供一个友好的环境,方便用户组织自己的工作流程。 (一个作业通常包括几个进程。 进程是一个程序在一个数据集上的一次执行,而作业是用户提交给系统的一个任务。)

6.操作系统的基本特性

  • 并发性:指两个或多个事件可以在同一个时间间隔发生。(并行:指两个或多个事件可以在同一个时刻发生)
  • 共享性:操作系统的中资源可供多个并发的程序共同使用,这种形式称之为资源共享。分为两种方式:互斥共享:当资源被程序占用时,其它想使用的程序只能等待。同时访问:某种资源并发的被多个程序访问。
  • 虚拟性:表现为把一个物理实体转变为若干个逻辑上的对应物。时分复用技术:资源在时间上进行复用,不同程序并发使用,多道程序分时使用计算机的硬件资源,提高资源的利用率。空分复用技术:用来实现虚拟磁盘(物理磁盘虚拟为逻辑磁盘,电脑上的C盘、D盘等)、虚拟内存(在逻辑上扩大程序的存储容量)等,提高资源的利用率,提高编程效率。
  • 异步性:在多道程序环境下,允许多个进程并发执行,但由于资源等因素的限制,使进程的执行以“停停走走”的方式运行,而且每个进程执行的情况(运行、暂停、速度、完成)也是未知的。

7.为什么需要进程:

  • 进程是系统进行资源分配和调度的基本单位;
    • 进程的存在使得操作系统资源的利用率大幅提升
  • 进程作为程序独立运行的载体保障程序正常执行。

8.进程控制块(PCB):用于描述和控制进程运行的通用数据结构记录进程当前状态和控制进程运行的全部信息

9.进程(Process)与线程(Thread)**:

  • 线程:操作系统进行运行调度的最小单位
  • 进程:系统进行资源分配和调度的基本单位
  • 区别与联系:一个进程可以有一个或多个线程;线程包含在进程之中,所有线程共享进程资源;一个进程可以并发多个线程,每个线程执行不同的任务。

10.进程的五状态模型

  • 创建:创建进程时拥有PCB但其它资源尚未就绪
  • 就绪:其它资源(进程控制块、内存、栈空间、堆空间等)都准备好、只差CPU的状态。
  • 执行:进程获得CPU,其程序正在执行。
  • 阻塞:进程因某种原因放弃CPU的状态。
  • 终止:进程结束由系统清理或者归还PCB的状态。
    在这里插入图片描述
    9.11看完了
    3.线程同步问题:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。

a.生产者-消费者问题:有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者进程可以并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程需要将所生产的产品放到缓冲区中(+1操作),消费者进程可以从缓冲区取走产品消费(-1操作)。
在这里插入图片描述
产生问题:当两者并发执行时可能出差错。

b.哲学家进餐问题:有5个哲学家,他们的生活方式是交替的思考和进餐,哲学家们共同使用一张圆桌,分别坐在5张椅子上,圆桌上有5只碗和5只筷子。平时哲学家们只进行思考,饥饿时则试图取靠近他们的左右两只筷子,只有两只筷子都被拿到的时候才能进餐,否则等待,进餐完毕后,放下左右筷子进行思考。
在这里插入图片描述
   产生问题:
在这里插入图片描述
  c.进程同步的作用:对竞争资源在多进程间进行使用次序的协调,使得并发执行的多个进程之间可以有效使用资源和相互合作。
  d.进程间同步的四原则:
   空闲让进:资源无占用,允许使用;
   忙则等待:资源被占用,请求进程等待;
   有限等待:保证有限等待时间能够使用资源;
   让权等待:等待时,进程需要让出CPU。
e.进程同步的方法(重要,后面讲解):消息队列,共享内存,信号量。
f.线程同步的方法(重要,后面详解):互斥量,读写锁,自旋锁,条件变量。
  
  4. Linux的进程管理
  a.进程的类型
   前台进程:具有终端,可以和用户交互;
   后台进程:基本不和用户交互,优先级比前台进程低;
   守护进程:特殊的后台进程,在系统引导时启动,一直运行直到系统关闭,如crond、sshd、httpd、mysqld…
  b.进程的标记
   进程ID:非负整数,进程的唯一标记,每个进程拥有不同的ID;
   进程的状态标记:R表示进程处于运行状态,S表示进程处于睡眠状态…
  c.操作Linux进程的相关命令
   ps命令:列出当前的进程,结合-aux可打印进程详细信息(ps -aux)
   top命令:查看所有进程的状态
   kill命令:给进程发送信号

1.什么是红黑树?
红黑树(Red Black Tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。
它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。
红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

2.AVL(Adelson-Velsky-Landis Tree,名字)树插入或删除一个节点的过程是怎样的?
AVL树是一种高度平衡的二叉搜索树,其每一个结点的左树高和右树高相差不大于1。这个性质使得AVL树的搜索效率要比普通的二叉搜索树要高,因为对于一组递增的数组,其构成的二叉搜索树会是一个链表,搜索时间复杂度自然就是O(n),而其构成的AVL树则肯定是一个搜索效率为O(lg(n))的二叉树。也正因为此,为了保持其平衡的性质,AVL树的插入和删除要比普通二叉搜索树要复杂。
AVL树的插入与删除:凡是二叉查找树,或者叫做二叉排序树(BST),所有新插入的关键字均存储在新创建的叶子结点上。因为AVL是也是一种特殊的BST,故它的插入的新结点,也都是插入到叶子结点处。再进行旋转调整平衡。

删除操作:
把待删除的结点及其所有孩子看做一棵子树,待删除的结点为这棵树的根。

删除操作比较复杂,这里只说一下原理,不写代码了。
1)如果待删除的结点是叶子结点,那么直接删除该叶子结点,并将其父结点对应指针置nullptr,同时,从下向上依次调整该条路径上的平衡。这是最简单的情况
2)当待删除的结点只有一棵子树的时候,将待删除结点的父结点对应的指针指向该子树,之后,删除该结点,同时,从该父结点开始,从下向上依次调整该条路径上的平衡。
3)当待删除的结点有左右两棵子树时,找到该结点的相邻关键字。然后,将该关键字的值赋值给待删除的结点。这样,就把问题转化为删除该关键字所在的叶子结点问题了。即第1)种情况。
解释一下什么叫做相邻关键字。对于不在叶子结点上的关键字a,它的相邻关键字为其左子树中的最大值或 其右子树中的最小值。从该定义可以清晰地看出,相邻关键字一定位于叶子结点处。更直白地说,相邻关键字就是,沿着a的左指针来到其左子树的根结点,然后沿着右指针一下往右走,直到叶子结点为止。 或者是, 沿着a的右指针来到其右子树的根结点,然后沿着左指针一下往左走,直到叶子结点为止。

  1. LL情况

采用右旋方法来解决 失衡问题。
在这里插入图片描述
从上图我们看到,最小子树的根,即失衡结点为A,采用右旋,将A旋转到A的左孩子的右孩子位置。可以形象地看出,结点A绕着自己的左孩子B,向右顺时针旋转到了当前位置。

  1. RR情况
    采用左旋转的方法解决。
    在这里插入图片描述
    从上图可以看出,最小子树的根为A,采用左旋转方法,即向左 逆时针旋转。将根节点旋转到(根节点的)右孩子的左孩子位置。可以形象地看出,结点A绕着自己的右孩子B,向左逆时针旋转到了当前位置。

  2. LR情况
    在这里插入图片描述
    LR情况需要两次旋转,先左旋,再右旋。要先 以失衡点的左孩子为根进行左旋,再以失衡点为根进行右旋。

  3. RL情况
    在这里插入图片描述
    RL情况也需要两次旋转,先右旋,再左旋。要先以失衡点的右孩子为根进行右旋,再以失衡点为根进行左旋。

3.冒泡排序如何优化?
(1)2个优化点:记录最后交换的位置,在之后的循环中,最后交换位置后面的数就不需要参与循环了。
(2)用一个Flag参数记录,如果某一次循环中,所有数都未发生交换,说明已经有序,则可以不用执行后面的循环了。

4.快排的基本思路是什么?最差的时间复杂度是多少?如何优化?

  • 选择一个哨兵,将整个数据分为两组,左边的数据小于哨兵,右边的数据大于等于哨兵。对左右两组数据,再各自选择一个哨兵,将两组数据划分为更小的序列,这样一直进行下去,直到整个序列有序。

最差时间复杂度即是当数据有序的时候,这时候退化为冒泡排序,时间复杂度为O(n2)
时间复杂度最理想的就是取到中位数情况,那么递归树就是一个完全二叉树,那么树的深度也就是最低为Logn,这个时候每一次又需要n次比较,所以时间复杂度nlogn,当快排为顺序或者逆序时,这个数为一个斜二叉树,深度为n,同样每次需要n次比较,那那么最坏需要n2的时间

  • 第一种优化方法,与插入排序相结合,在小数组的情况下,快排比较慢,因为递归sort会出现调用自己情况,所以
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值