并发——进程

1. 程序

程序(program)是什么?
        计算机程序(computer program)一般是指以某些程序设计语言编程,能够运行于某种目标体系结构上

               

        程序 = 数据结构 + 算法

        

        数据结构:用来表示人们思维对象的抽象概念的物理表现叫做数据(对问题中抽象出来的实体)

                对数据的处理规则叫做指令

        算法:解决问题完整而且准确的描述,是一系列解决问题的清晰的指令

        计算机程序就是算法和数据的集合(算法操作数据)

        

        一个程序的执行过程就是一次计算

        程序是一个静态的概念

2. 程序的执行方式

(1) 顺序执行

        一个程序完全执行完毕后,另一个程序才能被执行

        

        缺点:CPU的利用率非常低

                 某些程序在等待外部条件的时候,CPU是空闲的

                        输入数据----->计算------>输出

(2) 并发执行

        多个程序同时运行(宏观),本质上还是顺序执行

        一个程序有非常多的指令

                        把一条指令的执行过程,分为几个不同的步骤:

                        取指令----->执行------>回写

                        不同的步骤,由不同的硬件去完成

                        

                        理论上来说,就可以多个程序同时运行(宏观)

        

        为了提高cpu的利用率,增加吞吐量,引入"并发执行"

        现代的操作系统为了能够让程序并发执行,特地引入"进程"的概念

                正在进行的程序

3. 进程

进程是什么?

        进程是具有独立功能的程序关于某一个数据集合上的一次运行活动

        

        理解为"炒菜(进程)和菜谱(程序)"的关系

        

        test.c  -------->源程序(源代码)

        int main() {

                int a, b;

                int sum;

                scanf("%d%d", &a, &b);

                sum = a + b;

                printf("sum = %d\n", sum);

                return 0;

        }

        

        gcc test.c -o test  ===>test(程序,二进制文件)

        

        ./test     // 产生一个进程

4. 进程和程序的区别

(1) 程序是静态概念(是指令和数据的集合)

      进程是动态的概念(动态产生,动态的消亡)

 

(2) 进程是一个程序的一次执行活动,一个程序可以对应多个进程(多进程编程)


(3) 进程是一个独立的活动单位,进程是竞争系统资源的基本单位(内存, cpu时间)


 OS为什么要引入进程呢?

        就是为了能够让程序并发运行(同一时间段有多个程序正在运行)

        程序的并发,实际上就是进程的并发

5. 进程状态

OS把一个进程的执行过程,分为几个不同的阶段(状态):

        就绪态(Ready): 进程所有的准备工作已经完成,只需要CPU去执行进程的指令

        运行态(Running): CPU正在执行这个进程的指令

        阻塞态:(Blocking, 等待Waiting): 进程正在等待其他的外部事件(如:输入......)

        

        进程的这些状态可以进行切换

        

僵尸进程(Zombie):

        当进程退出时,父进程没有读取到子进程退出码,子进程就会成为僵尸进程

        一个进程结束了,但是它的父进程没有等待(wait / waitpid)它,那么它就会变成僵尸进程

       僵尸进程会以终止状态保持在进程表中,一直等待父进程读取退出状态码

              

       危害:占用系统资源

        

孤儿进程:

        父进程结束了,子进程就被称为"孤儿进程" 

        孤儿进程被 init 系统进程收养

        

        "就绪队列":Ready Queue

                所有处于就绪态的进程,都处于一个 "队列" 中

        

"调度程序":负责确定下一个进入"Running"状态的进程

        确定下一个占用CPU的进程

"调度策略":调度算法

        分时系统:调度策略以"时间片轮转"为主要策略的系统

                "时间片轮转":分时,每一个进程执行一段时间(时间片)

                如:大部分的桌面操作系统,linux android windows macos unix......


        实时系统:调度策略以"实时策略"为主要策略的系统

                "实时策略":每一次调度都取优先级最高的那个进程执行,直到这个进程执行完毕或者他主动放弃CPU或者其他更高优先级的进程抢占
                如:ucos,freeRTOS...

                可抢占和不可抢占

6. linux进程地址空间布局

程序运行的第一件事,就是申请一块内存区域来存储程序的"数据(用户数据,指令)",不同的数据属性是不一样的

"分区域" 来存储程序的数据

"分段":分不同的逻辑区域

不同属性的数据,存储到不同的"内存段"中,不同的内存段的属性以及管理方法不同

.text  主要存放指令

        只读并且共享,这段内存在程序运行期间内不会被释放

        "指令段":随进程的持续性

.data   数据段

        主要存放程序已经初始化的全局变量和已经初始化的静态(static)变量

        可读可写,这段内存在程序运行期间内不会被释放,随进程的持续性

