进程

进程

  • 进程的概念、组成与特征
  • 进程的状态与转换
  • 进程控制
  • 进程通信

进程的概念、组成与特征

程序是静态的,是一个存放在磁盘里的可执行文件,是一系列的指令集合。
进程是动态的,是程序的一次执行过程,同一个程序多次执行会对应多个进程。

当进程被创建时,操作系统会为该进程分配一个唯一的识别号——PID(Process ID,进程ID)。

进程控制块(Process Control Block,PCB)是进程存在的唯一标志。当进程被创建时,操作系统为其创建 PCB,当进程结束时,操作系统会回收相应的 PCB。操作系统对进程进行管理工作所需的信息都存储在了 PCB 中。

PCB 由以下几个部分组成:

  • 进程描述信息
    • 进程标识符 PID
    • 用户标识符 UID
  • 进程控制和管理信息
    • CPU、磁盘、网络流量使用情况统计…
    • 进程当前状态(就绪态、阻塞态、运行态…)
  • 资源分配清单
    • 正在使用哪些文件
    • 正在使用哪些内存区域
    • 正在使用哪些 I/O 设备
  • 处理机相关信息
    • 如 PSW、PC 等各种寄存器的值(用于实现进程切换)

在这里插入图片描述

进程由以下几个部分组成:

  • PCB
  • 程序段
    • 程序的代码(指令序列)
  • 数据段
    • 运行过程中产生的各种数据(如程序中定义的变量)

在这里插入图片描述

PCB 是给操作系统用的,而程序段和数据段是给进程自己用的,与进程自身的运行逻辑有关。

在这里插入图片描述

在这里插入图片描述

进程是动态的,而进程实体(进程映像)是静态的,可以理解成进程实体是进程在运行过程中的一个快照。因此,上述进程的组成更准确的说是进程实体(进程映像)的组成。

进程定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

如果我们同时打开三个 QQ 聊天软件,则会对于三个 QQ 进程,它们的 PCB、数据段各不相同,但程序段的内容都是相同的(都运行着相同的 QQ 程序)。

进程的特征:

  • 动态性:进程是程序的一次执行过程,是动态地产生、变化和消亡的;动态性是进程最基本的特征
  • 并发性:内存中有多个进程实体,各进程可并发执行
  • 独立性:进程是能独立运行、独立获得资源、独立接受调度的基本单位
  • 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题;异步性会导致并发程序执行结果的不确定性
  • 结构性:每个进程都会配置一个 PCB;每个进程都由 PCB、程序段、数据段组成

进程的状态与转换

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

当终止进程的工作完成后,这个进程就彻底消失了。

在这里插入图片描述

在这里插入图片描述

进程的组织——链接方式,如下所示:

在这里插入图片描述

在这里插入图片描述

进程控制

进程控制的主要作用是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。

在这里插入图片描述

正常情况下,CPU 每执行完一条指令都会例行检查是否有中断信号需要处理,如果有,则暂停运行当前这段程序,转而执行相应的中断处理程序。

在这里插入图片描述

关中断指令和开中断指令是特权指令,只能在内核中使用。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

无论哪个进程控制原语,要做的无非就是三个事情:

  1. 更新 PCB 中的信息
    • 修改进程状态(state)
    • 保存/恢复运行环境
  2. 将 PCB 插入合适的队列
  3. 分配/回收资源

进程通信

进程间通信(Inter-Process Communication,IPC)和进程内通信(Intra-Process Communication)是两种不同的通信方式,用于实现不同作用域内的数据交换和信息传递。

  • 进程间通信:

    • 进程间通信指的是不同进程之间进行数据交换和信息传递的过程。在多进程环境中,不同的进程可能需要共享数据、协作完成任务或者互相通知。常见的进程间通信方式包括管道、共享内存、消息队列、套接字等。这些通信方式允许不同的进程之间进行数据传输和通信,从而实现协作和数据共享。
  • 进程内通信:

    • 进程内通信指的是同一进程内的不同线程或任务之间进行数据交换和信息传递的过程。在多线程编程或并发编程中,不同的线程或任务可能需要共享数据、进行同步操作或者互相通知。常见的进程内通信方式包括共享内存、互斥锁、条件变量、信号量等。这些通信方式允许同一进程内的不同线程或任务之间进行数据共享和同步操作,从而实现并发编程的需求。

