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

网络通信与并发编程(四)操作系统、进程理论、开启进程的两种方式

多道技术、进程理论

文章目录

  • 多道技术、进程理论
  • 一、操作系统
    • 1.1操作系统
    • 1.2操作系统中的常见概念
    • 1.3操作系统的发展史
  • 二、进程理论
    • 2.1同步、异步、阻塞、非阻塞
    • 2.2 进程的层次结构
    • 2.3 运行态、阻塞态、就绪态
  • 三、开启进程的两种方式
    • 3.1使用Process创建进程的两种方式
    • 3.2 父进程与子进程的关系
    • 3.3 Process的属性介绍

一、操作系统

1.1操作系统

如下图所示,操作系统是一个协调、管理和控制计算机硬件资源和软件资源的控制程序,位于应用程序与硬件之间,负责按用户的指令操作硬件。
在这里插入图片描述

1.2操作系统中的常见概念

串行:一个任务完完整整地运行完毕后,才能运行下一个任务。
并行:真正意义上多个任务的同时运行,只有多核才实现并行。
并发:看起来多个任务是同时运行的即可,单核也可以实现并发。(伪并行)

cpu的功能:cpu是用来做计算,cpu是无法执行IO操作的。一旦遇到io操作,程序会阻塞在原地,cpu会去执行别的任务。

多道技术(单核cpu情况下):多道技术中的多道指的是多个程序,多道技术的实现是为了解决多个程序竞争同一个cpu的问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用。

  • 空间上的复用:多个程序共同加载入内存,且程序在内存中是物理隔离的。
  • 时间上的复用:程序并发运行时cpu会在多个运行的程序间来回切换。

程序并发运行时cpu会在多个进程间来回切换指的是:

  • cpu运行期间遇到I/O操作时会切换处理其他程序。
  • cpu运行期间在某程序上运行时间较长时,也会切换处理其他程序。
    简单来说就是cpu同时处理多个程序只是看起来的同时处理,本质是cpu在多个程序间来回的切换。

1.3操作系统的发展史

发展阶段时间组成改进缺陷
第一代1940~1955真空板和穿孔卡片无操作系统,程序设计需直接操作硬件
第二代1955~1965晶体管和批处理系统批处理,节省时间串行操作且无法及时调整程序
第三代1965~1980集成电路芯片和多道技术多道技术
第四代1980至今个人pc并发

二、进程理论

进程指的就是一个正在运行的程序,或者说是程序的运行过程,即进程是一个抽象的概念。进程是起源于操作系统的,是操作系统最核心的概念,操作系统所有其他的概念都是围绕进程展开的。

进程和程序的区别:程序仅仅指一堆代码,而进程则是指程序的运行过程。拿厨师做菜举例,程序相当于菜谱,而进程则是厨师按菜谱做菜这个过程。

2.1同步、异步、阻塞、非阻塞

同步指程序在执行某个任务时,会等待该任务完成,然后才能继续执行后续的代码。在同步操作中,程序的执行流程是线性的,一个任务完成后,才会执行下一个任务。

异步指程序在执行某个任务时,不会等待该任务完成,而是继续执行后续的代码。当该异步功能完成后,通过状态、通知或回调来通知调用者。

阻塞:当一个进程/线程执行一个需要等待的操作时,它会停止执行,直到该操作完成。这意味着进程/线程会被挂起,直到所需的操作完成。

非阻塞:当一个进程/线程执行一个需要等待的操作时,它会继续执行后续的代码,而不是停止等待。这意味着进程/线程可以同时进行其他工作,而不需要等待某个操作完成。

同步与异步针对的是函数/任务的调用而言的,阻塞与非阻塞针对的是进程/线程的。同步就是当一个进程发起一个函数/任务调用的时候,一直等到函数/任务完成,而进程继续处于激活状态;阻塞是当请求不能满足的时候就将进程挂起,也就是进程是非激活的。

