操作系统面试真题总结(四)

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

进程的地址空间里面有什么?

进程的地址空间是指操作系统为每个进程分配的虚拟内存空间,用于存储进程的代码、数据和堆栈等信息。

进程的地址空间通常分为以下几个部分:

代码段(Text Segment):

  • 也称为程序段,用于存放进程的可执行代码。
    • 该部分通常是只读的,包含了程序的指令集,如函数、循环、条件语句等。

数据段(Data Segment):

  • 用于存储全局变量、静态变量和常量等数据。
    • 数据段可以分为:
      • 初始化的数据段(Initialized Data Segment
      • 初始化的数据段(Uninitialized Data Segment)。
  • 初始化的数据段包含了已经初始化的全局变量和静态变量等数据,存储在静态存储区,通常是可读写的。
  • 未初始化的数据段,也称为BSS段(Block Started by Symbol
    • 包含了未初始化的全局变量和静态变量等数据,存储在静态存储区,通常是可读写但初始值为0。

堆(Heap):

  • 堆是动态分配的内存空间,用于存储动态分配的数据。
    • 堆空间通常由程序员通过动态内存分配函数(如malloc()、new)进行管理
      • 用于存储动态数组、链表等动态数据结构。
      • 堆的大小和生命周期由程序员显式控制,需要在不再使用时手动释放。

栈(Stack):

  • 栈用于存储函数调用时相关的信息,如局部变量、函数参数、返回地址等。
    • 栈的生命周期与函数的调用和返回有关,每当调用一个函数时
      • 在栈上会创建一个新的栈帧用于保存函数的信息,当函数返回时,栈帧会被销毁。

进程间的通信方式有哪些?各自有哪些优缺点?

进程间通信(Inter Process Communication,IPC)是一个进程与另一个进程传输和分享数据的机制。

主要有以下几种方式:

管道(Pipe):

  • 管道是最早的进程间通信机制,数据可以在父子或兄弟进程间单向流动。
    • 管道的优点是简单易用,但缺点是数据只能在有亲缘关系的进程之间传输
      • 并且是无格式的字节流,需要进程自行解析。

消息队列(Message Queue):

  • 消息队列是一种先进先出的队列结构,允许进程将消息发送到队列,并允许其他进程根据消息的优先级从队列中读取。
    • 优点是可以在无关进程间传输数据,支持数据的优先级设定。
    • 缺点是数据读写需要系统调用,消耗相对较高,复杂消息可能需要额外处理逻辑。

共享内存(Shared Memory):

  • 共享内存允许多个进程访问同一块内存空间,是最快的IPC方式。
    • 优点是无需系统调用,直接读写内存,效率较高。
    • 缺点是需要手动解决进程间的同步问题,开发难度相对较高。

信号(Signal):

  • 信号是一种简单的进程间通信方式,用来通知接收进程有某事件发生。
    • 它的优点是简单,可以异步地通知事件。
    • 缺点是信息量有限,只能传递一个数量,不能携带更复杂的信息。

套接字(Socket):

  • 套接字可以在不同机器上的进程间通信。
  • 它的优点是可以进行跨机器的通信,通用性强。
  • 缺点是开发相对复杂,数据读写需要系统调用,效率较低。

信号量(Semaphore):

  • 信号量常用于多个进程间的同步和互斥问题。

一个进程可以创建多少线程?

在理论上,一个进程可以创建的线程数目由其系统资源限制,比如内存、CPU等。

实际上,当一个进程创建大量线程时,由于每个线程都都需要一定的系统资源(例如,存储线程的上下文消息、栈空间等)

  • 所以当系统资源耗尽时,无法再创建新的线程。

从操作系统的角度讲,没有硬性的规定一个进程最多可以创建多少个线程

  • 具体的数量取决于操作系统的实现和配置。

具体来说,可用线程数量的限制因素包括:

系统资源:

  • 每个线程都需要一定的系统资源,如内存空间、栈空间、寄存器等。
    • 可用的线程数量受到可用的物理内存和虚拟内存的限制。

32位和64位系统的限制:

  • 在32位系统中,每个进程的地址空间通常被限制在2GB或3GB,其中一部分用于存储进程本身和操作系统的代码和数据。
    • 因此,可用的线程数量也会受到地址空间的限制。
    • 而在64位系统中,可用的地址空间更大,可以支持更多的线程。

线程栈大小:

  • 每个线程在运行时都需要一定大小的栈空间,用于存储局部变量、函数调用和其他运行时数据。
    • 线程栈的大小是有限的,栈空间越大,可用的线程数量就越少。

系统设定的限制:

  • 操作系统可能针对特定的应用程序或系统需求设置了线程数量的上限。
    • 这些限制可能是硬性的,也可能是可以配置或调整的。

因此,实际上一个进程可以创建的线程数量是受限制的,需要考虑到系统的资源和限制因素。

在开发应用程序时,应根据具体需求和系统资源状况合理配置和管理线程的数量。

进程的调度算法有哪些?

调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

常用的调度算法有如下几个

先来先服务(FCFS,First-Come, First-Served):

  • 按照进程到达的先后顺序进行调度,先到达的进程先执行,适用于短作业时间的场景。
    • 但长作业时间的进程可能会导致等待时间较长,又称为非抢占调度算法。

最短作业优先(SJF,Shortest Job First):

  • 根据进程的执行时间,选择剩余时间最短的进程优先执行。
    • 这种算法可以减少平均等待时间,但需要准确估计每个进程的执行时间,且不适用于长作业时间的进程。

优先级调度(Priority Scheduling):

  • 为每个进程分配优先级,优先级高的进程先执行。
    • 可以根据进程的优先级动态调整调度顺序,但可能会导致低优先级的进程饥饿。

轮转调度(Round Robin):

  • 将CPU时间切片分配给每个进程,按照轮转的方式进行调度。
    • 每个进程在一个时间片内执行,如果时间片用完,则将进程放到队列尾部继续等待,适用于多任务并发执行。

多级反馈队列调度(Multilevel Feedback Queue):

  • 将进程根据优先级划分为多个队列,每个队列具有不同的时间片大小。
    • 进程根据到达时间和优先级进入对应的队列,并按照轮转调度算法执行。
    • 可根据进程的行为和执行情况调整优先级和时间片大小。

最短剩余时间优先(SRTF,Shortest Remaining Time First):

  • 类似于SJF算法,但考虑到新进程的到达时间,如果有更短剩余执行时间的进程到达,则抢占当前进程。

这些调度算法都有各自的特点和适用场景,根据不同的需求和系统环境

  • 选择适合的调度算法可以提高系统的性能和响应性。

进程终止的方式

进程终止的方式有以下几种:

正常终止:

  • 进程完成任务后,调用exit()系统调用或者main函数执行完毕,进程会自动终止。

异常终止:

  • 进程遇到致命错误,例如除零错误、内存访问错误等,操作系统会强制终止进程。

人工终止:

  • 用户通过操作系统提供的终止命令(如kill命令)来终止进程。

父进程终止:

  • 父进程终止时,所有子进程会收到一个SIGCHLD信号,子进程会被操作系统终止。

系统关机:

  • 当系统关闭时,操作系统会终止所有运行的进程。

需要注意的是,进程的终止并不是立即发生的,而是通过信号通知进程终止

  • 进程在收到终止信号后会进行相应的处理,最终终止自己。

什么是线程?

在操作系统中,线程是进程的一部分,是进程内的一个执行单元。

  • 与进程相比,线程更轻量级,多个线程可以在同一个进程中并发执行。

线程共享进程的内存空间和系统资源,每个线程有独立的程序计数器(PC)和栈空间

  • 但它们可以访问共享的数据和全局变量。

线程的主要特征包括:

  • 并发执行:
    • 多个线程可以在不同的处理器或核心上同时执行,从而实现并发性。
  • 共享内存:
    • 线程之间共享同一个进程的地址空间,可以互相访问和修改共享数据。
  • 轻量级:
    • 相对于进程来说,线程的创建、销毁和切换开销较小,执行效率更高。
  • 协作与通信:
    • 线程之间可以通过共享内存进行通信和协作,也可以使用同步机制控制线程的执行顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值