.bss  数据段

        主要存放程序未初始化的全局变量和未初始化的静态(static)变量

        可读可写,这段内存在程序运行期间内不会被释放,随进程的持续性

        .bss段,在程序初始化时,可能全部被初始化为0(未初始化的全局变量和未初始化的静态(static)变量自动初始化为0)

.rodata  只读数据段

        主要存储程序中的只读数据(如:字符串常量)

        只读(不可以更改):这段内存在程序运行期间内不会被释放,随进程的持续性

栈(stack)空间:

        主要存放局部变量(非static的局部变量)

        可读可写,这段空间,会自动释放(代码块执行完了,代码块中的局部变量的空间就会自动释放),随代码块的持续性

        返回一个局部变量的地址,就会有问题

堆(heap)空间:动态内存空间

        主要是malloc / realloc / colloc动态分配的空间

        可读可写的,这段内存在程序运行期间,一旦分配就会一直存在,直到你手动free或者程序结束

        防止''内存泄漏'' / "垃圾内存"

       

例子:

        

7. 

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

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

相关文章

【雅思写作】Vince9120雅思小作文笔记——P1 Intro(前言)

文章目录 链接P1 Intro(前言)字数限制题型综述(problem types overview)1. **柱状图(Bar Chart)** - 描述不同类别在某个或多个变量上的数据量比较。2. **线图(Line Graph)** - 展示…

day12-多线程

多线程 1.为什么要学习多线程 生活:流水线打工 public static void main(String[] args) { // 代码… for (int i 0; i < 10; i) { System.out.println(i); } // 代码... }多线程:多&#xff08;个&#xff09; 线程 1.1 进程和线程 线程&#xff1a;是进程中的…

【回溯 字典树(前缀树)】212. 单词搜索 II

本文涉及知识点 回溯 字典树&#xff08;前缀树&#xff09; LeetCode212. 单词搜索 II 给定一个 m x n 二维字符网格 board 和一个单词&#xff08;字符串&#xff09;列表 words&#xff0c; 返回所有二维网格上的单词 。 单词必须按照字母顺序&#xff0c;通过 相邻的单元…

【全开源】排队叫号系统基于FastAdmin+GatewayWorker(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 功能简介…

springboot中mybatisplus注意事项

使用代码生成工具CodeGenerator 需要修改的内容 dsc.setUsername(“root”); mysql账号dsc.setPassword(“root”); mysql密码strategy.setInclude(“crm_edu”); 表名pc.setModuleName(“eduservice”); //模块名 package com.test.demo;import com.baomidou.mybatisplus.a…

Array.map解析

map方法会创建一个新数组。该方法会循环数组中的每个值&#xff0c;如果仅仅是想循环数组不需要返回值使用数组的forEach方法就可以。原数组中的每个元素都调用一次提供的函数后的返回值组成。Array.map 它接收一个函数 这个函数可以接收三个参数 数组的每个值item 这个值的索引…

【WebGPU】WebGPU 中的反应扩散计算着色器

在本教程中&#xff0c;我们将使用 WebGPU 技术中的计算着色器实现图像效果。更多精彩内容尽在数字孪生平台。 程序结构 主要构建两个 WebGPU 管道&#xff1a; 运行反应扩散算法多次迭代的计算管道&#xff08;js/rd-compute.js 和 js/shader/rd-compute-shader.js&#xff…

李飞飞首次创业!

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 最近AI又有啥进展&#xff1f;一起看看吧~ 中国独角兽企业已达369家&#xff0c;六成以上与AI、芯片等硬科技赛道有关 2024中关村论坛“全球独角兽企业大会”上发布全新《中国独角兽企业发展报告&am…

数据结构-二叉树-红黑树

一、红黑树的概念 红黑树是一种二叉搜索树&#xff0c;但在每个节点上增加一个存储位表示节点的颜色&#xff0c;可以是Red或者BLACK&#xff0c;通过对任何一条从根到叶子的路径上各个节点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出两倍&#xff0c;…

相同的树——java

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

网安面经之文件包含漏洞

一、文件包含漏洞 1、文件包含漏洞原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;开发⼈员⼀般希望代码更灵活&#xff0c;所以将被包含的⽂件设置为变量&#xff0c;⽤来进⾏动态调⽤&#xff0c;但是由于⽂件包含函数加载的参数没有经过过滤或者严格的…

HTML表单创建学习

文章目录 1、创建HTML框架2.body标签CSS3.表单创建3.1、添加fieldset与label标签3.2、为label标签添加css样式3.3、添加input标签3.4、添加提交按钮3.5、在input标签中添加required3.6、添加minlength属性3.7、pattern属性3.8、设置表单单选按钮无法同时选中3.9、添加链接3.10、…