【面经】操作系统

目录

1、计算机的五大单元

2、什么是操作系统

3、※※※程序、进程、线程;并发、并行

程序:

进程:

进程的特点:

进程的生命周期:

进程间通信(Inter-Process Communication,IPC)

进程管理

线程:

线程状态:

调度算法:

多线程的应用:

进程和线程有什么区别:

并发

并行

并发和并行的区别:

高并发系统

4、进程是由什么组成的?

6、虚拟内存

7、操作系统内存管理

8、页面置换算法

9、页表是什么?

10、上下文环境是什么?

11、进程间通信方式

12、僵尸进程和孤儿进程

Linux常见的指令


1、计算机的五大单元
  • 电脑的五大单元包括:输入单元、输出单元、控制单元、算数逻辑单元、存储单元五大部分。其中CPU占有控制、算术逻辑单元,存储单元又包含内存与辅助内存;
2、什么是操作系统

操作系统:负责管理协调我们计算机硬件与软件资源工作的一种系统软件计算机安装操作系统,主要就是为了帮助我们屏蔽硬件层的复杂性,给上层的应用软件或用户提供易用的服务。

  • 操作系统=操作系统内核+一堆应用。
  • 操作系统内核:也是代码程序,代码的作用就是(进程管理,内存管理,文件管理,驱动管理等等)。
  •  一堆应用:依附在操作系统用内核上完成某些功能,例如:QQ,微信,飞书等等

3、※※※程序、进程、线程;并发、并行

总结:

  1. 程序(Program):程序是指计算机能够执行的一系列指令的集合,是存储在计算机存储设备上的可执行文件。
  2. 进程(Process):进程是指在操作系统中运行的程序的实例。每个进程都有自己的地址空间和资源,如内存、文件句柄等。不同进程之间是独立的,彼此不共享资源。
  3. 线程(Thread):线程是进程中的一个执行单元,一个进程可以包含多个线程。线程在同一个进程内共享相同的地址空间和资源,并能够同时执行不同的任务。
  4. 并发(Concurrency):并发是指在同一时间段内,多个任务在同一个处理器上交替执行。多个任务之间可能按照时间片轮转的方式共享处理器时间。
  5. 并行(Parallelism):并行是指在同一时间点上,多个任务同时在多个处理器上执行。每个处理器执行不同的任务,能够同时处理多个任务。
  6. 高并发(High Concurrency):高并发是指系统能够同时处理大量的并发请求。通常涉及到对请求的快速响应和处理,需要有效地利用多线程、缓存机制、负载均衡等技术来实现。
程序:

是一组按照特定顺序排列的指令,用来执行特定的任务或解决特定的问题

进程:

是指在计算机系统中运行的一个程序的实例。每个进程都拥有自己独立的内存空间,包括代码、数据和栈等。进程之间相互独立,彼此不能直接干涉对方的内部信息,但可以通过操作系统提供的机制进行通信和协同工作。每个进程都有自己的状态,包括运行、就绪、阻塞等,操作系统会根据这些状态进行进程的调度和管理。一句话来说,进程是计算机上运行中的程序的实例,它们可以独立地进行运行、管理和通信

进程的特点:
  1. 独立性:每个进程都是独立的执行实体,具有独立的内存空间和资源。
  2. 并发性:多个进程可以并发执行,共享系统资源。
  3. 动态性:进程的创建、终止和切换是动态的,可以根据需要动态调度。
进程的生命周期:
  • 新建状态(New):操作系统为进程分配必要的资源,并将其放入就绪队列。
  • 就绪状态(Ready):进程已经准备好运行,等待系统分配CPU资源。
  • 运行状态(Running):进程占用CPU资源执行任务。
  • 阻塞状态(Blocked):由于等待外部事件(如I/O操作)的完成,进程暂时停止,释放CPU资源。
  • 完成状态(Terminated):进程完成或被终止,释放所有资源。
进程间通信(Inter-Process Communication,IPC)

是指不同进程之间进行数据交换和信息传递的机制。进程间通信通常涉及到不同进程之间共享数据、协调操作和同步执行等问题。常见的进程间通信的方式包括:

  • 管道(Pipe):管道是一种半双工的通信方式,通常用于具有亲缘关系的父子进程之间进行通信。
  • 消息队列(Message Queue):消息队列是一种通过消息传递进行通信的方式,允许不同进程之间通过将消息发送到队列中来进行通信。
  • 共享内存(Shared Memory):多个进程可以通过共享内存进行通信,实现数据的共享访问,是一种高效的通信方式。
  • 信号量(Semaphores):信号量用于控制对共享资源的访问,可以用于进程间的同步和互斥操作。
  • 套接字(Socket):套接字是一种通用的通信机制,常用于不同主机之间的进程通信,也可以用于同一主机上不同进程之间的通信。
