面试总结之操作系统篇

本篇文章总结了操作系统中的一些基本知识点,其中有一些是在面试时经常会被问到的。在操作系统中面试官问的最多的应该就是进程和线程,那么我们就从进程、线程开始。


进程和线程:

进程的引入:为了使多个程序能够并发执行,以提高资源利用率和系统吞吐量,且对并发的程序进行描述和控制,引入了进程的概念。

注:进程是拥有资源的基本单位。


进程的状态:

就绪状态:当进程已分配到除CPU以外的所有必要资源后,只要再获取CPU,便可立即执行,进程这时的状态称为就绪状态。一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列;

执行状态:进程已获得CPU,其程序正在执行。在单位处理机系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态;

阻塞状态:正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态;

有的系统中还有挂起状态,那么进程的状态又分为静止就绪、活动就绪、执行、静止阻塞、活动阻塞。


进程同步:

信号量机制:整型信号量、记录型信号量AND型信号量

管程机制:

管程:代表共享资源的数据结构,以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序,共同构成了一个操作系统的资源管理模块,我们称之为管程。

由管程的名称、局部于管程内部的共享数据结构说明、对该数据结构进行操作的一组过程、对局部于管程内部的共享数据设置初始值的语句四部分组成。

临界资源:同一时刻只允许一个进程占用的资源。

临界区:对临界资源进行操作的代码。


进程通信:

1、共享存储器系统:1)基于共享数据结构的通信方式;2)基于共享存储区的通信方式;

2、消息传递系统:进程间的数据交换是以格式化的消息(message)为单位的,在计算机网络中又把message称为报文;

3、管道通信系统:所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件


线程的引入:为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。 

注:线程是独立调度和分派的基本单位

线程间的同步和通信:互斥锁、信号量

 

进程和线程的区别:

1、调度

在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,将会引起进程的切换。

2、并发性

在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,使得操作系统具有更好的并发性,从而能更加有效地提高系统资源的利用率和系统吞吐量。

3、拥有资源

进程都是拥有资源的基本单位;一般,线程自己不拥有系统资源(也有一点必不可少的资源)。

4、系统开销

在创建或撤消进程时,系统都要为之创建和回收进程控制块,分配或回收资源,如内存空间和I/O设备等,操作系统所付出的开销明显大于线程创建或撤消时的开销。


下面再详细讲下信号量和互斥锁

信号量与普通整型变量的区别:

①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问;

②操作也被称为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问;

 

信号量与互斥锁之间的区别:

1. 互斥量用于线程的互斥,信号量用于线程的同步。 

这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 

 

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源 。


2. 互斥量值只能为0/1,信号量值可以为非负整数。 

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问。

 

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。


信号量

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。


就像上面提到过的,信号量可以分为几类: 

²二进制信号量(binary semaphore):只允许信号量取0或1值,其同时只能被一个线程获取。 

²整型信号量(integer semaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。 

²记录型信号量(record semaphore):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。 

          信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。

          计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证,如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。


Semaphore可以被抽象为五个操作: 

- 创建 Create 

- 等待 Wait: 

线程等待信号量,如果值大于0,则获得,值减一;如果值等于0,则一直线程进入睡眠状态,直到信号量值大于0或者超时。 

-释放 Post 

执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。 

-试图等待 TryWait  

如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。 

-销毁 Destroy 

           信号量,是可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。

 

互斥量(Mutex) 

           互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。 

           Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。

 

Mutex可以被抽象为四个操作: 

- 创建 Create 

- 加锁 Lock 

- 解锁 Unlock 

- 销毁 Destroy 

           Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。



处理器调度与死锁:

调度算法:

1、先来先服务(FCFS)调度算法

2、短作业优先:

3、高优先权优先调度算法:[优先权的类型:静态优先权(进程创建时确定的)、动态优先权(在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能)]

4、高响应比优先调度算法:

5、基于时间片的轮转调度算法:1、时间片轮转法   2、多级反馈队列调度算法

 

实时调度:

实现实时调度的基本条件:就绪时间、开始截止时间和完成截止时间、处理时间、资源要求、优先级。

实时调度算法分类:抢占式、非抢占式;

常用实时调度算法:

1、最早截止时间优先即EDF(Earliest Deadline)算法:根据任务的开始截止时间来确定任务的优先级。

2、最低松弛度优先即LLF(Least Laxity First)算法:根据任务紧急(或松弛)的程度,来确定任务的优先级。


死锁: 

产生死锁的原因:

1、竞争资源引起死锁:竞争非可剥夺资源,竞争临时性资源

2、进程间推进顺序非法


产生死锁的必要条件:

1、互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用完释放。

2、请求和保持条件:指进程已经保持了至少一个资源,但又提出新的资源请求,而该资源又已被其它进程占用,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。

3、不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完成时由自己释放。

4、环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,...,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,....... ,Pn正在等待已被P0占用的资源。


处理死锁的基本方法:

预防死锁:摒弃产生死锁的必要条件的后三个条件

避免死锁:银行家算法

检测死锁:资源分配图、死锁定理:S为死锁状态的充分条件是:当且仅当S状态的资源分配图是不可完全简化的。该充分条件被称为死锁定理。

解除死锁:剥夺资源、撤消进程


存储器管理:

页面置换算法:

1、最佳置换算法:

2、先进先出(FIFO)页面置换算法:

3、最近最久未使用 (LRU)置换算法:(需要硬件支持)

4、Clock置换算法:

5、改进型Clock置换算法:

 6、其它置换算法:最少使用(LUF)置换算法、页面缓冲算法(PBA)


只列出了一个基本的大纲,注意理解消化这些概念,最好能根据自己的理解用自己的语言描述出来。如有错误,敬请指教。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值