2.2 进程的层次结构

在Linux中所有的进程都是以init(或systemd)进程为根,组成树形结构。在windows中没有进程层次的概念,所有的进程都是地位相同的。唯一类似于进程层次的暗示是在创建进程时,父进程得到一个特别的句柄,该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程。

2.3 运行态、阻塞态、就绪态

运行态、阻塞态、就绪态是进程的三种状态,其关系如下:
在这里插入图片描述

三、开启进程的两种方式

父进程开启子进程的过程中,操作系统会开辟一个新的内存空间存放子进程代码,并将父进程数据拷贝一份给子进程。

3.1使用Process创建进程的两种方式

方式一:

from multiprocessing import Process
import time#子进程执行的函数
def task(x):print('%s is running' %x)time.sleep(3)print('%s is done' %x)#windows中创建子进程会父进程的文件作为模块导入(复制父进程数据),不写下方代码会引发循环导入问题。
if __name__ == '__main__':#创建子进程,target传入子进程执行的功能,args为task函数的参数,如果传关键字参数用kwargsp=Process(target=task,args=('子进程',))#向操作系统请求开启子进程,p.start本质上是运行了进程中的run方法p.start()print('主进程')#父进程需等待子进程结束以后才会结束

方式二:

from multiprocessing import Process
import time#通过类创建子进程
class Myprocess(Process):def __init__(self,name):#Process类中有个参数name表示子进程的名称super().__init__(name=name)#run函数为子进程执行的功能函数,Myprocess是abc类的子类,必须复写run函数def run(self):print('%s is running' %self.name)time.sleep(3)print('%s is done' %self.name)if __name__ == '__main__':p=Myprocess('子进程1')#执行run方法向操作系统请求开启子进程p.start() print('主')

上述代码的打印结果为:
在这里插入图片描述
原因是p.start() 向操作系统请求开启子进程,而p.start函数的执行是异步的,父进程请求完以后会继续执行下面的代码,直到父进程执行完以后操作系统才开启完毕子进程并运行子进程。

如果想让子进程先运行完再打印’主’可以添加p.join()

from multiprocessing import Process
import time#通过类创建子进程
class Myprocess(Process):def __init__(self,name):#Process类中有个参数name表示子进程的名称super().__init__(name=name)#run函数为子进程执行的功能函数,Myprocess是abc类的子类,必须复写run函数def run(self):print('%s is running' %self.name)time.sleep(3)print('%s is done' %self.name)if __name__ == '__main__':p=Myprocess('子进程1')#执行run方法向操作系统请求开启子进程p.start() #父进程在此阻塞等待子进程运行结束后才运行下面的代码p.join()print('主')

在这里插入图片描述
注意点:

from multiprocessing import Process
import timedef task(x):print('%s is running' %x)time.sleep(3)print('%s is done' %x)if __name__ == '__main__':p1=Process(target=task,kwargs={'x':'子进程1'})p2 = Process(target=task, kwargs={'x': '子进程2'})p1.start()p1.join()p2.start()p2.join()print('主')

上述代码中
p1.start()
p1.join()
p2.start()
p2.join()
会让子进程p1运行完以后才开启子进程p2,子进程p2运行完后打印’主‘。话句话是就是子进程p1和子进程p2变成同步运行的了。
如果想让子进程p1和子进程p2异步运行并在两子进程运行完后父进程才打印’主’应将程序改为

from multiprocessing import Process
import timedef task(x):print('%s is running' %x)time.sleep(3)print('%s is done' %x)if __name__ == '__main__':p1=Process(target=task,kwargs={'x':'子进程1'})p2 = Process(target=task, kwargs={'x': '子进程2'})p1.start()p2.start()p1.join()p2.join()print('主')

3.2 父进程与子进程的关系

  • 各个进程之间是相互隔离的,也就是说某一个进程中数据的变化不会影响其他进程。
  • 父进程执行完以后需等待子进程执行完,并回收子进程的pid号。

