技术岗面试基础知识复习——操作系统

什么是操作系统

在这里插入图片描述

  1. 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基⽯;
  2. 操作系统本质上是运⾏在计算机上的软件程序(在硬件基础上的第一层软件) ;
  3. 操作系统为⽤户提供⼀个与系统交互的操作界⾯(是其他软件和硬件之间的接口) ;
  4. 操作系统位于硬件与软件之间,操作系统工作在计算机硬件之上,软件工作在操作系统之上。即向下支持硬件,向上支持软件的一个程序。程序为用户服务,操作系统控制硬件为程序服务。
  5. 操作系统的功能是进行处理机管理,存储器管理,设备管理,文件管理和作业管理等

操作系统的特点:

1、并发性:在计算机系统中同时存在多个程序。 宏观上:这些程序是同时在执行的;微观上:任何时刻只有一个程序在执行。 即微观上这些程序在CPU上轮流执行
2、共享性:指计算机系统中的资源可被并发执行的程序共同使用。
3、不确定性:系统事件(运行、I/O等)的发生是具有随机性和不确定性。
4、虚拟性:把物理上的一个实体变成逻辑上的多个对应物,或把物理上的多个实体变成逻辑上的一个对应物的技术。(虚拟是指物理上没有提供,但是逻辑上却具备的功能。在用户看来好像是物理上原来就具有的功能一样。采用虚拟技术的目的是为了提高资源利用率和为用户提供易于使用、方便高效的操作环境。)

	并发和共享是操作系统的两个最基本的特征它们又是互为存在的条件。
	虚拟技术为共享提供了更好的条件,而并发与共享是导致不确定性的根本原因。

并行和并发

并行:在同一时刻多个指令同时执行。
并发:在同一时刻只能执行一条指令。(多个进程快速轮换,宏观上存在并行特征,像同一时刻多个进程在同时执行;微观上具有顺序性)

进程的同步与互斥

互斥:某一资源同时只允许一个访问者对其进行访问。具有唯一性和排他性。互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:基于互斥,经其它机制实现访问者对资源的有序访问。

