当前位置: 首页 > news >正文

计算机操作系统面试题自用

什么是操作系统:

操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件

操作系统的主要功能
 

解释一下操作系统的主要目的是什么
操作系统是一种软件,它的主要目的有三种

1 管理计算机资源,这些资源包括 CPU、内存、磁盘驱动器、打印机等。
2 提供一种图形界面,就像我们前面描述的那样,它提供了用户和计算机之间的桥梁。
3 为其他软件提供服务,操作系统与软件进行交互,以便为其分配运行所需的任何必要资源
例如Windows Linux

线程与进程的区别

线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:

1、根本区别: 进程是操作系统资源分配和独立运行的最小单位;线程是任务调度和系统执行的最小单位。
2、地址空间区别: 每个进程都有独立的地址空间,一个进程崩溃不影响其它进程;一个进程中的多个线程共享该 进程的地址空间,一个线程的非法操作会使整个进程崩溃。
3、上下文切换开销区别: 每个进程有独立的代码和数据空间,进程之间上下文切换开销较大;线程组共享代码和数据空间,线程之间切换的开销较小。
 

进程间状态模型

上下文切换


上下文切换(Context Switching)是指操作系统在多任务(多进程或多线程)环境下,将处理器从一个任务(进程或线程)切换到另一个任务的过程。上下文切换允许多个任务轮流共享处理器,以实现并发执行,但它会引入一些开销,包括寄存器和内存的保存和恢复。

cpu调用进程的调用算法 

先来先服务,进程间串行执行

2最短作业优先(Shortest Job First),我们假设运行时间已知

3 最短剩余时间优先

最短作业优先的抢占式版本被称作为 最短剩余时间优先(Shortest Remaining Time Next) 算法。使用这个算法,调度程序总是选择剩余运行时间最短的那个进程运行。当一个新作业到达时,其整个时间同当前进程的剩余时间做比较。如果新的进程比当前运行进程需要更少的时间,当前进程就被挂起,而运行新的进程。这种方式能够使短期作业获得良好的服务。

4 分时调度

5 抢占式调度
 

并发和并行有什么区别

进程与线程的切换流程讲一下

进程切换流程

  1. 保存当前进程上下文:操作系统首先保存当前运行进程的所有寄存器状态、程序计数器、堆栈指针等信息到进程控制块(Process Control Block,PCB)中。这是为了在切换回该进程时,能够恢复其执行状态。

  2. 选择下一个进程:操作系统从就绪队列中选择下一个要执行的进程,这通常涉及进程调度算法的选择,例如轮转调度或优先级调度。

  3. 加载下一个进程的上下文:操作系统从下一个进程的PCB中恢复其寄存器状态、程序计数器、堆栈指针等信息。这将把控制权从当前进程切换到下一个进程。

  4. 执行下一个进程:操作系统开始执行下一个进程,其执行状态与之前保存的状态一致。

线程切换流程

线程切换通常比进程切换更轻量级,因为线程共享相同的进程资源,切换涉及的上下文更少。

  1. 保存当前线程上下文:操作系统保存当前线程的寄存器状态、程序计数器等信息。与进程切换相比,线程切换的上下文保存较少。

  2. 选择下一个线程:操作系统从线程池或线程队列中选择下一个要执行的线程,通常根据线程调度算法,如抢占式或协作式调度。

  3. 加载下一个线程的上下文:操作系统从下一个线程的上下文中恢复寄存器状态、程序计数器等信息。这将切换执行控制权到下一个线程。

  4. 执行下一个线程:操作系统开始执行下一个线程,其执行状态与之前保存的状态一致。

总之,进程切换涉及更多的资源保存和恢复,因为进程有独立的地址空间,而线程切换较轻量,因为线程共享相同的地址空间。线程切换通常更快,但需要更小的上下文保存。无论是进程切换还是线程切换,操作系统都需要确保上下文切换是可靠的,以保证任务的连贯性和正确性。

什么是虚拟地址:

