操作系统八股文

一.进程和线程的区别

1.本质区别和所属关系是什么?

进程是资源调度以及分配的基本单位。

线程是CPU调度的基本单位。

一个线程属于一个进程,一个进程可以拥有多个线程。

2.地址空间和内存

进程拥有独立的虚拟地址空间。

线程没有独立的地址空间;线程有栈,程序计数器(PC),本地存储(LS) 等少量独立空间。

系统会为每个进程分配不同的内存空间

系统不会为线程分配内存,线程所使用的资源来自所属的进程资源。

3.并发性和健壮性

进程的并发性较低。

线程的并发性较高。

对于单个CPU,系统会把CPU运行时间划分为多个时间段,再将时间段分配给各个线程执行。

在切换效率上,进程切换效率低,线程切换效率高,都会涉及到上下文的切换。

一个进程崩溃不会影响其他进程。

一个线程崩溃可能会导致整个进程崩溃 。

进程隔离性更强一些。

 二.操作系统中进程和线程的切换过程

1.进程由哪几个部分构成?

task_struct

进程的地址空间  =  代码段___数据段___栈区____堆区

 2.上下文由哪几个部分组成?

用户级上下文

系统级上下文 = __进程标识符信息__进程现场信息__进程控制信息__系统内核栈

寄存器上下文(硬件上下文) = __CPU各寄存器的内容___进程的现场信息

 3.何时发生切换?

主动   =  系统调用,产生软中断。

被动   =  时间中断

靠中断来完成切换

4.现场信息存储在哪里?

程序计数器(PC),寄存器,堆栈,进程/线程控制块(PCB)

 5.进程/线程切换过程

保存当前进程的硬件上下文,修改当前进程的PCB,状态由运行态变为就绪态或者阻塞态,加入相关队列,调度另外一个进程,修改被调度进程的PCB,状态变为运行态,把当前进程的存储管理数据改为被调度进程的存储管理信息(页表,cache,TLB)__(这一小段线程没有__线程不具备虚拟地址空间__共享进程的虚拟地址空间),恢复被调度进程的硬件上下文,让PC指向新的进程代码。

 三.系统调用的整个流程

1.系统调用是什么?干嘛的?

系统调用是内核给用户程序提供的编程接口,内核具有最高的权限,可以直接访问所有资源,用户只能访问受限制的资源,不能直接访问内存,网络,磁盘等硬件资源。

 大致的流程 = 应用程序--->函数库---->系统调用--->内核

靠中断使程序从用户态切换到内核态或者从内核态切换到用户态 

2.系统调用是否引起进程或者线程切换? 

不会必然切换:很多系统调用(如getpid()gettimeofday()等)只是简单地获取信息,执行很快,不会导致进程或线程切换。

可能导致切换:如果系统调用涉及阻塞操作(如read()write()accept()sleep()等),当前进程或线程因为等待I/O或资源而被阻塞,操作系统会把它挂起,调度其他进程或线程运行,这时就会发生切换。

主动让出CPU:有些系统调用(如sched_yield()sleep())会主动让出CPU,也会导致切换。

 3.系统调用引起中断上下文切换

系统调用一定会引起用户态到内核态的中断上下文切换,但是否会引起进程或线程的切换,要看系统调用是否导致阻塞或主动让出CPU。

4.系统调用的流程 

用户态发起系统调用
应用程序通过调用库函数(如C语言的read()write()等)发起系统调用请求。

陷入内核态
库函数内部会使用特定的指令(如x86上的syscallint 0x80)触发软中断或陷入,CPU从用户态切换到内核态。

保存现场
CPU会保存当前用户态的寄存器等现场信息,确保系统调用返回后能恢复原来的执行状态。

内核处理系统调用
操作系统根据系统调用号找到对应的内核服务例程,执行相应的内核代码,完成所需的操作(如文件读写、进程管理等)。

返回用户态
系统调用执行完毕后,内核将结果返回给用户程序,并通过特定的指令(如sysret)切换回用户态,恢复之前保存的现场。