进程和程序

  • 程序是静态的,进程是动态的(根本区别
    (程序是有序代码的集合,进程是程序的执行)

  • 进程和程序不是一一对应的,一个程序可以对应多个进程。如一个 QQ程序被多人登录。

  • 程序是永久的(可长久保存),进程是暂时的(是一个状态变化的过程)

  • 进程与程序的组成不同:

     进程包括程序,数据(程序运行所作用的对象)和进程控制块PCB(PCB是进程的描述信息和控制信息,是进程存在的唯一标志)
     程序是指令序列
    
  • 进程具有创建其它进程的功能,而程序没有。

进程和线程

进程:进程是资源分配的基本单位,是程序的一次执行过程。独立数据空间,进程间不共享数据,由系统调度。
线程:线程是资源调度的最小单位。是进程的一部分,是进程内的一个执行单元。执行程序的最小单元,由系统调度。
协程:由程序员调度,分解一个线程为多个“微线程”。
区别与联系:
1、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线。
2、进程昂贵,进程地址空间独立,每启动进程就要分配地址空间,还要建立数据表维护。而同一个进程下的各个线程共享进程的内存空间(包括代码段、数据集、堆等;栈是线程私有的),所以线程通信更方便,因为使用相同的地址空间。
3、多进程程序更健壮,因为一个进程死掉不会影响另一个进程,但多线程程序只要有一个线程死掉,整个进程就死掉了。
4.调度和切换:线程上下文切换比进程上下文切换要快得多。
5. 进程是操作系统分配资源的最小单位,线程是程序执行(资源调度)的最小单位。

注:一次只允许一个进程使用的资源称为临界资源。访问临界资源的程序区域称为临界区

进程的三种基本状态

1 就绪状态(ready) :进程已处于准备运⾏状态,即进程获得了除了处理器之外的⼀切所需资源,⼀旦得到处理器资源(处理器分配的时间⽚)即可运⾏。
2 运⾏状态(running) :进程正在处理器上上运⾏(单核 CPU 下任意时刻最多只有⼀个进程处于运⾏状态)。此状态进程数<=CPU数
3 阻塞状态(waiting) :⼜称为等待状态,进程正在等待某⼀事件⽽暂停运⾏如等待某资源为可⽤或等待 IO 操作完成。即使处理器空闲,该进程也不能运⾏。

注:进程除了三态模型,还有五态模型,即加入了以下两个状态:
1 创建状态(new) :进程正在被创建,尚未到就绪状态。
2 结束状态(terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运⾏。

进程的状态转换:

  1. 运行—》就绪:这是由调度引起的,主要是进程占用CPU的时间过长
  2. 就绪—》运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
  3. 运行—》阻塞:发生了I/O请求或等待某件事的发生
  4. 阻塞—》就绪:进程所等待的事件发生,就进入就绪队列

线程的五种状态

  1. 新建状态:新创建了一个线程对象。

  2. 就绪状态:当调用线程对象的start()方法后,该线程处于就绪状态,至于何时开始运行完全取决于Python解释器中线程调度器的调度。(不调用start()方法,而仅仅只调用run()方法的话,系统会把该线程当成一个普通对象,run()也只是一个普通方法,在run()方法运行返回之前,其它线程均无法并发执行,也就是说这个线程已经作为普通程序成了主线程的一部分。)

  3. 运行状态:只有当处于就绪状态的线程获得了CPU,开始执行run()方法后,此时该线程处于运行状态。处于运行状态的线程不可能一直处于运行状态(除非它的线程执行体足够短以至于瞬间就能结束任务),线程调度会使正在运行的线程被中断,目的是使其它线程获得执行的机会。处于运行状态的线程接下来只有两种去路,要么被堵塞,要么由于需要执行的任务处理完毕或异常原因进入死亡。

  4. 阻塞状态:被堵塞的线程解除堵塞后并不会再次进入运行状态而是进入就绪状态,它需要再次等待线程调度器去调度它,只有当它再次获得处理器资源后,它才会进入运行状态。线程会因为以下几种原因而被堵塞:

     线程调用sleep()方法主动放弃它所占用的处理器资源;
     线程调用一个阻塞式I/O方法,在该方法返回之前,该线程将被堵塞;
     线程试图获得一个锁对象,但该锁对象正被其它线程所持有;
     线程在等待某个通知;
    
  5. 死亡状态:线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

注:若对已死亡的线程再次调用其start()方法,这会导致程序抛出异常。可以用线程对象的is_alive()方法判断线程是否死亡,只有当线程处于新建或者死亡状态时,该方法会返回False。线程一旦被创建,它不会受到主线程的影响,它和主线程具有同等地位,主线程结束,其它线程也不会随之结束。

进程间的通信方式

  1. 管道/匿名管道(Pipes) :⽤于具有亲缘关系的⽗⼦进程间或者兄弟进程之间的通信。半双工通信,数据单项流动
  2. 命名管道(Names Pipes) : 匿名管道由于没有名字,只能⽤于亲缘关系的进程间通信。为了克服这个缺点,提出了命名管道。命名管道严格遵循先进先出(first in first out)。命名管道以磁盘⽂件的⽅式存在,可以实现本机任意两个进程通信。半双工通信
  3. 信号(Signal) :信号是⼀种⽐较复杂的通信⽅式,⽤于通知接收进程某个事件已经发⽣;
  4. 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(⽆名管道:只存在于内存中的⽂件;命名管道:存在于实际的磁盘介质或者⽂件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除⼀个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不⼀定要以先进先出的次序读取,也可以按消息的类型读取。⽐ FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载⽆格式字节流以及缓冲区⼤⼩受限等缺。消息的链接表,克服信号量有限的缺点,具有写权限的进程可以按一定的规则向消息队列中添加信息,具有读权限的进程可以从中读取信息
  5. 信号量(Semaphores) :信号量是⼀个计数器,⽤于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信⽅式主要⽤于解决与同步相关的问题并避免竞争条件。
  6. 共享内存(Shared memory) :使得多个进程可以访问同⼀块内存空间,不同进程可以及时看到对⽅进程中对共享内存中数据的更新。这种⽅式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有⽤的进程间通信⽅式。
  7. 套接字(Sockets) : 此⽅法主要⽤于在客户端和服务器之间通过⽹络进⾏通信。套接字是⽀持TCP/IP 的⽹络通信的基本操作单元,可以看做是不同主机之间的进程进⾏双向通信的端点,简单的说就是通信双⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程。

线程间的通信方式

  1. 互斥量(全局变量):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
  2. 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
  3. 临界区:是一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待,有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用。

进程间的同步方式

  1. 信号量:用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行:初始化,P操作和V操作,这三种操作都是原子操作。 P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。

  2. 管程:管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,其主要特点如下:

      局部数据变量只能被管程的过程访问,任何外部过程都不能访问。
      一个进程通过调用管程的一个过程进入管程。
      在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。
    

3、消息传递:一个进程以消息的形式给另一个指定的目标进程发送消息

线程间的同步方式

线程同步是两个或多个共享关键资源的线程的并发执⾏。应该同步线程以避免关键的资源使⽤冲突。操作系统⼀般有下⾯四种线程同步的⽅式:

  1. 互斥对象(Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。
  2. 临界区(Critical Section):通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
  3. 信号量(Semphares) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量。
  4. 事件(Event) :Wait/Notify: 用来通知线程有一些事件已发生,从而启动后继任务的开始。事件对象通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作。

虚拟内存

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换

线程的同步和互斥以及应用常见

  • 互斥:指在某一时刻指允许一个进程运行其中的程序片,具有排他性和唯一性。

对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当A进入临界区对资源操作时,B就必须等待;当A执行完,退出临界区后,B才能对临界资源进行操作。

  • 同步:指的是在互斥的基础上,实现进程之间的有序访问。

假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但他们之间存在一种制约关系,即当线程A写的时候,B不能来拿数据;B在拿数据的时候A不能往缓冲区写,也就是说,只有当A写完数据(或B取走数据),B才能来读数据(或A才能往里写数据)。这种关系就是一种线程的同步关系。

应用常见:多线程编程中,难免会遇到多个线程同时访问临界资源的问题,如果不对其加以保护,那么结果肯定是不如预期的,因此需要线程同步与互斥。

死锁

死锁是两个或多个进程无期限阻塞,相互等待的一种状态。

死锁产生的原因

系统资源不足,需要竞争资源;程序并发执行顺序不当;资源分配不当。

产生死锁的四个必要条件:

  • 互斥:资源不能被共享,只能由一个进程使用。
  • 非抢占:进程所获得的资源在未使用完毕之前,申请者不能强行从占有者手中夺取资源 ,只能等进程用完自己释放。
  • 占有并等待:进程在所占有的资源未使用完之前,又申请其它进程占用的资源
  • 循环等待:系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

如何处理死锁:

  1. 死锁预防:是一种排除死锁的静态策略,对进程申请资源的活动加以限制,使得死锁的四个必要条件不会同时具备。

     1 打破互斥:允许进程同时访问某些资源。
     2 打破非抢占:允许进程强行从占有者那里夺取资源。
     3 打破占有并等待:实行资源预分配(运行前先申请所有资源,得不到满足的话,进程暂不运行);只允许进程不占有资源时才能申请资源。
     4 打破循环等待:实行资源有序分配,排序编号,只有占有了小号资源才能申请大号资源。
    
  2. 死锁避免:动态策略,不限制进程对资源的申请,而是在申请时动态监测资源分配情况,确保循环等待条件不成立。(著名算法:银行家算法:防止系统进入不安全状态,从而避免死锁的发生。)

  3. 死锁检测(解除):允许死锁发生,当检测到死锁发生再想法从死锁中摆脱 。

    1 进程终止:终止一个或多个死锁进程打循环等待(终止所有死锁进程,或者一次只终止一个,直到取消死锁循环);
    2 资源抢占:从一个或多个死锁进程那抢占一个或多个资源。
    

进程的调度方式

1、可剥夺调度:出现更为“紧迫或重要”的进程,或者是当前进程的时间片用完;“剥夺”运行态进程对处理机的使用权,并将其变为就绪状态。
2、不可剥夺调度:一旦将处理机分配给某个进程后,只有当该进程运行完毕,或者因等待某种外部事件而不能继续运行,主动放弃处理机的情况时,系统才把处理机分配给其他进程。

进程的调度算法

1.先到先服务(FCFS)调度算法 : 从就绪队列中选择⼀个最先进⼊该队列的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
在这里插入图片描述
2.短作业优先(SJF)的调度算法 : 从就绪队列中选出⼀个估计运⾏时间最短的进程为之分配资源,使它⽴即执⾏并⼀直执⾏到完成或发⽣某事件⽽被阻塞放弃占⽤ CPU 时再重新调度。
在这里插入图片描述
3.时间⽚轮转调度算法 : ⼜称 RR(Round robin)调度。每个进程被分配⼀个时间段,称作它的时间⽚,即该进程允许运⾏的时间。在使用完一个时间片后,进程还没有完成,它必须释放出处理机给下一个就绪的进程;该进程返回到就绪队列的末尾,重新排队等待再次运行。
4.多级反馈队列调度算法 :把就绪进程按优先级排成多个队列,同队列的进程具有相同的时间片;高优先级队列的时间片比低优先级队列的小 。

	新进程进入内存后,先投入高优先级队列的末尾,按FCFS算法调度;若一个时间片未能执行完,则降低优先级,投入到低优先级队列的末尾,同样按FCFS算法调度;如此下去,降低到最后的队列,则按“时间片轮转”算法调度直到完成;
	仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。

5.优先级调度 : 为每个流程分配优先级,⾸先执⾏具有最⾼优先级的进程,依此类推。具有相同优先级的进程以 FCFS ⽅式执⾏。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。

设计算法考量标准:

  1. 响应时间:进程自进入就绪队列开始至 进程占用CPU之间的时间间隔
  2. 周转时间:进程自进入就绪队列开始至进程结束之间的时间间隔。
  3. CPU吞吐量:单位时间内运行结束的进程个数。

注:先进先出页面淘汰算法会产生belady现象(分配的页面数增多,但缺页率反而提高的现象。缺页率=缺页次数/总次数。缺页:物理页中不存在,需要进入或者置换后进入)
在这里插入图片描述

多线程

多线程就是指一个进程中同时有多个执行路径正在执行。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
一个采用了多线程技术的应用程序可以更好地利用系统资源。其主要优势在于充分利用了CPU的空闲时间片,可以用尽可能少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,同时增强了应用程序的灵活性。更为重要的是,由于同一进程的所有线程是共享同一内存,所以不需要特殊的数据传送机制,不需要建立共享存储区或共享文件,从而使得不同任务之间的协调操作与运行、数据的交互、资源的分配等问题更加易于解决。

僵尸进程、孤儿进程

  • 僵尸进程:子进程退出后,父进程未做处理,导致子进程在进程表中仍占一个位置,还保存在系统中。

     危害:过多僵尸进程会影响性能,甚至导致系统瘫痪
     解决办法:
     	(1)改写父进程:子进程退出后,发送信号给父进程,父进程调用waitpid处理;
     	(2)杀掉父进程:父进程死后,僵尸进程变为孤儿进程,会过继给1号进程init处理
    
  • 孤儿进程:父进程结束后,子进程仍在运行,这种子进程为孤儿进程,孤儿进程始终会被init进程收养,则init进程为孤儿进程的父进程

序列化和反序列化

  • 对象序列化为字节序列:传递和保存对象时,保证对象的完整性和可传递性,以便保存在本地文件中和在网络上传输。
  • 字节序列反序列化为对象:根据字节流中保存的对象状态和描述对象来进行重建。

注:二者核心作用都是对象的保护和重建

内存管理

内存管理主要是做内存的分配与回收。另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。

内存管理机制

分为连续分配管理方式和非连续分配管理方式。连续分配管理⽅式是指为⼀个⽤户程序分配⼀个连续的内存空间,常⻅的如 块式管理 。同样地,⾮连续分配管理⽅式允许⼀个程序使⽤的内存分布在离散或者说不相邻的内存中,常⻅的如⻚式管理段式管理

  1. 块式管理 : 远古时代的计算机操系统的内存管理⽅式。将内存分为⼏个固定⼤⼩的块,每个块中只包含⼀个进程。如果程序运⾏需要内存的话,操作系统就分配给它⼀块,如果程序运⾏只需要很⼩的空间的话,分配的这块内存很⼤⼀部分⼏乎被浪费了。这些在每个块中未被利⽤的空间,我们称之为碎⽚。
  2. ⻚式管理 :把主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式,⻚较小,相对相⽐于块式管理的划分⼒度更⼤,提⾼了内存利⽤率,减少了碎⽚。⻚式管理通过⻚表对应逻辑地址和物理地址。
  3. 段式管理 : ⻚式管理虽然提⾼了内存利⽤率,但是⻚式管理其中的⻚实际并⽆任何实际意义。段式管理把主存分为⼀段段的,每⼀段的空间⼜要⽐⼀⻚的空间⼩很多 。但是,最重要的是段是有实际意义的,每个段定义了⼀组逻辑信息,例如,有主程序段 MAIN、⼦程序段 X、数据段 D及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
  4. 段⻚式管理 。段⻚式管理机制结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⼲⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的。
    分页和分段管理的相同和不同:
    共同点 :
    1 分⻚机制和分段机制都是为了提⾼内存利⽤率,较少内存碎⽚。
    2 ⻚和段都是离散存储的,所以两者都是离散分配内存的⽅式。但是,每个⻚和段中的内存是连续的。
    区别 :
    1 ⻚的⼤⼩是固定的,由操作系统决定;⽽段的⼤⼩不固定,取决于我们当前运⾏的程序。
    2 分⻚仅仅是为了满⾜操作系统内存管理的需求,⽽段是逻辑信息的单位,在程序中可以现为代码段,数据段,能够更好满⾜⽤户的需要。

软连接和硬链接

**软连接:**也叫符号链接,相当于window操作系统上的快捷方式,其创建的链接文件的时间和大小都跟源文件不一样。因为软链接文件只是维持了从软链接到源文件的指向关系(即其保存的只是源文件的路径名),不是源文件的内容。
**硬链接:**相当于复制一份文件,但是增加了同步更新的功能,其创建时间和大小都与源文件一样。

在操作系统中,每个文件和目录都有一个inode结点,这个节结点是其唯一标识,当文件A和文件B使用硬链接时,表示文件A和文件B都指向了同一个inode结点,如果删除A,只是删除了A和inode的指向,并不影响B和inode的指向。若A是B的软链接,表示A和B指向两个不同的inode,但是A的数据块中只是存放的B的路径名,如果B删除了,A依然存在,只是指向的是一个无效的链接。(即如果原始文件被删除,所有指向它的软链接也都被破坏)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值