JavaEE初阶---初始进程

news2024/10/2 10:37:11

系统分配资源的最小单元--进程

  • 啥是进程
  • 看看进程
  • 操作系统如何管理进程
    • PCB中的一些属性
      • pid(进程id)
      • 内存指针
      • 文件描述符表
  • 进程调度
    • 并行和并发:
    • 进程调度的特性
      • 状态:
      • 优先级:
      • 记账信息:
      • 上下文:
  • 虚拟地址空间
  • 进程间交互

我们日常使用计算机,大致可以抽象成如下形式:自上向下依次是 各种软件>>操作系统>>硬件设备,其中中间的操作系统扮演着承上启下,举足轻重的作用,操作系统中提供的功能是非常复杂的,操作系统中针对"进程"这个软件资源的管理,首先我们要记住的就是,"进程"是系统分配资源的最小单元.

啥是进程

进程可以简单理解为跑起来的一个个程序,就比如你现在在阅读我的博客,那么你正在使用的CSDN或者是浏览器就是一个进程.
在这里插入图片描述
.exe叫做可执行文件,这些可执行文件都是静静躺在硬盘上的文件,双击之前
没有任何影响,一旦双击执行exe文件,操作系统就会把exe加载到内存中,并且
让CPU执行exe内部的一些指令,exe里面就存了很多这个程序对应的二进制指令 ,之前我们稍微说过冯诺依曼体系,这是我们理解操作系统的基础.
当exe执行起来,不躺了,开始进行具体的工作,变成动态的了,我们把运行起来的可执行文件称为"进程".

看看进程

在这里插入图片描述
通过任务管理器,我们可以看到好多好多进程,所以当你迷茫的时候,不清楚进程的时候打开任务管理器,会有惊喜!!

操作系统如何管理进程

1.先描述一个进程(明确出一个进程上面的一些相关属性).
操作系统里面主要通过C/C++来实现,此处的描述就使用C中的结构体(像Java类).都是编程语言中提供的自定义类型,结构体功能更简单,操作系统中描述的这个结构体,称为"PCB"(process control block)进程控制块

2.再组织若干个进程(使用一些数据结构,把很多描述进程的信息放到一起方便增删改查)典型的实现,就是使用双向链表来把每个进程的PCB给串起来.
创建进程:先创建出PCB,然后把PCB加到双向链表中,
销毁进程:就是找到链表上的PCB,然后删除,
查看任务管理器:就是遍历链表,

PCB中的一些属性

pid(进程id)

进程的身份标识,就是进程的身份证

内存指针

指明了这个进程要执行的代码/指令在内存的位置,以及这个进程执行中依赖的数据的位置.
当运行一个exe,此时操作系统就会把这个exe加载到内存中,变成进程 (进程要执行的二进制指令(通过编译器生成),还有一些重要数据)

文件描述符表

程序运行过程中,经常要和文件打交道(文件在硬盘上的)操作文件就是在操作硬盘
我们很直观地就可以感受到,想要马儿跑就要给马儿吃草,你操作系统想要进程工作,必然要给我们的进程分配系统资源.

进程调度

进程调度:现在的操作系统一般都是"多任务操作系统"(前身单任务操作系统),
一个系统同一时间执行了很多的任务
系统上任务(进程)的数量有很多,但是CPU核数就几个,让有限的核心能够执行
很多的进程,这就是"进程调度"

并行和并发:

并行:微观上,两个CPU核心,同时执行两个任务的代码
并发:微观上,一个CPU核心,先执行进程一,然后二然后三…然后一
只要切换到足够快,宏观上看起来,就好像多任务在同时执行

并行和并发这两件事只有在微观上有区分,宏观上我们区分不了,微观上的区分
都是操作系统自行调度的结果,有可能是并行,有可能是并发,有可能两个一起

正因为在宏观上区分不了并行并发,我们在写代码的时候也不去具体区分这两
个词,实际上通常使用"并发"这个词来代指并行+并发.
我们只有在研究操作系统进程调度的时候,稍做区分,其他就使用并发作为统称.

时间管理大师:A rich B handsome C dog

通过一张时间表,安排好时间,避免同一时刻三个人碰面
宏观上看来, 我谈了三个,微观上看来,同一时间我只和一个对象在一起
并发,规划时间的过程,也就是"调度"的过程

进程调度的特性

下面我们讲的这一组特性,不同于进程本身的pid,内存指针,文件描述符表这三个,而是我们在调度进程时需要知道的特征!

状态:

描述了当前这个进程接下来应该怎么样调度:
就绪状态:随时可以去CPU上执行
阻塞/睡眠状态:暂时不可以去CPU上执行
Linux中的进程状态还有很多

正常情况下ABC都是随叫随到的,这就叫做就绪状态
假设A要出差一个月,就认为A是阻塞/睡眠状态,这样的进程就不进行调度

优先级:

