【面试八股总结】进程(一)

参考资料 :小林Coding、阿秀、代码随想录

一、什么是进程?

1. 基本概念        

        进程是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位

2. 进程控制块

        系统通过进程控制块PCB描述进程的进本情况和运行状态,进而控制和管理进程进程,PCB是进程存在的唯一标识,包括以下信息:

  • 进程描述信息:进程标识符、用户标识符;       
  • 进程控制和管理信息:进程当前状态、进程优先级;
  • 进程资源分配清单:有关内存地址空间或虚拟地址空间的信息,所打开文件的列表和所使用的I/O设备信息;
  • CPU相关信息:进程切换时,CPU寄存器的值都被保存在相应的PCB中,以便重新执行该进程时能从断点处继续执行。

3. 并发与并行

  • 单个处理核在很短的时间内分别执行多个进程,称为并发
  • 多个处理核同时执行多个进程称为并行

        并发需要CPU从一个进程切换到另一个进程,在切换前必须要记录当前进程中运行的状态信息,以备下次切换回来的时候可以恢复执行。

4. 进程的上下文切换

        一个进程切换到另一个进程运行,称为进程的上下文切换,进程的上下文切换不仅包含了虚拟内存、栈、全局变量等用户空间资源,还包括了内核堆栈、寄存器等内核的空间资源。

发生进程上下文切换有哪些场景?

  • 进程的时间片耗尽
  • 阻塞等待
  • 高优先级进程运行
  • 中断处理
  • 进程通过睡眠函数Sleep这样的方法将自己主动挂起

二、进程状态

在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。

  • 就绪状态:可以运行,但是由于其他进程处于运行状态而暂时无法运行,等待调度;
  • 阻塞状态:该进程正在等待某一事件发生而暂时停止运行,等待资源;
  • 运行状态:该时刻进程占用CPU;

此外,进程还有另外两个基本状态:

  • 创建状态:进程正在被创建;
  • 结束状态:进程正在从系统中消失。

        如果有⼤量处于阻塞状态的进程,进程可能会占用物理内存空间,所以系统通常会把阻塞状态进程的物理内存空间换出到硬盘等需要再次运行的时候,再从硬盘换入物理内存,那么,就需要⼀个新的状态,来描述进程没有占用实际的物理内存空间的情况,这个状态就是挂起状态

        这跟阻塞状态是不⼀样,阻塞状态是等待某个事件的返回。 挂起状态可以分为两种:

  • 阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
  • 就绪挂起状态:进程在外存(硬盘),但只要进入内存,立刻运⾏;

  • 只有就绪态和运行态可以相互转换,其他的都是单向转换。就绪态的进程通过调度算法获得CPU时间,转为运行态;而运行态进程,在分配给它的CPU时间片用完之后就会转为就绪态,等待下一次调度;
  • 阻塞状态时缺少需要的资源而由运行态转换而来,但该资源不包括CPU时间,缺少CPU时间会从运行态转为就绪态;
  • 当进程等待的外部事件发生时,由阻塞态转换为就绪态,如果此时没有其他进程运行,则转为运行态,否则该进程将处于就绪态,等待CPU空闲。

三、进程控制

1. 进程创建

        ⼀个进程可以创建另⼀个进程,此时创建者为父进程被创建的进程为子进程,操作系统创建⼀个新进程的过程如下:

  • 为新进程分配⼀个独特的进程控制块(PCB)
  • 为新进程分配所需要的资源,比如内存、CPU时间
  • 初始化进程控制块(PCB)的各种字段,包括状态、优先级、寄存器初始值等。
  • 将其状态设置为就绪状态,使其能够被调度执行。进程进入就绪队列,等待分配处理器时间。

2. 进程终止

  • 根据标识符,查找需要终止的进程的 PCB;
  • 如果进程处于执行状态,则立即终止该进程的执行,然后将处理器资源分配给其他进程
  • 如果其还有子进程,则应将该进程的子进程交给 1 号进程接管
  • 将该进程所拥有的全部资源都归还给操作系统;
  • 将其从 PCB 所在队列中删除。

3. 阻塞进程

  • 找到被阻塞进程的标识符对应的PCB
  • 如果该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停⽌运⾏;
  • 将该 PCB 插⼊到等待队列中,将处理机资源调度给其他就绪进程

4. 唤醒进程

  • 在该事件的阻塞队列中找到相应进程的 PCB;
  • 将其从阻塞队列中移出,并置其状态为就绪状态
  • 把该 PCB 插⼊到就绪队列中,等待调度程序调度。

四、进程间通信方式

        进程通信指的是进程之间的信息交换,进程之间⼀般是相互独⽴的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。