进程管理

是指操作系统对进程进行创建、调度、同步、通信、销毁等管理工作。

  • 进程创建:当用户请求启动一个程序时,操作系统会为该程序创建一个新的进程。操作系统会为新进程分配资源,包括内存空间、文件描述符等。
  • 进程调度:操作系统决定哪些进程应该在某个时间段内运行,以及每个进程运行的时间。这是通过调度算法来实现的,例如先来先服务(FCFS)、最短作业优先(SJF)、优先级调度等。
  • 进程同步:操作系统需要确保多个进程之间能够协同工作,而不会出现竞态条件(race condition)或者死锁。因此,使用同步机制如信号量、互斥锁等来协调进程之间的操作是非常重要的。
  • 进程通信:不同进程之间可能需要进行数据共享,这就需要进程间通信(IPC)机制。在操作系统中,可以通过管道、消息队列、共享内存、套接字等方式实现进程间通信。
  • 进程销毁:当一个进程完成了它的任务,或者出现了错误时,操作系统会将其销毁,并释放相关资源,通常是通过调用exit系统调用来实现的。
线程:

 线程(Thread)是指在一个进程中执行的一个单一线性流程。一个进程可以包含多个线程,这些线程可以并发执行,同时共享进程的资源,如内存空间、文件描述符等。每个线程都有自己的程序计数器、堆栈和局部变量,但它们共享全局变量和静态变量。

线程是操作系统(或者在用户空间的线程库)所管理的最小执行单元,它能独立运行、调度和管理资源。在多线程系统中,多个线程可以同时运行,从而实现并发执行,提高系统的效率和利用率。同时,由于线程可以共享相同的内存空间,因此线程间的通信和同步较为方便

线程状态:

新建、就绪、运行、阻塞、等待、计时等待、终止

线程调度:

  • 抢占式调度:操作系统可以在任意时刻暂停正在运行的线程,并开始运行另一个线程。这种调度方式可以实现多个线程之间的公平分配CPU资源。
  • 协作式调度:线程会自己主动释放CPU,让其他线程有机会执行。这种调度方式需要线程主动让出CPU,否则可能导致某个线程长时间占用CPU,其他线程无法执行。
调度算法:

主要包括时间片轮转、优先级调度、多级反馈队列等。这些算法可以根据线程的优先级、等待时间、历史执行时间等因素来决定下一步执行的线程。

多线程的应用:

Web 服务器、图像处理、游戏开发、数据库操作、多媒体应用、并行计算等等。

进程和线程有什么区别:

举个简单例子,我们电脑打开QQ、打开Word,其实就是开了不同的几个进程;而我用 QQ 时,可以一边发消息、一边视频聊天,这就是在进程下开了多个线程处理任务。

区别:

①调度方面:进程可以理解是资源分配的基本单位,而线程则是(CPU调度)任务调度和执行的基本单位。"

内存方面:进程拥有独立的地址空间与资源,同个进程下的线程共享进程的地址空间与资源。

开销方面:线程间切换开销小,进程间切换开销大。线程切换不需要更换页表,而进程切换需要。页表切换就会导致缓存失效,性能就会变低。线程共享进程资源,拥有独立的栈与程序计数器。进程切换要切换上下文环境,创建的时候需要分配系统资源,销毁时要释放系统资源。

其他区别:比如通信、切换、健壮性等方面。一个进程崩溃,不会对其他进程产生影响;一个线程崩溃,会让同一进程内的其他线程也死掉

并发

并发指的是一个系统能够同时处理多个任务。

在一个单处理器系统中,多个任务交替执行,因为处理器实际上在一段时间内只能执行一个任务。这种情况下,因为多个任务交替执行的效果,看起来好像同时在运行

在一个多处理器系统中,多个任务可以真正同时执行,但是在并发系统中,即使没有多个处理器也能实现同时执行的效果

并行

并行是指系统同时执行多个任务,每个任务都在不同的处理器核心上执行,因此它们真正同时进行。在一个拥有多核心处理器的系统中,可以实现真正的并行执行,每个核心处理器同时处理不同的任务。

并发和并行的区别:

发强调的是在单位时间内有多个任务同时进行,但是这些任务可能是交替执行的。而并行强调的是在同一时刻有多个任务同时进行。