虚拟地址(Virtual Address)是计算机操作系统中的一个概念,它表示程序或进程在运行时所使用的地址,而不是实际物理内存的地址。虚拟地址空间是一个抽象的、虚拟的地址范围,它允许程序认为它拥有连续的内存地址,尽管这些地址实际上可能分布在物理内存的不同地方,或者可能还未加载到物理内存中。

  1. 地址映射:操作系统负责将虚拟地址映射到物理内存中的位置。这允许了内存的动态分配和管理。

  2. 共享内存:多个进程可以共享虚拟地址空间中的一部分内存,以便共享数据或通信

页表:

操作系统的页表是一种数据结构,用于管理虚拟内存和物理内存之间的映射关系。虚拟内存是进程或程序所使用的抽象内存空间,而物理内存是实际计算机硬件上的内存空间。页表的目的是实现虚拟地址到物理地址的映射,以便操作系统和硬件能够正确地访问内存

每个进程都有自己的页表,页表将虚拟地址空间划分为固定大小的页(Page),并将这些页映射到物理内存的页框(Page Frame)。页表的任务是跟踪每个虚拟页到其对应的物理页框的映射关系。

使用页表进行分页管理可以提高地址搜索的效率

为什么虚拟地址空间切换会比较耗时

  1. 上下文保存和恢复:在虚拟地址空间切换时,操作系统需要保存当前任务的虚拟地址空间上下文,包括寄存器状态、页面表或页表、内存映射等。然后,操作系统加载新任务的虚拟地址空间上下文。这个过程涉及将大量数据从内存保存到内核空间,然后从内核空间加载到内存,这会导致较大的开销。

  2. 页表切换:当任务切换时,页表需要被切换以反映新任务的虚拟地址空间。这可能需要大量的内核操作,包括从磁盘加载页表、清除缓存等。

fork函数介绍

  • 如果fork()返回值为正整数,表示它是父进程,返回值是新创建子进程的PID。
  • 如果fork()返回值为0,表示它是子进程,子进程从fork()调用后的位置开始执行。
  • 如果fork()返回值为-1,表示创建子进程失败,父进程应该处理错误情况。
#include <iostream>
#include <unistd.h>int main(int argc, const char * argv[]) {pid_t fpid; //fpid表示fork函数返回的值int count=0;fpid=fork();if (fpid < 0)printf("创建子进程失败了");else if (fpid == 0) {printf("当前是子进程, 进程的ID是 %d\n",getpid());count++;}else {printf("当前是父进程, 进程的ID是 %d\n",getpid());count++;}printf("统计结果是: %d\n",count);return 0;
}

什么叫父进程、子进程

在多道程序设计(Multiprogramming)中,一个程序(或进程)可以创建其他程序的副本,这些副本被称为子进程,而创建它们的程序被称为父进程。

具体来说:

  • 父进程:父进程是创建一个或多个子进程的进程。父进程通常负责控制和管理子进程,可以创建、启动、暂停、终止或等待子进程的执行。父进程和子进程之间通常可以通过进程间通信(IPC)机制来传递数据和信息。

  • 子进程:子进程是由父进程创建的进程副本。子进程通常继承了父进程的资源和环境,包括代码、数据、文件描述符、虚拟地址空间等。子进程独立执行,并可以执行不同的任务。子进程可以创建更多的子进程,形成进程树。

子进程跟父进程同用一个虚拟内存地址吗

在通常情况下,子进程会在创建时复制父进程的虚拟地址空间,但各自拥有独立的虚拟内存地址。这种机制被称为虚拟内存的写时复制(Copy-On-Write,COW)。COW机制的目的是节省内存和提高效率。

具体工作流程如下:

  1. 当子进程创建时,它会继承父进程的虚拟地址空间。这意味着子进程的虚拟地址空间的布局和内容与父进程相同。

  2. 初始阶段,子进程与父进程共享同一物理内存页。也就是说,虽然它们有各自的虚拟地址空间,但物理内存中的数据是相同的。

  3. 只有当子进程尝试修改共享的内存页中的数据时,操作系统才会执行写时复制操作。在这个时候,操作系统会为子进程分配一个独立的物理内存页,并将数据复制到新的物理页上。这样,父进程和子进程各自拥有自己的独立内存页,它们的虚拟地址指向不同的物理内存。

