[操作系统]京东一面~进程相关汇总

1 进程、线程、协程的概念

进程:

静态程序的运行状态就叫进程。是资源分配的基本单位。

线程:

是进程的一个执行单元,是进程内的调度实体。是CPU调度的独立单位。线程也被称为轻量级进程。

协程:

是一种比线程更加轻量级的存在。一个线程也可以拥有多个协程。其执行过程更类似于子线程,或者说不带返回值的函数调用。

2 进程和线程的区别

  1. 地址空间:

线程共享本进程的地址空间,而进程之间是独立的地址空间。

  1. 资源:

线程共享本进程的资源如内存、I/O、CPU等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。

  1. 健壮性:

多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都可能死掉。

  1. 执行过程:

每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。

但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。

  1. 切换时:

进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。

对于进程,我们需要将状态保存到进程控制块(PCB)中,同样的,线程也有相同作用的线程控制块TCB,但是和进程上下文切换相比,线程在进行上下文切换的时候地址空间保持不变 ,所以不需要切换当前使用的页表。

  1. 其他:

线程是处理器调度的基本单位,但是进程不是。

3 线程与协程的区别

首先,线程与协程都具有隔离性,拥有自己的上下文。
但是线程在创建的时候需要预先分配MB级别的栈空间,而协程只需要KB。
线程间上下文切换与调度消耗很多资源,例如从用户态切换到内核态,保存当前线程环境,加载目标线程的执行环境,再从内核态切换到用户态,涉及两次上下文切换。而协程是在空户空间下模拟的线程操作。虽然协程在创建的时候也需要动态绑定一个线程,真正执行任务的也是线程。但是协程是在用户级别完成调度切换的,对于内核来说是无感知的,也就是说,协程的调度是基于用户进程空间的,可以避免线程间的切换问题(当然了,如果当前的协程切换是由于时间片到期导致做绑定的线程切换的话,还是会涉及线程的切换)。
线程是抢占式执行,当发生系统调用或者中断的时候,交由OS调度执行;而协程是可以在业务逻辑编写的时候由代码控制主动切换,比如说python 通过yield主动让出cpu所有权,切换到其他协程执行,当然 Go 可以利用 CSP 完成相同功能。
一旦创建完线程,你就无法决定他什么时候获得时间片,什么时候让出时间片了,你把它交给了内核。而协程编写者可以有:可控的切换时机和很小的切换代价。从操作系统有没有调度权上看,协程就是因为不需要进行内核态的切换,所以协程的上下文切换比线程快很多。

4 何时使用多进程,何时使用多线程?

对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

5 为什么会有线程?

每个进程都有自己的地址空间,即进程空间,当一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。

6 为什么要有协程

一是节省CPU,避免系统内核级的线程频繁切换,造成的CPU资源浪费。而协程是用户态的线程,用户可以自行控制协程的创建与销毁,极大程度避免了系统级线程上下文切换造成的资源浪费。
二是节约内存,在64位的Linux中,一个线程需要分配8MB栈内存和64MB堆内存,系统内存的制约导致我们无法开启更多线程实现高并发。而在协程编程模式下,可以轻松有十几万协程,这是线程无法比拟的。
三是稳定性,前面提到线程之间通过内存来共享数据,这也导致了一个问题,任何一个线程出错时,进程中的所有线程都会跟着一起崩溃。
四是开发效率,使用协程在开发程序之中,可以很方便的将一些耗时的IO操作异步化,例如写文件、耗时IO请求等。

7 进程有哪几种状态?