1. 管道(匿名管道)

        管道是指用于连接⼀个读进程和⼀个写进程以实现它们之间的通信的⼀个共享文件,⼜名pipe文件,向管道提供输入的发送进程(写进程),以字符流形式将大量的数据送入(写)管道,而接收管道输出的接收进程 (即读进程)则从管道中接收(读)数据。

  • 管道传输数据是半双⼯通信,某⼀时刻只能单向传输。
  • 写入管道中的数据遵循先入先出的规则
  • 管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算⼀个消息等
  • 管道不是普通的文件,不属于某个文件系统,其只存在于内存
  • 管道在内存中对应⼀个缓冲区, 不同的系统其大小不⼀定相同
  • 从管道读数据是⼀次性操作,数据⼀旦被读⾛,它就从管道中被抛弃,释放空间以便写更多的数据
  • 管道通信效率低,不适合进程间频繁地交换数据

        匿名管道:没有名字的管道,⽤完就销毁,只适⽤于父子进程之间的通信。

2. 命名管道

        命名管道(FIFO)不同于匿名管道之处在于它提供了⼀个路径名与之关联,以 FIFO 的⽂件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信。当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便之后使用。

3. 消息队列

        消息队列是保存在内核中的消息链表,在发送数据时,会分成一个一个独立的数据单元,也就是消息体(数据块),消息体是用户自定义的数据类型,消息的发送方和接收方要约定好消息体的数据类型,所以每个消息体都是固定大小的存储块,不像管道是无格式的字节流数据。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除。

消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4. 信号量

        信号量⽤于控制多个进程对共享资源的访问,比如避免因为多个进程同时修改同⼀个共享内存造成冲突,信号量可以使共享的资源在任意时刻只能被⼀个进程访问。

        信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据信号量维护⼀个整数值,通常称为计数器。进程可以执⾏两种基本操作来操作信号量:

  • P(Wait)操作:这个操作会把信号量减去 1,相减后如果信号量 < 0,则表明资源已被占⽤,进程需阻塞等待;相减后如果信号量 >= 0,则表明还有资源可使⽤,进程可正常继续执⾏。
  • V(Signal)操作:这个操作会把信号量加上 1,相加后如果信号量 <= 0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行;相加后如果信号量 > 0,则表明当前没有阻塞中的进程;

        P 操作是用在进入共享资源之前,V 操作是用在离开共享资源之后,这两个操作是必须成对出现的。

5. 共享内存

        共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。这使得多个进程可以访问同一块内存空间,通过对共享空间进行写/读操作实现进程之间的信息交换,是最快的可用IPC模式。

6. 信号

        信号事件的来源主要有硬件来源(如键盘 Cltr+C )和软件来源(如 kill 命令)。 信号是进程间通信机制中唯⼀的异步通信机制它可以在⼀个进程中通知另⼀个进程发生了某种事件从而实现进程通信。

7. 内存映射

        内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间实现通信。

8. Socket

        Socket 通信是⼀种网络编程中常见的通信方式,不仅可以跨网络与不同主机的进程间通信,还可以在同主机上进程间通信。

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

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

相关文章

20.2k stars项目搭建私人网盘界面美功能全

Nextcloud是一套用于创建网络硬盘的客户端&#xff0d;服务器软件。其功能与Dropbox相近&#xff0c;但Nextcloud是自由及开放源代码软件&#xff0c;每个人都可以在私人服务器上安装并执行它。 GitHub数据 20.2k stars561 watching3.2k forks 开源地址:https://github.com/ne…

利用Python将TXT文件中的经纬度数据转换为JSON格式

在处理地理空间数据时&#xff0c;经常需要将数据从一种格式转换为另一种格式&#xff0c;以便于后续的分析或可视化。本文将介绍如何使用Python脚本将存储在TXT文件中的经纬度数据转换为JSON格式。 一、背景介绍 经纬度数据是地理信息系统&#xff08;GIS&#xff09;中的基…

Redis 全景图(3)--- Redis 应用于缓存

前言 这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流&#xff0c;我也是没办法&#xff0c;才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。 其实为什么要讲这个话题呢&#xff1f; Redis 应用在很多地方呀&#xff0c;为什么一定要挑着这个话题来讲呢…

如何从屏幕破损的 Android 手机恢复数据?

假设您不小心将智能手机掉落在地上&#xff0c;导致手机显示屏破裂&#xff1b;或者&#xff0c;如果Android手机由于日常生活中的病毒攻击等其他原因而损坏或死机&#xff0c;如何从损坏的Android手机中完全提取保存的联系人、消息甚至更多文件&#xff1f;如何在手机上恢复所…