先给谁分配时间,给谁分的多
我最喜欢B其次是A最后才是C
这是我在排时间表的时候,优先给B
周一到周三给B周四周五和A周六和C周天休息

记账信息:

统计了每个进程都分别被执行了多久,都执行了哪些指令,分别排队等了多久
给进程调度提供指导依据的,
如果长此以往,和C时间太少,C的好感度就不高了,根据本子上排的时间发现
给C的时间太少了,接下来适当给点甜头

上下文:

就表示了上次进程被调度出CPU的时候,当时程序的执行状态,下次上CPU的时候
就可以恢复之前的状态,然后继续往下执行.
进程被调度出CPU之前,要先把CPU中所有的寄存器中的数据都给保存到内存中
(PCB的上下文字段中),相当于存档了,下次进程再被调度上CPU的时候就可以
从刚才的内存中,恢复这些数据到寄存器中
就是存档和读档,存档存储的游戏信息就是"上下文"
A说让我做点准备买点泳衣B让我准备礼物,过了几天A问我的时候,我给记混了
怎么区分开?记到小本子上,把每次约会的信息记录下来,下次见面的时候就可以
延续上次约会的状态

这样的故事在操作系统中无时无刻不在发生

进程的调度,其实就是操作系统在考虑CPU资源该如何给各个进程分配

虚拟地址空间

内存资源又是如何分配的呢?
虚拟地址空间
由于操作系统上同时运行着很多个进程,如果某个进程出现了Bug,是不会影响
到其他进程的,是"进程的独立性"保证了这一点,依仗了"虚拟地址空间"
如果某个居民阳了,是否会影响到其他的居民?
一旦发现有人阳了,就需要立刻封楼封小区,否则其他人也有危险
这个情况就类似于早期的操作系统,早期的操作系统,里面的进程都是访问同一个
内存的地址空间,如果某个进程出现了Bug,把某个内存的地址给写错了,就可能
引起其他进程的崩溃
解决方案就是把这个院子,给划分出很多的道路,这些道路之间彼此隔离开,每个
人走各自的道路,这个时候就没事,此时即使有人确诊,也影响不到别人

如果把进程按照虚拟地址空间的方式给划分出很多份,这个时候虽然每一份只有
一丁点,虽然系统有百八十个进程,但是实际上从微观上看,同时执行的进程只有
几个,其实每个进程能够分到的内存还是不少的,而且另一方面,进程也不是所有
的进程都用那么多内存,有的内存大,大多数进程也就是M的量级

只要保证划分出来的道路能够满足同时下楼的人数即可.

进程间交互

虽然我们进程是有独立性的,但是不可能一台电脑上所有进程之间都是老死不相往来的态度,人是社会性生物,我觉得计算机同样如此,就比如我可以在QQ里面打开别的程序,这难道不能算是进程间的一次交互嘛?
我们的两个进程之间,也是隔离开的,也是不能直接交互的,操作系统也是提供了
类似的"公共空间",进程A把数据先放到公共空间上,进程B再取走
进程间通讯
操作系统中,提供的"公共空间"有很多种,各有千秋,有的存储空间大,有的小
有的速度快,有的慢
操作系统中提供了很多种这样的进程间通信机制(有些机制属于历史遗留,
已经不适合于现在的程序开发)

现在最主要使用的进程间通信方式有:
1.文件操作
2.网络操作(socket)

好了,希望我的这篇博客可以解决您对于进程的一些困惑!
百年大道,你我共勉!!

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

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

相关文章

易优cms switch 条件判断标签使用方法