高并发系统

大量用户同时访问和请求处理能力的系统

高并发系统通常包括了多线程、并行处理、集群部署等技术手段。

实现高并发系统的技术和策略:

  1. 多线程和并行处理:利用多核处理器和多线程技术,同时处理多个请求,提高系统的并发处理能力。
  2. 负载均衡:通过将请求分发到多台服务器来实现负载均衡,确保各个服务器的负载相对均衡,从而提高整体系统的处理能力。
  3. 缓存技术:利用缓存技术减少对数据库等后端资源的访问,提高数据响应速度,降低系统负载。
  4. 分布式架构:采用分布式架构部署系统,将系统拆分成多个服务、模块,以提高整体系统的并发处理能力。
  5. 异步处理:采用异步处理技术,将请求排队并异步处理,降低请求响应时间,提高系统吞吐量。
  6. 数据库优化:对数据库进行优化,提高数据库的读写性能,缓解数据库压力。
4、进程是由什么组成的?

进程总的说来包括程序段、数据段、PCB三部分

  1. 程序段就是程序的代码
  2. 数据段就是程序运行时产生的数据(比如全局变量、局部变量等)。
  3. PCB 中包含操作系统对其进行管理的各种信息(如进程标识符 PID,进程当前状态,进程优先级)。process ctrl block(进程控制块)。

5、进程状态有哪些?

就绪/运行/阻塞

  • 就绪:进程已经具备运行条件,但是CPU还没有分配过来;理解为进程已经将运行前的准备工作全部做好了,就等着操作系统调用,占用CPU了,只要操作系统一调用就会变成运行状态。
  • 运行:进程占用CPU,并在CPU上运行;理解为进程正在使用cpu来执行自己的代码
  • 阻塞:进程因等待某件事发生而暂时不能运行;例如:等待IO输入(例如一个函数中写了scanf那么在它就需要用户给他输入参数才能继续往下走),调用某些阻塞接口。
6、虚拟内存

虚拟地址空间是操作系统为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏而引入的。虚拟地址空间是操作系统为一个进程描述的虚拟的、连续的、完整的、线性的地址空间,在linux下是一个mm_struct结构体。好处是保证每个进程在各自虚拟地址空间运行,互相不能干扰对方,采用虚拟地址空间,通过页表映射,可以实现进程中的数据在物理内存上的离散式存储,减少了内存碎片,提高了内存的利用率。

虚拟内存使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),使得进程逻辑上有很大的连续内存地址空间

实际上一部分对应物理内存上的块,还有一部分没加载进内存的对应在外部磁盘,在需要时进行数据交换。这样就可以让程序拥有超过系统物理内存大小可用内存空间

7、操作系统内存管理

内存管理:我们都知道内存是计算中重要的组成之一,内存是与CPU进行沟通的桥梁,用于暂存CPU中的运算数据、以及与硬盘等外部存储器交换的数据

虚拟内存:

早期,程序是直接运行在物理内存上的,直接操作物理内存,但是会存在一些问题,比如使用效率低、地址空间不隔离等问题,所以就出现了虚拟内存,虚拟内存就是在程序和物理内存之间引入了一个中间层,这个中间层就是虚拟内存,这样就达到了对进程地址和物理地址的隔离

在linux系统中,将虚拟内存划分为用户空间和内核空间,用户进程只能访问用户空间的虚拟地址,只有通过系统调用、外设中断或异常才能访问内核空间,我们主要来看一下用户空间,用户空间被分为5个不同内存区域:

操作系统内存管理的方式:

它有很多的管理方式,比如块式管理、页式管理、段式、段页式管理。"

简单来说,块式就是讲内存分成一个个块,每个块包含一个进程。同理,段式就是将内存分多个段,按段存储......。

8、页面置换算法

先进先出页面置换算法最近最久未使用页面置换算法时钟(CLOCK)置换算法等等

9、页表是什么?

可以理解成一个映射,存储页面与页框对于关系,通过页表对应逻辑地址与物理地址。

10、上下文环境是什么?

cpu在拿数据的时候并不是直接从内存中拿数据。而是从身边的寄存器中拿数据,这时因为cpu对寄存器的读取速度最快。上下文信息是保存的当前程序在运行时寄存器当中的内容,因为寄存器不是进程所拥有的,当他被切换出去时,运行其他进程时当前寄存器当中的内容有可能就改变了。而上下文信息保存当前寄存器当中的内容之后可以在下次运行时快速的找到上一次运行结束时寄存器当中保存的内容。