3.3 Process的属性介绍

from multiprocessing import Process
import timeclass Myprocess(Process):def __init__(self,name):super().__init__(name=name)def run(self):print('%s is running' %self.name)time.sleep(3)print('%s is done' %self.name)if __name__ == '__main__':p=Myprocess('子进程1')

如上方代码所示创建子进程p。
p.terminate()表示向操作系统请求强制终止子进程p。
p.is_alive()表示查看子进程是否存活。
p.pid表示子进程的pid号。如果想查看父进程的pid可以在父进程使用os.getpid()或者在子进程使用os.getppid()
p.name表示子进程的名称。

相关文章:

网络通信与并发编程(四)操作系统、进程理论、开启进程的两种方式

多道技术、进程理论 文章目录 多道技术、进程理论一、操作系统1.1操作系统1.2操作系统中的常见概念1.3操作系统的发展史 二、进程理论2.1同步、异步、阻塞、非阻塞2.2 进程的层次结构2.3 运行态、阻塞态、就绪态 三、开启进程的两种方式3.1使用Process创建进程的两种方式3.2 父…...

Java--集合(三)之vectorlinkedlisthashset结构

文章目录 0.架构图1.vector解析2.LinkedList分析2.1源码分析2.2迭代器遍历的三种方式 3.set接口的使用方法3.1基本使用说明3.2基本遍历方式3.3HashSet引入3.4数组链表模拟3.5hashset扩容机制3.6hashset源码解读3.7扩容*转成红黑树机制**我的理解 0.架构图 1.vector解析 和之前介…...

upload-labs Pass-04

upload-labs Pass-04 在进行测试前,先了解一下.htaccess文件 .htaccess文件 .htaccess是Apache网络服务器一个配置文件,当.htaccess文件被放置在一个通过Apache Web服务器加载的目录中,.htaccess文件会被Apache Web服务器软件检测并执行&…...

如何修改jupyter notebook的工作目录

1.生成配置文件: 打开Anaconda Prompt,输入如下命令 jupyter notebook --generate-config 用代码可以找到配置文件位置,如果没有填y可以生成。 2.修改配置文件: 修改jupyter_notebook_config.py的配置文件,需将c.Not…...

23种设计模式具体实现方法

提示:文章 文章目录 前言一、背景二、设计模式1、代理模式2、适配器模式2.1 总结 三、3.1 总结 前言 前期疑问: 本文目标: 一、背景 最近 二、设计模式 1、代理模式 参考的这篇文章,代理模式(Proxy) 同时这篇文章还引用了另…...

cisco网络安全技术第3章测试及考试

测试 使用本地数据库保护设备访问(通过使用 AAA 中央服务器来解决)有什么缺点? 试题 1选择一项: 必须在每个设备上本地配置用户帐户,是一种不可扩展的身份验证解决方案。 请参见图示。AAA 状态消息的哪一部分可帮助…...

数据结构练习题5(链表和栈)

1环形链表 II 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测…...

计算机网络408真题解析(湖科大教书匠)

09年...

uniapp+vue3+uview-plus修改默认样式

最近使用uniappvue3uview-plus开发微信小程序中,使用uview-plus自定义底部导航栏tabbar时,遇到修改默认样式不生效问题 使用传统的 ::v-deep、:deep、::v-deep,或者style标签中去掉scoped也是无效的,有好的方案欢迎交流&#xff…...

数控机械制造工厂ERP适用范围有哪些

在当今制造业高速发展的背景下,企业资源计划(ERP)系统已成为提升工厂管理效率、实现生产自动化与信息化的关键工具。特别是对于数控机械制造工厂而言,一个合适的ERP系统能够帮助其优化生产流程、提高产品质量、降低生产成本并增强市场竞争力。 1. 生产计…...

华为配置 之 Console线路配置