【基础用法】 标签:switch 描述:简单条件判断,比if判断标签少些不等于相同功能,视个人习惯而用。 用法: {eyou:switch name$eyou.field.has_children} {eyou:case value1}当前栏目列表的栏目ID有1个下级栏目{/eyo…

跨境电商卖家如何应对拒付、盗卡

跨境电商主要是通过电子商务平台进行交易,在平台上完成支付结算,并通过国际物流将商品送达买方,从而实现跨国零售交易。与传统贸易相比,跨境电商存在交易链条更短、回款周期更快、数据及时透明等优势。商务部数据显示,…

sumifs的交叉 表的例子

比如这样,那么冰箱绿山店的栏位中,SUMIFS($D$3:$D$10,$B$3:$B$10,$F3,$C$3:$C$10,G$2)就是把求和范围,条件1设置为固定列的复合引用,条件2设置为固定行的复合引用即可。

LeetCode 1653. Minimum Deletions to Make String Balanced【字符串,动态规划,枚举】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

shell基本知识

为什么学习和使用Shell编程 什么是Shell shell的起源 shell的功能 shell的分类 如何查看当前系统支持的shell? 如何查看当前系统默认shell? 驼峰语句 shell脚本的基本元素 shell脚本编写规范 shell脚本的执行方式 shell脚本的退出状态 &#xf…

数位dp-- 数字游戏

题目 思路 也是一道比较典型的数位dp的问题,关键的思想跟我上一篇博客很像, 首先把区间值变成[1,Y]-[1,X-1]的值,然后单独计算得到结果。 总的来说就是把这个数的每一位都单独拿出来,然后根据选0-an-1和选**an**两种方案单独计算&…

LeetCode 热题 C++ 538. 把二叉搜索树转换为累加树 543. 二叉树的直径 560. 和为 K 的子数组

538. 把二叉搜索树转换为累加树 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二…

Java基础算法题

目录 练习一 : 优化代码 扩展 : CRTL Alt M 自动抽取方法 练习二: 方法1: 方法2: 方法3: Math : 顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态方法来便于我们实现数学计算: 练习三 : 练习四 : 练习五: 练习…

【GO】K8s 管理系统项目34[Docker方式–应用部署]

K8s 管理系统项目[Docker方式–应用部署] 1. 数据库 1.1 创建数据库目录 mkdir -p /data/mysql5.7/1.2 创建容器 docker run --name mysql -itd -h mysql-server -e MYSQL_ROOT_PASSWORDroot -v /data/mysql5.7:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 …

layui框架实战案例(19):layui-table模块表格综合应用(筛选查询、导入导出、群发短信、一键审核、照片展示、隐私加密)

系列文章目录 layui动态表格翻页和搜索的代码分析layui框架实战案例(3):layui上传错误请求上传接口出现异常解决方案layui框架实战案例(9):layPage 静态数据分页组件layui框架实战案例(10):短信验证码60秒倒计时layui框架实战案例(11)&#…

《实践论》笔记及当下反思(二)

目录 笔记 1、马克思主义所说的绝对真理是什么? 2、客观现实世界的变化运动永远没有完结,人们在实践中对于真理的认识也就永远没有完结 3、改造客观世界,也改造自己的主观世界-——改造自己的认识能力 4、实践、认识、再实践、再认识&…

ARP报文内容详细分析

ARP报文格式如图: 字段1:ARP请求的目的以太网地址,全1时,代表广播地址。 字段2:发送ARP请求的以太网地址。 字段3:以太网帧类型表示后面的数据类型,ARP请求和ARP应答此字段为:0x0806…

SourceTree 重置提交、合并、撤销、回滚

SourceTree重置当前分支到此次提交使用场景:已提交未推送的修改撤销、想把某一次的错误修改全部撤销当前发布代码有bug需要切到上次提交发布版本Git中的HEAD解释# 使用最新一次提交重制暂存区git reset HEAD -- filename# 使用最新一次提交重制暂存区和工作区git re…

SpringBoot——统一功能处理

处理登陆拦截 上一片博客中讲到SpringAOP可以对页面进行拦截,我们可以用SpringAOP实现对登陆的拦截 但是由于拦截需要HttpSession对象,并且之后还需要页面重定向,因此在实际应用中,并不用SpringAOP进行登陆拦截,而是…

HBase---idea操作Hbase数据库并且映射到Hive

idea操作Hbase数据库并且映射到Hive 文章目录idea操作Hbase数据库并且映射到Hiveidea操作Hbase数据库环境准备启动服务创建Maven工程在测试类中编写初始化方法在测试类中编写关闭方法在测试类中编写创建命名空间方法在测试类中编写创建表方法在测试类中编写查看表结构方法在测试…

tmall.product.match.schema.get( 获取匹配产品规则 )

¥免费必须用户授权 ISV发布商品前,需要先查找到产品ID,这个接口返回查找产品规则入参规则 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 点击获取key和secret 请求示例 TaobaoClient …

ORACLE SQL格式化小数点

ORACLE SQL格式化小数点 select CONCAT(TO_CHAR(0.00100,‘990.999’),‘%’) as a0 , CONCAT(TO_CHAR(1100,‘990.999’),‘%’) as a1 , CONCAT(TO_CHAR(0.236100,‘990.999’),‘%’) as a2 , CONCAT(TO_CHAR(0.0200100,‘990.999’),‘%’) as a3 , CONCAT(TO_CHAR(1.0310…

状态机的Go语言实现版本

一、状态机 1. 定义 有限状态机(Finite-state machine, FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。 2. 组成要素 现态(src state):事务当前所处的状…

Java程序中空指针异常的最佳实践

1、空指针问题 NullPointerException 是 Java 代码中最常见的异常,将其最可能出现的场景归为以下 5 种: 参数值是 Integer 等包装类型,使用时因为自动拆箱出现了空指针异常;字符串比较出现空指针异常;诸如 Concurren…

新建vite+vue3+ts项目,以及解决过程中遇到的问题

目录 一、新建vitevue3ts项目 二、解决过程中遇到的问题 解决报错:Module ‘“xx.vue“‘ has no default export. 解决报错:Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid’ imported from xxx的解决 解决报错:[plugin:vi…