当前位置: 首页 > 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…...

Qml-Item的Id生效范围

Qml-Item的Id生效范围 前置声明 本实例在Qt6.5版本中做的验证同一个qml文件中&#xff0c;id是唯一的&#xff0c;即不同有两个相同id 的Item;当前qml文件中声明的id在当前文件中有效&#xff08;即如果其它组件中传入的id&#xff0c;与当前qml文件中id 相同&#xff0c;当前…...

【配色网站分享】

个人比较喜欢收藏一些好看的插画、UI设计图和配色&#xff0c;于是有了此篇&#xff0c;推荐一些配色网站&#xff0c;希望能对自己和大家有些帮助。 1.uiGradients 一个主打渐变风网站&#xff0c;还可以直接复制颜色。 左上角的“show all gradients”可以查看一些预设的渐…...

【记录】Android|安卓平板 猫游戏(四款,peppy cat,含下载教程和链接)

前言 网上大部分直接找到的都是 iPad 的猫游戏&#xff0c;安卓的要查英文才找得到&#xff0c;但质量也都一般&#xff0c;或不知道在哪里下载。 遂自己找。 下载测试时间&#xff1a;2024/10/20 文章目录 前言1 检索2 亲测2.1 ✅⭐⭐⭐⭐⭐Cat Alone 1 and 22.2 &#x1f4…...

微前端架构及其解决方案对比

微前端架构及其解决方案对比 微前端架构是一种通过将大型前端应用拆分为多个独立的、可单独部署的小型应用的设计模式。随着这种模式的流行&#xff0c;诞生了多种微前端实现方案&#xff0c;每个方案都有其独特的特点和适用场景。以下是常见的微前端解决方案及其优缺点对比&a…...

git add操作,文件数量太多卡咋办呢,

git add介绍 Git的add命令是用于将文件或目录添加到暂存区&#xff08;也就是索引库&#xff09;&#xff0c;以便在后续的提交&#xff08;commit&#xff09;操作中一并上传到版本库的。具体来说&#xff0c;git add命令有以下几种常见用法&#xff1a; 添加单个文件&#…...

搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程

参考文章&#xff1a; 安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客 一、简单介绍 本文开发环境&#xff0c;均为 windows 环境&#xff0c;mac 环境其实也类似 ~ ① 编译proto文件&#xff0c;相关插件 简单介绍&#xff1a; protoc 是编译器&#xff0c;用于将…...

Spring Boot 核心理解-自动装配

自动装配 spring boot的自动装配&#xff08;auto configuration&#xff09;是通过spring framework的依赖注入&#xff08;dependency injection, DI&#xff09;和配置类的组合来实现的。 spring boot 的自动装配机制可以简化应用的配置过程&#xff0c;是开发者不再需要手…...

go 中指针的执行效率比较

package main import ("fmt""time" ) type Books struct {title stringauthor stringsubject stringbook_id int } func main() {start : time.Now() // 记录开始时间var Book1 Books /* 声明 Book1 为 Books 类型 */var Book2 Books /* 声明…...

单链表的经典算法OJ

目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…...

视频网站开发:Spring Boot框架的高效实现

5 系统实现 5.1用户信息管理 管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享&#xff0c;可以添加&#xff0c;修改&#xff0c;删除视频分…...