常见的进程间通信有以下几种:

  • 管道(Pipe):
    • 管道是一种最基本的进程间通信机制,它可以分为无名管道和命名管道两种形式。
    • 无名管道(Anonymous Pipe):无名管道只能在具有亲缘关系的父子进程之间使用。通过 pipe 系统调用创建一个管道,然后通过 fork 创建的子进程可以与父进程进行管道通信。
    • 命名管道(Named Pipe):命名管道允许不具有亲缘关系的进程之间进行通信。命名管道会在文件系统中创建一个特殊文件,进程可以通过打开该文件来进行读写操作。
  • 共享内存(Shared Memory):
    • 共享内存允许多个进程访问同一块物理内存空间,从而实现数据共享。进程可以将数据写入共享内存区域,其他进程可以从共享内存区域读取数据。
    • 在使用共享内存时,需要解决进程间的同步和互斥问题,以免多个进程同时对共享内存进行读写造成数据不一致。常见的解决方案包括使用信号量、互斥锁等同步机制。
  • 消息队列(Message Queue):
    • 消息队列允许进程向队列中发送消息,并且其他进程可以从队列中接收消息。消息队列提供了一种可靠的、异步的进程通信方式。
    • 进程可以通过系统调用 msgget 创建一个消息队列,然后使用 msgsnd 发送消息,其他进程可以使用 msgrcv 接收消息。
  • 套接字(Socket):
    • 套接字不仅用于不同主机之间的网络通信,也可以用于同一台主机上不同进程之间的通信。
    • 进程可以通过创建套接字并绑定到特定的端口,然后进行网络通信。本地套接字(Unix Domain Socket)则是一种专门用于本地进程间通信的套接字。
  • 信号量(Semaphore):
    • 信号量是一种用于进程间同步的机制,可以用来保护临界区,避免多个进程同时访问共享资源。
    • 进程可以使用系统调用 semget 创建一个信号量,使用 semop 对信号量进行操作,如加锁、解锁等。

常见的进程内通信有以下几种:

  • 共享变量:
    • 共享变量是指多个线程共享同一块内存区域,可以通过读写该内存区域来进行数据交换。共享变量是最简单、最直接的进程内通信方式。
    • 在使用共享变量时,需要注意线程间的同步和互斥问题。可以使用锁、条件变量等机制保证线程对共享变量的访问正确性和可靠性。
  • 条件变量(Condition Variable):
    • 条件变量是一种用于线程间通信的机制,它可以让线程等待某个条件的发生,然后被唤醒。
    • 进程可以使用系统调用 pthread_cond_init 创建一个条件变量,使用 pthread_cond_waitpthread_cond_signal 对条件变量进行操作,如等待、唤醒等。
  • 信号量(Semaphore):
    • 信号量也可以用于进程内通信,它是一种用于进程间同步的机制,可以用来保护临界区,避免多个线程同时访问共享资源。
    • 进程可以使用系统调用 sem_init 创建一个信号量,使用 sem_waitsem_post 对信号量进行操作,如加锁、解锁等。
  • 管道(Pipe):
    • 在进程内部,管道也可以用于通信。可以使用 pipe 系统调用创建一个管道,然后在同一进程内的不同线程之间进行读写操作。
  • 消息队列(Message Queue):
    • 消息队列也可以用于进程内通信,进程可以通过系统调用 msgget 创建一个消息队列,然后使用 msgsndmsgrcv 来发送和接收消息。