使用 Prisma ORM 和 Cloudflare D1 构建应用程序

自 2017 年推出 Workers 以来&#xff0c;Cloudflare 一直引领边缘计算领域。Cloudflare 最近通过 D1 发布了本机无服务器数据库。我们现在可以使用 Prisma ORM 与 D1 一起构建应用程序。 将数据库部署到边缘 Cloudflare Workers 是一种分布在全球范围内的轻量级无服务器计算形…

Centos7安装Docker与Docker-compose【图文教程】

个人记录 查看一下系统是否已经安装了Docker yum list installed | grep docker如下图代表没有安装Docker 卸载已有Docker yum remove docker docker-common docker-selinux docker-engine切换目录 cd /etc/yum.repos.d/查看当前目录所有的镜像源 ll安装yum-util与devi…

基于springboot实现影城管理系统项目【项目源码+论文说明】

基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…

C语言-realloc函数的使用

语法格式 1. realloc 函数用于动态地改变之前分配的内存块的大小。其函数原型如下&#xff1a; void *realloc(void *ptr, size_t size);- ptr: 指向之前分配的内存块的指针。如果 ptr 为 NULL&#xff0c;那么 realloc 行为与 malloc 相同。 - size: 新分配的大小&#xff0…

前端三剑客 —— CSS (上)

上节内容中提到了 前端三剑客 —— HTML 超文本标记语言&#xff0c;这节内容 跟大家讲述三剑客中的第二个 CSS。 CSS 什么是CSS Cascading Style Sheel&#xff0c;简称CSS&#xff0c;中文叫层叠样式表&#xff0c;也叫级联样式表。主要作用是来修饰HTML页面的一种技术。 …

案例:非功能性需求的设计

在咨询中看到很多项目组对于非功能性需求没有做设计&#xff0c;很多项目组在设计文档中仅仅是把非功能性需求的描述拷贝到设计文档的非功能性章节。因此特地设计了两个简单的需求给大家参考&#xff0c;希望能够引导设计人员重视非功能性需求的设计。

视觉大模型--deter的深入理解

但对于transformer用于目标检测领域的开创性模型&#xff0c;该模型言简意赅&#xff0c;但是但从论文理解&#xff0c;有很多细节都不清楚&#xff0c;尤其是解码器的query和二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)相关&#xff0c;本文将根据代码详…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中&#xff0c;我们实现了Tag和InputAction的数据对应&#xff0c;后面&#xff0c;我们会通过InputAction触发对应的Tag&#xff0c;然后在GameplayAbility身上设置对应的Tag&#xff0c;然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

精读 Generating Mammography Reports from Multi-view Mammograms with BERT

精读&#xff08;非常推荐&#xff09; Generating Mammography Reports from Multi-view Mammograms with BERT&#xff08;上&#xff09; 这里的作者有个叫 Ilya 的吓坏我了 1. Abstract Writing mammography reports can be errorprone and time-consuming for radiolog…

基于单片机的数字万用表设计

**单片机设计介绍&#xff0c;基于单片机的数字万用表设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的数字万用表设计概要是关于使用单片机技术来实现数字万用表功能的一种设计方案。下面将详细概述该设计的各个…

【性能测试】接口测试各知识第2篇:学习目标,1. 理解接口的概念【附代码文档】

接口测试完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;接口测试&#xff0c;学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标&#xff0c;RESTFUL1. 理解接口的概念,2.什么是接口测试…

ChatGPT 的行家指南

原文&#xff1a;An Insider’s Guide to using ChatGPT 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 你是否厌倦了花费无数小时为你的业务创建内容&#xff1f;从博客文章到社交媒体更新&#xff0c;从电子书内容到电子邮件&#xff0c;这可能是一个耗时的过…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

基于java+SpringBoot+Vue的学生心理咨询评估系统设计与实现

基于javaSpringBootVue的学生心理咨询评估系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 后台展示 用户管理模块&#xff1a;管理员可以查看、添加、编辑和删除用户信息。 试题管理模块&#xff1a…

Qt + VS2017 创建一个简单的图片加载应用程序

简介&#xff1a; 本文介绍了如何使用Qt创建一个简单的图片加载应用程序。该应用程序可以打开图片文件并在界面上显示选定的图片&#xff0c;并保存用户上次选择的图片路径。 1. 创建项目&#xff1a; 首先&#xff0c;在VS中创建一个新的Qt Widgets应用程序项目&#xff0c;并…

LeetCode 1379.找出克隆二叉树中的相同节点:二叉树遍历

【LetMeFly】1379.找出克隆二叉树中的相同节点&#xff1a;二叉树遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/ 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0…