并发——进程

news2024/10/6 4:12:13

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.coloradmin.cn/o/1667243.html

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

相关文章

mysql的存储结构

一个表就是一个ibd文件 .ibd文件大小取决于数据和索引,在5.7之后才会为每个表生成一个独立表空间即一个ibd文件,在此之前,所有表默认下都会存储在“系统表空间”(共享表空间),所有表都在一个ibd文件。 inn…

我的全新官网

科技语者-探索未来的语言和沟通 (chgskj.cn) 另外我还开放了一个网站科技语者-介绍页 (null.fit)

Verilog复习(四)| 组合逻辑

一位全加器结构描述: 数据流描述: 行为描述: 只要有事件发生(列表中任何 信号有变化),就执行begin…end 的语句 。 always的事件控制方式 边沿触发 always (posedge clk) // clk从低电平->高&#x…

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中,处理POST请求是一项常见任务,特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架,它提供了方便的工具来处理HTTP请求&a…

答辩PPT自述稿如何与幻灯片同步?笔灵AI一键生成功能解析

在我原本的认知里面,答辩PPT是要包含论文各个章节的,在答辩时需要方方面面都讲到的,什么摘要、文献综述、实证分析、研究结果样样不落。但是,这大错特错! 答辩PPT环节时长一般不超过5分钟,老师想要的答辩P…

Postman工具介绍与安装

一、Postman介绍 Postman 乃是一款对 HTTP 协议予以支持的接口调试及测试工具,其突出特性在于功能强大,并且使用简便、易用性良好。不管是开发人员开展接口调试工作,还是测试人员进行接口测试任务,Postman 均属于首选工具之一。 接…

面试八股之Redis篇2——redis分布式锁

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 🏃人生之义,在于追求,不在成败,勤通…

图书馆APP开发解决方案

uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言:pythonjavanode.jsphp均支持 运行软件…

blender 为世界环境添加纹理图像

1、打开世界环境配置项 2、点击颜色右侧的黄色小圆,选择环境纹理 3、打开一张天空图像 4、可以通过调整强度/力度,调整世界环境的亮度

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主 后端监听选择kde-…

QT-小项目:连接MY SQL数据库实现登录(下一章实现登录注册账号和忘记密码功能)

一、环境准备 1、下载MYSQL 64位,安装完成,制作简易数据库教程如下: MY SQL安装 2、QT 编译器使用 二、实现工程目录(基于上一章基础上) 三、源程序增加内容如下: login.cpp 增加头文件: #in…

MES系统与WMS集成方法(满分100学习资料)

导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…

头歌C语言数据结构(队列的应用)

第1关:循环队列 任务描述 本关任务:编写一个循环队列,实现入队、出队操作,判断队空、队满等特殊情况。 相关知识 为了完成本关任务,你需要掌握:1.循环队列定义,2.入队、出队的定义&#xff…

别的项目都有 awesome 仓库,RT-Thread 也要有!

awesome 仓库是 GitHub 上用于收集某个项目或者某个语言相关的优质内容的仓库,例如中间件、新闻资讯、网站等。 作为 RT-Thread 开发者,看到别的项目都有 awesome 仓库,我想 RT-Thread 也应该有! 于是,我创建一个 aw…

pyqt5将ui文件转为python文件

在pyqt5中使用 pyuic将ui文件转为py文件: 例如:将home.ui文件转为vio_detect.py文件,所需命令如下: pyuic5 -x home.ui -o vio_detect.py

Python彻底解决TypeError的问题

今天看到一个问题: TypeError: int() argument must be a string, a bytes-like object or a number, not list 代码是这样的: id int(os.path.split(imagePath)[1].split(.)[0]) 其实这个提示已经非常明显了,百度翻译过来就是&#xff1a…

废品回收微信小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

一款基于FastAdminThinkPHPUniApp开发的废品回收系统,适用废品回收站、再生资源回收公司上门回收使用的小程序。 一、FastAdmin框架特色功能及优势 模块化开发:控制器、模型、视图、JS一一对应,使用RequireJS进行插件机制,支持插…

一文弄懂 Linux 系统调用函数之 exec 函数族

目录 简介函数原型参数说明返回值函数区别使用示例采用参数列表传递参数,以 execl 为例采用参数数组传递参数,以 execv 为例调用 PATH 下可执行文件,以 execlp 为例使用新的环境变量给新进程,以 execle 为例 更多内容 简介 exec …

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像,图像必须是CV 8U或者CV 32F的单通道…