我们一般把进程大致分为 5 种状态。

  • 创建状态(new) :进程正在被创建,尚未到就绪状态。
  • 就绪状态(ready) :进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
  • 运行状态(running) :进程正在处理器上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
  • 阻塞状态(waiting) :又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。
  • 结束状态(terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。

订正:下图中 running 状态被 interrupt 向 ready 状态转换的箭头方向反了。
在这里插入图片描述
在这里插入图片描述

8 进程间的通信方式

进程间的通信方式有两种基本模型:共享内存和消息传递。

共享内存模型会建立一块供协作进程共享的内存区域,进程通过向此区域读写数据进行通信。
消息传递模型通过协作进程间交换消息来实现通信,通常需要进行系统调用,所以消息传递模型的速度会比共享内存慢。

细分的话,共享内存模型又分:管道,消息队列,共享内存。消息传递模型又分:信号量,信号,socket套接字。

  1. 管道
    • 管道有匿名管道和命名管道。匿名管道只能用于父子进程之间通信,而命名管道可以在任意两个进程间通信。不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则。
  2. 消息队列
    • 消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。
    • 消息队列生命周期随内核,如果没有释放消息队列或者没有关闭操作系统,消息队列会一直存在,而前面提到的匿名管道的生命周期,是随进程的创建而建立,随进程的结束而销毁。
    • 消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。
  3. 共享内存
    • 共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这样这个进程写入的东西,另外一个进程马上就能看到了,都不需要拷贝来拷贝去,传来传去,大大提高了进程间通信的速度。
  4. 信号量
    • 信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据
  5. 信号
    • 上面说的进程间通信,都是常规状态下的工作模式。对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。
    • 比如说我们常用的 kill命令,其实就会产生一个信号,告诉内核,我要终止某个进程。
  6. 套接字
    • 前面提到的管道、消息队列、共享内存、信号量和信号都是在同一台主机上进行进程间通信,那要想跨网络与不同主机上的进程之间通信,就需要 Socket 通信了。

9 线程间的同步的方式

那线程间的同步的方式有哪些呢?
线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。
操作系统一般有下面三种线程同步的方式:

  1. 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
  2. 信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
  3. 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。

10 进程的调度算法

你知道操作系统中进程的调度算法有哪些吗?

先到先服务(FCFS)调度算法
  • 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
短作业优先(SJF)的调度算法
  • 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
时间片轮转调度算法
  • 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
多级反馈队列调度算法
  • 前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
优先级调度
  • 为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
高响应比调度算法

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多线程04 死锁,线程可见性

前言 前面我们讲到了简单的线程安全问题以及简单的解决策略 其根本原因是cpu底层对线程的抢占式调度策略,随机调度 其他还有一些场景的问题如下 1.多个线程同时修改一个变量问题 2.执行的操作指令本身不是原子的 比如自增操作就分为三步,加载,自增,保存 3.内存可见性问题 4.指令…

cesium不同版本对3dtiles的渲染效果不同,固定光照的优化方案

cesium不同版本对3dtiles的渲染效果不同,固定光照的优化方案,避免map.fixedLight true,导致的光照效果太强,模型太亮的问题。 问题来源: 1.Cesium1.47版本加载tileset.json文件跟Mars3d最新版加载文件存在差异效果 Cesium1.47…

小航助学题库蓝桥杯题库stem选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSD…

ESP32-Web-Server编程-建立第一个网页

ESP32-Web-Server编程-建立第一个网页 HTTP 简述 可能你每天都要刷几个短视频,打开几个网页来娱乐一番。当你打开一个网络上的视频或者图片时,其实际发生了下面的流程: 其中客户端就是你的浏览器啦,服务器就是远程一个存放视频或…

openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项

文章目录 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项133.1 检查openGauss状态133.2 检查锁信息133.3 统计事件数据133.4 对象检查133.5 SQL报告检查133.6 备份133.7 基本信息检查 openGauss学习笔记-133 openGauss 数据库运维-例行维护-日维护检查项 …

系列二十二、各种注解

一、Import # 用法 1)Import(User.class):如果导入的是配置类,将会按照配置类正常解析,如果是个普通类就会解析成bean 2)Import(实现了ImportSelector接口的类.class):可以一次性注册…

Linux 栈回溯

目录 前言一、什么是栈回溯?二、栈回溯的实现原理三、参考阅读 前言 日常工作中,我们在开发软件程序时,经常会遇到程序奔溃的问题,导致程序奔溃的原因有很多,我们一般都是定位到相关代码,再去查询具体原因。…

FinOps和DevOps的未来会怎样?

FinOps(或财务运营)是一种文化实践,它将财务责任引入云的可变支出模型。这是一种将系统、最佳实践和文化相结合的战略方法,可提高组织了解云成本并做出明智决策的能力。 本质上,FinOps 是一个管理云运营费用&#xff…

C++:OJ练习(每日练习系列)

编程题: 题一:把字符串转换成整数 把字符串转换成整数_牛客题霸_牛客网 示例1 输入: "2147483647" 返回值: 2147483647思路一: 第一步:it从str的第一个字符开始遍历,定义一个最后输…

使用 ChatGPT 创建 Makefile 构建系统:从 Docker 开始

使用 Docker 搭配 ChatGPT 创建 Makefile 构建系统 Makefile 构建系统是嵌入式软件团队实现其开发流程现代化的基础。构建系统不仅允许开发人员选择各种构建目标,还可以将这些构建集成到持续集成/持续部署 (CI/CD) 流程中。使用诸如 ChatGPT 这样的人工智能 (AI) 工…

【docker】docker的基础命令

基础操作 docker info #查看docker的基本信息docker version #查看docker版本信息一、镜像操作 1、搜索镜像 docker search nginx2、下载镜像 docker pull nginx#从仓库中下载镜像,若没有指定标签,则下载最新的版本,也就是标签为: lat…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一,其旨在有选择地提取图像的某些特征,可以用于在给定应用程序的上下文中传达重要信息,例如,去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

Matplotlib线形图的创建_Python数据分析与可视化

线形图的创建 绘制线形图设置颜色和风格设置坐标轴上下限设置图形标签 绘制线形图 在所有图形中,最简单的应该就是线性方程y f (x) 的可视化了。来看看如何创建这个简单的线形图。要画Matplotlib图形时,都需要先创建一个图形fig 和一个坐标轴ax。创建图…

AI - Crowd Simulation(集群模拟)

类似鱼群,鸟群这种群体运动模拟。 是Microscopic Models 微观模型,定义每一个个体的行为,然后合在一起。 主要是根据一定范围内族群其他对象的运动状态决定自己的运动状态 Cohesion 保证个体不会脱离群体 求物体一定半径范围内的其他临近物…

深度学习回顾:七种网络

一、说明 本文 揭开CNN、Seq2Seq、Faster R-CNN 和 PPO ,以及transformer和humg-face— 编码和创新之路。对于此类编程的短小示例,用于对照观察,或做学习实验。 二、CNN网络示例 2.1 CNN用mnist数据集 CNN 专为图像处理而设计,包…

idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案

🧸欢迎来到dream_ready的博客,📜相信您对博主首页也很感兴趣o (ˉ▽ˉ;) 📜jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量&a…

FreeRTOS源码阅读笔记6--event_groups.c

通常用的事件标志组是一个32位的变量uxEventBits,可设置的位有24位,一共就是24 种事件。 事件组的结构体类型: 6.1创建事件组xEventGroupCreate() 6.1.1函数原型 返回值:事件组句柄,指向事件组。 6.1.2函数框架 ①…

通过亚马逊云科技云存储服务探索云原生应用的威力

文章作者:Libai 欢迎来到我们关于“使用亚马逊云科技云存储服务构建云原生应用”的文章的第一部分。在本文中,我们将深入探讨云原生应用的世界,并探索亚马逊云科技云存储服务在构建和扩展这些应用中的关键作用。 亚马逊云科技开发者社区为开发…

鸿蒙应用开发-初见:ArkUI

编程范式:命令式->声明式 以一个卡片的实现做下讲解 命令式 简单讲就是需要开发用代码一步一步进行布局,这个过程需要开发全程参与。 Objective-C UIView *cardView [[UIView alloc] init]; cardView.backgroundColor [UIColor whiteColor]; ca…

[socket 弹 shell] msg_box3

前言 题目比较简单,没开 Canary 和 NX. Arch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: NX disabledPIE: PIE enabledRWX: Has RWX segments 漏洞利用与分析: 白给的函数调用,其中 ptr 10 是用…