父进程和子进程之间通常具有某种关系,其中一个是创建另一个的过程。子进程的创建通常通过系统调用(例如fork())来完成,这个系统调用会复制父进程的执行环境和状态,然后允许子进程在独立的上下文中执行不同的任务。

使用fork(),所有进程都是操作系统的子进程吗,这个概念?

使用fork()函数,父进程会创建一个子进程,而这个子进程是通过父进程复制而来的,包括父进程的代码、数据和环境。因此,从操作系统的角度来看,这个子进程确实是操作系统的子进程。

父进程怎么销毁子进程

  1. 使用exit()函数(Unix/Linux):在Unix/Linux系统中,父进程可以使用exit()函数来终止子进程。这通常需要子进程的PID。父进程可以发送一个信号(如SIGTERM)给子进程,以触发子进程的退出。

  2. 使用kill命令(Unix/Linux):父进程可以使用kill命令来向子进程发送信号,例如kill -9 <PID>,其中<PID>是子进程的进程标识符。这将终止子进程。

进程间的通信方式有哪些

1 管道(Pipe) :特别适用于父子进程之间或在同一台计算机上的进程之间。管道通常是一种半双工通信方式,允许一个进程将数据写入管道,另一个进程从管道中读取数据。管道通常是一个先进先出(FIFO)的数据结构

2 消息队列(Message Queue):消息队列允许进程通过在队列中发送和接收消息来进行通信。这种通信方式通常用于进程之间的异步通信,允许发送者将消息发送到队列,而接收者可以在需要轮询检索消息。

使用消息队列实现进程间通信,读进程需要一直去检索拿出消息队列的数据吗?

使用消息队列实现进程间通信时,读进程通常需要轮询(polling)来检查消息队列是否有新消息,以便及时获取数据。轮询是一种常见的方法,它可以在消息到达时及时处理数据。

消息队列通常不会主动通知读进程有新消息到达,因此读进程需要定期检查消息队列。这可以通过循环来实现,示例伪代码如下:

  

while True:message = receive_message_from_queue()  # 从消息队列接收消息if message is not None:# 处理消息process_message(message)else:# 休眠一段时间,避免忙等待sleep(1)  # 可以根据需要调整轮询的时间间隔

轮询会阻塞主进程的吧,一般是开起一个线程去轮询对吗?如果是,利用什么函数可以在进程中创建一个线程?

是的,轮询会阻塞主进程的执行,因此通常在多线程环境中会使用单独的线程来执行轮询操作,以确保主线程不会被阻塞。在多线程编程中,可以使用线程来执行后台任务,例如轮询消息队列。

在Python中,可以使用threading模块来创建和管理线程。以下是一个示例,展示了如何在Python中创建一个线程执行轮询操作:

import threading
import time# 轮询函数
def poll_queue():while True:message = receive_message_from_queue()  # 从消息队列接收消息if message is not None:# 处理消息process_message(message)else:# 休眠一段时间,避免忙等待time.sleep(1)  # 可以根据需要调整轮询的时间间隔# 创建一个线程来执行轮询操作
polling_thread = threading.Thread(target=poll_queue)# 启动线程
polling_thread.start()# 主线程继续执行其他任务

3 共享内存(Shared Memory):共享内存允许多个进程访问同一块物理内存,以实现高效的数据共享。这种通信方式通常需要进程之间进行显式的同步来避免竞争条件。

需要注意的是,共享内存是一种强大的通信方式,但也需要谨慎使用,因为并发访问共享内存可能导致竞态条件和数据一致性问题。因此,在实际应用中,必须使用信号量、互斥锁等同步机制来确保安全访问共享内存。

4 套接字(Socket):套接字通信允许不同计算机上的进程之间进行网络通信

5 信号量(Semaphore):信号量是一种同步机制,它可以用于多个进程之间的协调和互斥。信号量可以用于控制对共享资源的访问。