11、进程间通信方式

操作系统根据不同的场景提供了不同的方式,管道,共享内存,消息队列和信号量。

  • 管道是内核中的一块缓冲区,分为匿名管道和命名管道。匿名管道只能用于具有亲缘关系的进程间;而命名管道可用于同一主机上任意进程间通信。
  • 共享内存的本质是一块物理内存,多个进程将同一块物理内存映射到自己的虚拟地址空间中,再通过页表映射到物理地址达到进程间通信,它是最快的进程间通信方式,相较其他通信方式少了两步数据拷贝操作。
  • 消息队列是内核中的一个优先级队列,多个进程通过访问同一个队列,在队列当中添加或者获取节点来实现进程间通信。
  • 信号量的本质是内核中的一个计数器,主要实现进程间的同步与互斥,对资源进行计数,有两种操作,分别是在访问资源之前进行的p操作,还有产生资源之后的v操作。
12、僵尸进程和孤儿进程

僵尸进程:子进程先于父进程退出,但是父进程没有进行进程等待,导致无法获取子进程的退出状态信息,使操作系统无法释放子进程的资源,这时候的子进程就是僵尸进程
孤儿进程:父进程先于子进程退出,则子进程称为孤儿进程,此时孤儿进程的父进程成为了1号进程,并且这个孤儿进程运行在后台,并不占据前台终端
如何处理僵尸进程:kill -9命令。子进程退出时向父进程发送SIGCHLD信号,父进程处理SIGCHLD信号,在信号处理函数中调用wait进行处理僵尸进程

13、多线程、多进程、并行、并发

14、操作系统是怎么调度的?跟逻辑有什么区别?

15、多线程、中断、回调函数,使用起来的原理有什么区别?

16、CPU内存管理
CPU和内存的工作关系:

当我们执行一个程序时,首先由输入设备向CPU发出操作指令,CPU接收到操作指令后,硬盘中对应的程序就会被直接加载到内存中,此后,CPU 再对内存进行寻址操作,将加载到内存中的指令翻译出来,而后发送操作信号给操作控制器,实现程序的运行或数据的处理。存在于内存中的目的就是为了CPU能够过总线进行寻址,取指令、译码、执行取数据,内存与寄存器交互,然后CPU运算,再输出数据至内存。

计算机中最小的存储单元为字节,理论上任意地址都可以通过总线进行访问,每次寻址能传输的数据大小就跟CPU位数有关。常见的CPU位数有8位,16位,32位,64位。位数越高,单次操作执行的数据量越大,性能也就越强。os的位数一般与CPU的位数相匹配,32位CPU可以寻址4GB内存空间,也可以运行32位的os,同样道理,64位的CPU可以运行32位的os,也可以运行64位的os。

何为内存对齐?

现代计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则在空间上排列,而不是按照顺序一个接一个的排放,这种就称为内存对齐,内存对齐是指首地址对齐,而不是说每个变量大小对齐

为何要内存对齐?

1. 硬件要求

处理器访问效率:许多处理器在访问内存时,要求数据地址是对齐的。例如,一个处理器可能要求访问4字节整数的地址必须是4的倍数。如果地址没有对齐,处理器可能需要进行额外的操作来读取数据,这增加了处理时间,降低了性能。

减少硬件异常:某些硬件架构在访问未对齐的内存时可能会产生异常或错误。通过确保内存对齐,可以避免这种硬件级别的错误。

2. 提高访问速度

减少CPU寻址时间:CPU每次寻址都需要消耗时间。当数据对齐时,CPU可以更快地找到所需的数据,因为它不需要在内存中跳跃式地查找。

优化缓存利用:内存对齐有助于数据在缓存中的连续存储,这可以减少缓存未命中的次数,从而提高缓存利用率和性能。

减少内存访问次数:当数据未对齐时,处理器可能需要执行两次或更多次内存访问来获取完整的数据。而数据对齐可以确保一次内存访问就能获取所需的数据。

3. 优化存储空间

减少内存碎片:内存对齐可以减少内存碎片的产生,使得内存空间得到更有效的利用。

紧凑的结构体大小:在定义结构体或对象时,字段的内存对齐可以确保整个结构体的大小更加紧凑,避免不必要的填充字节,从而节省内存空间。

4. 平台兼容性

确保代码可移植性:不同的硬件平台对内存访问有不同的要求。通过确保数据对齐,可以编写出在各种平台上都能正常运行的代码,提高了代码的可移植性和兼容性。

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值