用户程序继续执行
用户程序获得系统调用的返回值,继续后续的执行。

四.后台进程有什么特点? 

1.前台进程是什么?有什么用?

运行在前台的进程,终端是该进程的控制终端,终端关闭(SIGHUP),进程退出。

可接受终端输入,并可以在终端输出。

 2.后台进程是什么?有什么用?

运行在后台的进程,若在终端运行,终端关闭,进程可能退出。

不可以接受终端输入,可以在终端输出。

3.前后台程序切换 

Ctrl + Z:可以将当前前台运行的程序挂起,转为后台暂停状态。

fg:用于将后台的程序切换回前台继续运行。

bg:让已经挂起的后台程序在后台继续运行。

&:在命令末尾加上&,可以让程序直接在后台运行。

nohup:用于忽略SIGHUP信号,通常配合&一起使用,保证程序在终端关闭后依然运行。

Ctrl + D:用于断开当前终端的session,相当于退出登录。

 4.守护进程

 后台进程的延申,脱离终端的后台进程。

5.如何成为守护进程?

fork子进程令父进程退出,让子进程被init进程接管,成为孤儿进程。

setsid()建立新的进程会话,使守护进程成为会话首进程,从而脱离与终端的关联。

打开/dev/null,把0,1,2重新定向到/dev/null。

五.进程间通信有哪几种方式

1.管道

单根管道是半双工的,通常用于父子进程之间,通过pipe文件速度慢,容量有限。

2.FIFO (有名/命名管道)

FIFO(First In First Out)有名管道是一种用于进程间通信(IPC)的机制。与匿名管道不同,有名管道有一个路径名,存在于文件系统中,通常通过mkfifo命令或mkfifo()系统调用创建。

3.消息队列 

消息的连接表存储在内核当中,独立于进程,容量有限。

消息队列的流程主要包括通过msgget创建队列,使用msgsnd发送消息,msgrcv接收消息,最后用msgctl管理或删除队列。 

4.共享内存 

多个进程共享的一块存储区,最快的一种IPC方式,需要和信号量配合使用。

共享内存的接口使用流程主要包括通过shmget创建共享内存,shmat挂载到进程地址空间,进程间读写数据,最后用shmdt分离和shmctl删除共享内存。 

5.信号 

信号是一种软中断,处理方式是忽略/捕获/默认动作。

 6.信号量

信号量是一个计数器,主要用于进程/线程之间的同步和互斥。

 7.socket套接字

不局限于是否在同一个机器上。

 六.操作系统中进程调度策略

1.什么是进程调度?

调度对象

线程和进程相对于操作系统而言都是任务(task_struct)。

线程又称为共享用户虚拟地址空间的进程。

包含多个线程的进程称之为线程组。

只有一个线程的进程称为进程。

没有用户虚拟地址空间的进程称之为内核线程。

用于绝对由谁(哪个或者哪几个)获得处理器的执行权 

进程状态

就绪 -->|进程调度| 运行
运行 -->|时间片用完| 就绪

运行 -->|io请求| 阻塞
阻塞 -->|io就绪| 就绪

 调度时机

主动调度(系统调用等待某个资源)。

周期调度(系统进程不主动让出,内核依靠周期时钟来抢占调度)。

唤醒抢占,创建新进程抢占,内核抢占。

2.进程调度有哪些算法? 

先来先服务(FCFS)

从就绪队列中存在时间最长的进程执行调度。

 短作业优先(SJF)

从就绪队列中选择估计运行时间最短的任务执行调度

高响应比优先 

FCFS和SJF的综合;综合考虑等待时间和估计运行时间来选择执行调度。

时间片轮转调度

 适用分时系统,为任务分配时间片,执行完时间片后放入就绪队列。

优先级调度 

从就绪队列中选择优先级最高的若干任务执行调度。

优先级用来描述运行的紧迫程度。

多级反馈队列 