讲讲线程的分类

  1. 单线程 vs. 多线程

    • 单线程:应用程序只包含一个执行线程,适用于简单的任务,无法利用多核处理器的优势。
    • 多线程:应用程序包含多个并发执行的线程,可以利用多核处理器来加速任务执行。
  2. 守护线程 vs. 非守护线程

    • 守护线程:守护线程是一种后台线程,它们在主线程结束时自动终止。它们通常用于执行一些不需要等待的任务,如垃圾回收。
    • 非守护线程:非守护线程在主线程结束时不会自动终止,它们会继续执行,直到完成任务或显式终止
  3. 优先级线程:线程可以分配不同的优先级,以影响其被调度的顺序。高优先级线程会更频繁地被调度,低优先级线程会被较少调度。

什么临界区,如何解决冲突

临界区是多线程编程中的一个概念,指的是一段代码或代码块,多个线程同时访问时可能导致竞态条件(Race Condition)和数据不一致性的区域。解决临界区冲突是确保多线程程序正确运行的重要任务之一。

相关文章:

计算机操作系统面试题自用

什么是操作系统&#xff1a; 操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件 操作系统的主要功能 解释一下操作系统的主要目的是什么 操作系统是一种软件&#xff0c;它的主要目的有三种 1 管理计算机资源&#xff0c;这些资源包括 C…...

redis作为消息队列的缺点

Redis作为消息队列的不足。 1、基于内存 Redis是一种基于内存的数据库产品&#xff0c;这意味着数据存储在内存中&#xff0c;当内存不足时&#xff0c;Redis会使用基于磁盘的虚拟内存来存储数据。虽然这种虚拟内存机制可以增加Redis的存储容量&#xff0c;但也会降低Redis的…...

Redis五大数据类型的底层设计

SDS 无论是 Redis 的 Key 还是 Value&#xff0c;其基础数据类型都是字符串。虽然 Redis是使用标准 C 语言开发的&#xff0c;但并没有直接使用 C 语言中传统的字符串表示&#xff0c;而是自定义了一 种字符串。这种字符串本身的结构比较简单&#xff0c;但功能却非常强大&…...

logback的简单配置详解

<?xml version"1.0" encoding"UTF-8"?> <!--logback配置的根元素。scantrue表示logback将定期扫描配置文件以检测更改。scanPeriod"30 Period" 扫描间隔为30s--> <configuration scan"true" scanPeriod"30 seco…...

TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序

概述&#xff1a;TatukGIS Developer Kernel&#xff08;DK&#xff09;是一个用于开发自定义地理信息系统&#xff08;GIS&#xff09;应用程序以及解决方案的综合性软件开发工具包&#xff08;SDK&#xff09;。本篇文章主要介绍用DK11为FMX创建一个应用程序&#xff0c;现在…...

Ant Design Vue设置表格滚动 宽度自适应 不换行

Ant Design Vue设置表格滚动 宽度自适应 不换行 添加以下属性即可解决这个问题&#xff1a; <a-table :columns"columns" :data-source"list":pagination"false"bordered:scroll"{ x: max-content }" >...

在Linux上开启文件服务,需要安装并配置Samba

在Linux上开启文件服务&#xff0c;需要安装并配置Samba。以下是具体步骤&#xff1a; 安装Samba软件包&#xff1a;在终端中输入以下命令进行安装&#xff1a; 复制代码 sudo apt-get update && sudo apt-get install samba 配置Samba&#xff1a;编辑Samba配置文件…...

TypeScript 类型兼容性

TypeScript 类型兼容性 在前端开发中&#xff0c;使用 TypeScript 可以提供更强大的类型检查和类型安全。然而&#xff0c;了解 TypeScript 中的类型兼容性是至关重要的&#xff0c;因为它涉及如何处理不同类型之间的关系&#xff0c;以及在这些类型之间进行无缝的交互。本文将…...

【多线程】线程的状态

我们可以通过下面的这段代码来查看线程一共有哪几种状态 //线程的状态是一个枚举类型 Thread.State for(Thread.State state : Thread.State.values()){System.out.println(state); }NEW&#xff08;新建状态&#xff09;&#xff1a; 当线程对象已经被创建&#xff0c;但是 s…...