进程内通信方式相对于进程间通信来说,实现起来更加简单和高效,同时也避免了跨进程通信可能带来的数据复制和上下文切换带来的性能损失。但是,进程内通信也需要考虑线程间的同步、互斥和错误处理等问题,以保证通信的正确性和可靠性。

进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证数据安全,一个进程不能直接访问另一个进程的地址空间。因此,进程间的通信需借助操作系统的支持。

共享内存:

  • 基于数据结构的共享:比如共享空间里只能放一个长度为 10 的数组。这种共享方式速度慢、限制多,是一种低级通信方式。
  • 基于存储区的共享:操作系统在内存中划出一块共享存储区,数据的形式、存放位置都由通信进程控制,而不是操作系统。这种共享方式速度很快,是一种高级通信方式。

在这里插入图片描述

消息队列(进程间的数据交换以格式化的消息为单位,进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换):

  • 直接通信方式:消息发送进程要指明接收进程的 ID。
  • 间接通信方式:通过“信箱”间接地通信,因此又称为“信箱通信方式”。

在这里插入图片描述

在这里插入图片描述

管道:

  • 是一个特殊的共享文件,又名 pipe 文件,其实就是在内存中开辟一个大小固定的内存缓冲区。
  • 写进程往管道写数据,即便是管道没被写满,只要管道没空,读进程就可以从管道读数据。
  • 读进程从管道读数据,即便是管道没被读空,只要管道没满,写进程就可以往管道写数据。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

NFC物联网智能锁安全测试研究

针对短距离无线通信在物联网智能锁实际运用中的安全机制问题,通过理论分析和实际操作演示潜在的攻击流程,发现其存在的安全漏洞并提出可行的加固方法,并对加固后的通信系统进行CPN建模与安全性分析,对无线通信协议的安全性能提升、…

哥斯拉木马解析 + bypass 免杀代码分析+回调webshell

目录 抓包分析 测试连接 第一个包 第二个包 第三个包 进入控制台 第三个包 请求 返回 木马的解析 第一次链接 第二次链接 payload集合 run reDefSystemFunc() 自写免杀 通过文件名 构造字符 通过请求头实现 php7.3 php5.2 PHP5.3 PHP 7.0.0 这里也是跟着大…

ctf_show(web入门笔记)持续更新中