时间片和优先级的综合。

动态调整任务的优先级和时间片的大小,从而兼顾多方面的系统目标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/87165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【uniapp】小程序中input输入框的placeholder-class不生效

解决方法 1.去掉scoped <style></style> 2.额外写一组style </style lang"scss" scoped> </style> <style> ::v-deep .textarea-placeholder { font-size: 24rpx; font-weight: 400; …

大模型训练与推理显卡全指南:从硬件选型到性能优化

在人工智能技术飞速发展的今天&#xff0c;大型语言模型(LLM)已成为推动行业进步的核心动力。然而&#xff0c;训练和部署这些“数字巨人”需要强大的计算基础设施作为支撑&#xff0c;其中GPU的选择直接决定了模型开发的效率与成本。本文将全面剖析当前主流GPU型号在大模型训练…

Linux Docker的环境配置与简单使用

参考资料 Windows Docker Desktop设置中文【Docker 】Docker Desktop for Windows&#xff08;WSL 2&#xff09;安装WSL 2 上的 Docker 远程容器入门 目录 一. 环境配置1.1 安装WSL1.2 安装配置 Docker Desktop1.3 VS Code 插件安装1.4 下载项目&#xff0c;配置Dockerfile 二…

函数指针与指针函数:本质区别与高级应用

目录 一、概念本质解析 1. 函数指针&#xff08;Function Pointer&#xff09; 2. 指针函数&#xff08;Pointer Function&#xff09; 二、函数指针深度剖析 1. 基础用法示例 2. 高级应用&#xff1a;回调函数 3. 函数指针数组 三、指针函数深入探讨 1. 基础实现模式 …

【python】基于pycharm的海康相机SDK二次开发

海康威视二次开发相机管理 这段代码基于python开发的&#xff0c;用了opencv的一些库函数。实现了一个完整的海康机器人相机管理工具&#xff0c;支持多相机连接、参数配置、图像采集和实时显示功能。目前USB相机测试无误&#xff0c;除了丢一些包。 1. 主要类结构 HKCameraM…

HTTP 协议各个主要版本的功能特点、核心原理、使用场景总结

我们来系统总结一下 HTTP 协议各个主要版本的功能特点、核心原理&#xff08;用图示辅助说明&#xff09;以及典型使用场景。 核心演进目标&#xff1a; 提升性能、安全性、效率和灵活性。 1. HTTP/0.9 (1991) - 远古雏形 功能特点: 极其简单&#xff1a; 只支持 GET 方法。无…

Linux编程:3、进程通信-信号

一、进程通信概述 &#xff08;一&#xff09;进程通信的目的 在企业开发中&#xff0c;一个项目常常需要多个进程共同协作&#xff0c;而这些进程之间需要进行通信&#xff08;交换信息&#xff09;以便协作。本章内容主要围绕信号讲解&#xff0c;其它进程通信的常用方式请…

深度解析Vue.js组件开发与实战案例

一、Vue.js组件化思想 Vue.js的核心思想之一就是组件化开发。组件系统是Vue的一个重要概念,它允许我们使用小型、独立和通常可复用的组件构建大型应用。在Vue中,组件本质上是一个拥有预定义选项的Vue实例。 1.1 为什么需要组件化 代码复用:避免重复造轮子,提高开发效率可…

TensorFlow 2.0 与 Python 3.11 兼容性

TensorFlow 2.0 与 Python 3.11 兼容性 TensorFlow 2.0 官方版本对 Python 3.11 的支持有限&#xff0c;可能出现兼容性问题。建议使用 TensorFlow 2.10 或更高版本&#xff0c;这些版本已适配 Python 3.11。若需强制运行&#xff0c;可通过以下方式解决依赖冲突&#xff1a; …

MyBatisPlus 全面学习路径

MyBatisPlus 全面学习路径 学习目录 第一部分&#xff1a;MyBatisPlus 基础 MyBatisPlus 简介与核心特性快速入门与环境搭建核心功能&#xff1a;BaseMapper 与 CRUD 接口条件构造器&#xff08;Wrapper&#xff09;详解ActiveRecord 模式主键策略与通用枚举 第二部分&…

React16,17,18,19更新对比

文章目录 前言一、16更新二、17更新三、18更新四、19更新总结 前言 总结react 16&#xff0c;17&#xff0c;18&#xff0c;19所更新的内容&#xff0c;并且部分会涉及到原理讲解。 一、16更新 1、在16.8之前更新&#xff0c;还是基于class组件的升级和维护更新。并且更新了一…

【git】有两个远程仓库时的推送、覆盖、合并问题

当你执行 git pull origin develop(或默认的 git pull)时,Git 会把远端 origin/develop 的提交合并到你本地的 develop,如果远端已经丢掉(或从未包含)你之前在私库(priv)里提交过的改动,那这些改动就会被「覆盖」,看起来就像「本地修改没了」。 要解决这个问题,分…

Spring Boot 集成国内AI,包含文心一言、通义千问和讯飞星火平台实战教程

Spring Boot 集成国内AI&#xff0c;包含文心一言、通义千问和讯飞星火平台实战教程 一、项目结构二、添加Maven依赖三、配置API密钥 (application.yml)四、配置类1. AI配置类 (AiProperties.java)2. 启用配置类 (AiConfig.java) 五、服务层实现1. 文心一言服务 (WenxinService…

Elastic Search 学习笔记

1. Elasticsearch 是什么&#xff1f;有哪些应用场景&#xff1f; Elasticsearch 整体原理流程&#xff1f; Elasticsearch 是一个为海量数据提供近实时搜索和分析能力的分布式搜索引擎&#xff0c;广泛应用于全文检索、日志分析和大数据处理场景中。 Elasticsearch 整体原理…

动态规划之斐波那契数(一)

解法一&#xff1a;递归 class Solution { public:int fib(int n) {if(n<2) return n;return fib(n-1)fib(n-2);} }; 解法二&#xff1a;dp class Solution { public:int fib(int N) {if (N < 1) return N;int dp[2];dp[0] 0;dp[1] 1;for (int i 2; i < N; i) {…

如何设置爬虫的访问频率?

设置爬虫的访问频率是爬虫开发中的一个重要环节&#xff0c;尤其是在爬取大型网站&#xff08;如1688&#xff09;时&#xff0c;合理的访问频率可以避免对目标网站造成过大负担&#xff0c;同时也能降低被封禁的风险。以下是一些常见的方法和建议&#xff0c;帮助你合理设置爬…

前端面试六之axios

一、axios简介 Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境。在浏览器端&#xff0c;Axios 的底层实现是基于原生的 XMLHttpRequest&#xff08;XHR&#xff09;。它对 XHR 进行了封装&#xff0c;增加了 Promise 支持、自动转换 JSON 数据…

模板方法模式Template Method Pattern

模式定义 定义一个操作中算法的骨架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 类行为型模式 模式结构 AbstractClass&#xff1a;抽象类ConcreteClass&#xff1a;具体子类 只有类之间的继…

【行云流水AI笔记】游戏里面的强化学习使用场景

强化学习在游戏中的应用已从早期的棋类博弈扩展到现代复杂游戏的全流程优化&#xff0c;以下是结合最新技术进展的核心应用场景及典型案例&#xff1a; 一、竞技游戏的策略突破 1. 策略博弈类游戏 代表案例&#xff1a;AlphaGo/AlphaZero&#xff08;围棋&#xff09;、Alph…

使用Python和PyTorch框架,基于RetinaNet模型进行目标检测,包含数据准备、模型训练、评估指标计算和可视化

下面是一个完整的实现方案,使用Python和PyTorch框架,基于RetinaNet模型进行目标检测,包含数据准备、模型训练、评估指标计算和可视化。 import os import numpy as np import matplotlib.pyplot as plt import torch import torchvision from torchvision.models.detection…