pytorch 对图片进行归一化处理

如题&#xff0c;神经网络通常使用浮点数张量作为输入&#xff0c;我们要做的第一件事情就是将图片转化为浮点数&#xff0c;并且做归一化操作。 import torch import imageio import osdata_dirF:\\work\\deep_learning\\pytorch\\dlwpt-code-master\\data\\p1ch4\\image-cat…...

零售数据分析师熬夜整理:人、货、场、供、财这样做

在零售数据分析中&#xff0c;人、货、场、供、财数据分析非常重要&#xff0c;它们分别是指人员、商品、场所、供应和财务&#xff0c;对这些要素进行数据分析&#xff0c;可以更好地了解市场需求、优化商品供应链、调整销售策略和提高盈利能力。零售数据量大、分析指标多且复…...

基于SSM的学生选课管理系统

基于SSM的高校校园学生选课系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 专业管理 教师管理 课程管理 成绩管理 摘要 基于SSM的学生选课管…...

SQL注入漏洞

0x01 漏洞介绍 泛微e-office系统是标准、易用、快速部署上线的专业协同OA软件&#xff0c;国内协同OA办公领域领导品牌&#xff0c;致力于为企业用户提供专业OA办公系统、移动OA应用等协同OA整体解决方案。泛微e-office深谙改革之道以迎变革之机&#xff0c;沉心产品研发数十载…...

C++ wpf自制软件打包安装更新源码实例

程序示例精选 C wpf自制软件打包安装更新源码实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《C wpf自制软件打包安装更新源码实例》编写代码&#xff0c;代码整洁&#xff0c;规则&…...

8月19日PMP成绩,预计10月16日公布!附查询入口、流程

PMP的考试成绩一般在考后6-8周即可查询&#xff0c;8月PMP的成绩预计会在北京时间10月16日晚上公布&#xff0c;具体时间以官方公告为准。 如何查询8月考试成绩&#xff1f; 渠道一&#xff1a;收到PMI邮件提醒 当你注册PMI所使用的邮箱收到一封PMI发来的&#xff0c;标题为…...

简易LDO设计(包含原理图、PCB和实验)

一、前置知识 ①该电路是通过三极管&#xff08;BJT&#xff09;来实现的&#xff0c;所以需要知晓三极管的工作原理和特性。 ②三极管有三种状态&#xff1a;放大、饱和、截止。本文是利用三极管的放大状态来模拟LDO芯片的功能。 二、原理图 ①稳压二极管要想稳定到某个电压范…...

SpringBoot面试题5:SpringBoot Starter的工作原理是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot Starter的工作原理是什么? Spring Boot Starter 是一种便捷的方式来为 Spring Boot 应用程序引入一组特定功能的依赖项。它简化了项目…...

Leetcode 2902. Count of Sub-Multisets With Bounded Sum

Leetcode 2902. Count of Sub-Multisets With Bounded Sum 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;2902. Count of Sub-Multisets With Bounded Sum 1. 解题思路 这一题有点惭愧&#xff0c;因为没有搞定&#xff0c;遇上了超时问题…… 我的思路其实还是…...

ARP协议(地址解析协议) 的作用和操作过程

目录 1.问题: &#xff08;在同一个LAN局域网内&#xff09;如何在已知目的接口的IP地址前提下确定其MAC地址&#xff1f;2.问题&#xff1a;现在假设主机A要向目的主机B发送一个数据报&#xff0c;怎么发送呢&#xff1f;2.1在一个局域网内时2.1.1情况一&#xff1a;2.1.2情况…...

轻游戏风格虚拟资源付费下载模板Discuz论坛模板

轻游戏风格虚拟资源付费下载模板Discuz论坛模板&#xff0c;游戏资讯付费VIP源码模板。 模板说明&#xff1a; 1、模板名称&#xff1a;"qing游戏风格"&#xff0c;版本支持&#xff1a;discuzx3.0版本&#xff0c;discuzx3.1版本&#xff0c;discuzx3.2版本&#…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...