信息收集 1-2:查看源代码 3:bp抓包 4:robots.txt(这个文件里会写有网站管理者不想让爬虫的页面或其他) 5:网站源代码泄露index.phps 6:同样也是源码泄露,(拿到以后还…

JMeter4.0接口测试之案例实战

在前面的知识体系中介绍了Jmeter的基本应用,下来通过具体的案例来看Jmeter在接口测试中的具体案例实战部分。 HTTP是基于应用层的协议,底层的网络传输层它不需要去关心,同时它是一个无状态的协议,它的请求流程具体可以总结为&…

【基础篇】一、认识JVM

文章目录 1、虚拟机2、Java虚拟机3、JVM的整体结构4、Java代码的执行流程5、JVM的三大功能6、JVM的分类7、JVM的生命周期 1、虚拟机 虚拟机,Virtual Machine,一台虚拟的计算机,用来执行虚拟计算机指令。分为: 系统虚拟机&#x…

Visual Studio使用——自定义代码片段 像使用IDEA一样能快捷输入

目录 引出Visual Studio使用自定义代码片段 Idea安装和使用0.Java下载 和 IDEA工具1.首次新建项目2.隐藏文件不必要显示文件3.目录层级设置4.Settings设置选择idea的场景提示代码不区分大小写 取消git的代码作者显示 总结 引出 Visual Studio使用——自定义代码片段 & 像使…

字节跳动 MapReduce - Spark 平滑迁移实践

摘要:本文整理自字节跳动基础架构工程师魏中佳在本次 CommunityOverCode Asia 2023 中的《字节跳动 MapReduce - Spark 平滑迁移实践》主题演讲。 随着字节业务的发展,公司内部每天线上约运行 100万 Spark 作业,与之相对比的是,线…

Python可视化之Matplotlib

文章目录 Matplotlib与可视化分析简单图形的绘制pylot的高级功能添加图例与注释 Matplotlib与可视化分析 我们之前对数据的处理与分析,其实最终还是要利用可视化工具进行更加直观的输出 我们开业通过 pip install matplotlib命令来安装对应的模块 简单图形的绘制…

带你从数据手册了解CAN 电平参数

CAN终端电阻功率应该选多大? can的中断电阻大家都知道是120R; 这个电阻功率应该选多大呢? 晚上有说0603 封装的,有说0805封装的,有说1206封装的。。。。 那到底该选多少? P U*U/R; 只要知…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

Mathematica中的有理数与浮点数

在Mathematica中如果使用了小数&#xff0c;软件会按照浮点数计算&#xff0c;从而导致不准确的结果。 例如下面的例子&#xff0c;计算下面两个相同式子的拉氏反变换得到的结果会不同&#xff1a; 代码如下 InverseLaplaceTransform[323/(56182 p 323 p^2 1000 p^3), p, t…

基于DS1302的日历时钟

#include<reg51.h> //包含单片机寄存器的头文件 #include<intrins.h> //包含_nop_()函数定义的头文件 /*********************************************************************** 以下是DS1302芯片的操作程序 *******************************************…

记录使用minikube部署web程序,并灰度发布不同版本

1. 安装软件 1.1安装docker desktop 下载地址 重点&#xff1a;配置镜像加速 1.2 安装k8s&minikube 这里参考阿里社区的配置 minikube1.24.0版本下载地址 重点&#xff1a;安装版本问题【因为后面要用阿里云的服务来获取所需Docker镜像&#xff0c;一直不成功使用的高版…

牛客网SQL训练5—SQL大厂真题面试

文章目录 一、某音短视频1.各个视频的平均完播率2.平均播放进度大于60%的视频类别3.每类视频近一个月的转发量/率4.每个创作者每月的涨粉率及截止当前的总粉丝量5.国庆期间每类视频点赞量和转发量6.近一个月发布的视频中热度最高的top3视频 二、用户增长场景&#xff08;某度信…

mysql原理--MySQL基于规则的优化

设计 MySQL 的大叔依据一些规则&#xff0c;竭尽全力的把一些很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程也可以被称作 查询重写 &#xff08;就是人家觉得你写的语句不好&#xff0c;自己再重写一遍&#xff09;。 1.条件化简 我们编写的查询语句的搜…

子类能继承父类的那些内容

子类能继承父类的那些内容 子类不能继承父类的构造方法。 package oop.Extends.a02oopextendsdemo02; public class Test {public static void main(String[] args) {}class Fu{String name;int age;public Fu() {}public Fu(String name, int age) {this.name name;this.ag…

C语言之字符串处理

目录 字符串长度 显示字符串 数字字符的出现次数 大小写字符转换 字符串数组的参数传递 非字符串的字符数组 目前我们所学习到的是围绕字符串的处理&#xff0c;仅仅是生成字符串、读取并显示字符串&#xff0c;下面我学习更加灵活处理字符串的方式。 字符串长度 我们来看…

基于Java+SpringBoot+vue+elementui的校园文具商城系统详细设计和实现

基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文章目录 基于JavaSpringBootvueelementui的校园文具商城系统详细设计和实现前言介绍&#xff1a;系统设计&#xff1a;系统开发流程用户登录流程系统操作流程 功能…

jenkins+mvn使用自定义jdk

jenkins2.357开始已经全面放弃jdk1.8从而使用openjdk11,但是项目一般都是用的比较老的java环境打包构建 一. 配置java环境(此方式测试有问题) 1.1 新增不同jdk配置和路径 1.2 新增后项目选择对应java8 1.3 构建命令 1.4 打包构建失败 原因在build阶段多了 mvn命令导致去掉就…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…