目录 简介: 知识点: 配置Console线路密码 1.密码认证模式 2.AAA认证模式 知识点: 总结: 简介: 使用PC模拟器与路由器相连(与交换机相连原理一样),在关机状态下,使用…...

小米等手机彻底关闭快应用

文章目录 快应用的是非最终措施:撤销快应用隐私协议配套措施:安卓去除开屏广告 无用的操作:载快应用小米手机无用,其他手机可以尝试的操作关闭唤起快应用服务打开防止误触、后台启动其他应用 其他措施:冻结、加密快应用…...

【每日一题】24.10.14 - 24.10.20

10.14 直角三角形1. 题目2. 解题思路3. 代码实现(AC_Code) 10.15 回文判定1. 题目2. 解题思路3. 代码实现(AC_Code) 10.16 二次方程1. 题目2. 解题思路3. 代码实现(AC_Code) 10.17 互质1. 题目2. 解题思路3…...

CMake与Qt4/Qt5的结合使用指南

CMake与Qt4/Qt5的结合使用指南 一、同时使用Qt 4和Qt 5二、Qt构建工具2.1 AUTOMOC2.2 AUTOUIC2.3 AUTORCC 三、<ORIGIN>_autogen目标四、Visual Studio生成器五、Windows上的qtmain.lib六、其他文章推荐 在CMake中&#xff0c;您可以方便地找到并使用Qt 4和Qt 5库。Qt 4库…...

TwinCAT3添加PLC轴,并建立PLC轴与NC轴的链接

右键PLC选项&#xff0c;点击创建新项 在弹出的对话框中&#xff0c;选择PLC Templates&#xff0c;然后选择Standard PLC Project&#xff0c;填写项目名称后点击添加 在PLC项目目录中右键GVLs&#xff0c;选择Add&#xff0c;添加Global Variable List&#xff08;全局变…...

Linux操作系统如何制作U盘启动盘

在麒麟系统中有一款U盘启动器软件&#xff0c;它是用于制作系统启动U盘的工具&#xff0c;方便无光驱的电脑安装操作系统&#xff0c;也可以反复使用一个U盘&#xff0c;避免光盘的浪费。下面对该U盘启动器使用方法做详细讲解。 1.准备需要安装的系统镜像文件。 图 1 2.准备1…...

如何防止SpringBoot中的jar反编译?解决相关报错及踩到的坑

目录 1. 面对的场景 2. 方案 2.1 使用代码混淆 2.2 JAR包加密 3. 项目操作 4. 启动方式 5. 踩到的各种坑 5.1 java -jar xxx-0.0.1-SNAPSHOT.jar 没有主清单属性 5.2 Caused by: java.lang.IllegalArgumentException: Unrecognized option: -pwdfxw-jar 1. 面对的场景…...

Axios 基本使用

Axios 是一个异步请求技术,核心作用就是用来在页面中发送异步请求,并获取对应数据在页面中渲染 页面局部更新技术 Ajax 中文网站:https://www.kancloud.cn/yunye/axios/234845 安装: <script src"https://unpkg.com/axios/dist/axios.min.js"></script&g…...

前端大佬都在用的actionDelegationMiddleware究竟有多香?

作为一个前端开发者,我深知跨组件通信的痛点。今天,我要和大家分享一个让我眼前一亮的工具 - alovajs 的 actionDelegationMiddleware。这个中间件简直就是跨组件通信的得力助手!它让我们可以在任意组件中触发其他组件的请求操作,解决了很多麻烦。用了它之后,我感觉整个项目的架…...

解决k8s集群中安装ks3.4.1开启日志失败问题

问题 安装kubesphere v3.4.1时&#xff0c;开启了日志功能&#xff0c;部署时有三个pod报错了 Failed to pull image “busybox:latest”: rpc error: code Unknown desc failed to pull and unpack image “docker.io/library/busybox:latest”: failed to copy: httpRead…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...