进程|详解~什么是进程 以及 进程创建原理和过程

1.什么是进程

进程是正在运行的程序。

UNIX标准将进程定义为:其中运行着一个或者多个线程的地址空间和这些线程所需要的系统资源(分配给线程线程共享系统资源)。

组成:进程由程序代码、数据、变量(占用着系统内存)、打开的文件(文件描述符)、环境组成。

2.进程的结构

PID:进程标识符——取值范围为2 到 32768(各系统最大值不一样)的正整数,进程被启动时,系统会按顺序将下一个未被使用的数字作为进程PID,转完一圈又会重新从2开始。

3.进程表——PCB

进程表,也称进程控制块(PCB),将当前加载到内存的所有进程的有关信息记录在一个表中,其中包括进程PID、进程的状态、命令字符串和其他一些ps命令输出的各类信息(进程描述信息和控制信息)。每个进程占用其中一个表项,PID是进程表的索引,操作系统通过PID对进程进行管理。

在典型的系统中包含如下关键字段:

3.1进程管理相关

包含三大类信息;

1)标识信息:用于唯一地标识一个进程,包括进程ID、父进程、进程组等。

2)现场信息:用于保留一个进程在运行时存放在处理器现场中的各种信息。它们用于在进程切换是保存处理器现场和恢复处理器现场。包括通用寄存器、PSW、堆栈指针、程序计数器等。

3)控制信息:用于管理和调度一个进程。包括进程开始时间、使用CPU的时间等。

3.2存储管理相关

1)正文段指针

2)数据段指针

3)堆栈段指针

3.3文件管理相关

根目录、工作目录、文件描述符、用户ID、组ID等

4.查看进程

1.ps命令可以查看所有者当前正在运行的程序、其他用户正在运行的程序、系统正在运行的所有程序。

UID:该进程执行的用户ID

PID:进程标识符

PPID:父进程标识符

C:cpu的占用率,形式是百分数

STIME:进程的启动时间

TTY:终端设备,显示进程是从哪一个终端启动的

TIME:进程目前为止占用cpu的时间(进程的执行时间)

CMD:启动进程时所用的命令 / 该进程的名称或对应的路径

2.ps常用组合命令

ps -ef|grep 进程名称

 同时运行多个进程可以将进程放在后台运行     

./b& ./a&

5.进程创建原理

Lnux上创建新进程的方式:fork()+exec();

使用写时拷贝技术,复制bash的一部分,然后再进行替换。

bash:命令解释器,允许用户向操作系统输入需要执行的命令。

打开一个终端,会默认运行bash进程,直到退出终端bash终止。(注:同一个程序,每次运行起来的PID都不会相同,因为PID唯一标识进程)

不同的终端,默认的bash不同(PID不相同)

6.进程替换exec系列

/*man execl看帮助手册*/
//path:新替换的程序的路径名称
//arg:传给新程序主函数的第一个参数,一般为“程序的名字”,还可以将替换的新程序改名字,同样会替换成功
//arg后面是剩余参数列表,参数个数可变,必须以空指针作为最后一个参数以此来结尾
/*
...为可变参数,例如:printf函数有可变参数,printf("%d%d%s",m,p,q)参数可变
*/
int execl(const char* path, const char * arg,...);
int execlp(const char* file, const char * arg,...);//在环境变量PATH指定的路径里面搜索;
int execle(const char* path, const char * arg,...,char* const envp[]);int execv(const char * path, char* const argv[]);//把参数都放在了一个数组中
int execvp(const char * file, char* const argv[]);
int execve(const char * path, char* const argv[],char* const envp[]); //系统调用//前五个是库函数,最后一个是系统调用,所以本质上:前5个都是通过底层调用第六个系统调用实现的。

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

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

相关文章

爬虫IP时效问题:优化爬虫IP使用效果实用技巧

目录 1. 使用稳定的代理IP服务提供商: 2. 定期检测代理IP的可用性: 3. 配置合理的代理IP切换策略: 4. 使用代理IP池: 5. 考虑代理IP的地理位置和速度: 6. 设置合理的请求间隔和并发量: 总结 在爬虫过…

Springboot 实践(1)MyEclipse2019创建maven工程

项目讲解步骤,基于本机已经正确安装Java 1.8.0及MyEclipse2019的基础之上,Java及MyEclipse的安装,请参考其他相关文档,Springboot 实践文稿不再赘述。项目创建讲解马上开始。 一、首先打开MyEclipse2019,进入工作空间选…

内网穿透-外远程连接中的RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

SpringBoot整合Shiro实现登录认证,鉴权授权

文章目录 前言一、shiro简介二、环境搭建2.1.数据库2.1.1user用户表2.1.2user_role用户角色关系表2.1.3role角色表2.1.4role_permission角色权限关系表2.1.5permission权限表 2.2导坐标2.3实体类2.3.1User2.3.2Role2.3.3Permission 2.4MVC三层2.4.1User2.4.1.1mapper层2.4.1.2s…

将单个训练数据集文件拆分为:image文件和label文件(pytorch学习+蚂蚁蜜蜂数据集)

蚂蚁蜜蜂分类数据集下载链接:https://download.pytorch.org/tutorial/hymenoptera_data.zip 要实现如图操作: 将ants分为ants_image和ants_label 将bees分成bees_image和bees_label 创建ants_label和bees_label,并且以图片名作为txt文件的…

高光谱 | 矿物识别和分类标签数据制作、农作物病虫害数据分类、土壤有机质含量回归与制图、木材含水量评估和制图

本课程提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本课程涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,…

【数据结构OJ题】链表的回文结构

原题链接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 在做这道…

Swagger

目录 简介 使用方式: 常用注解 简介 使用Swagger你只需要按照他的规范去定义接口及接口相关信息再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接口文档,以及在线接口调试页面等等。 官网:https://swagger…

214、仿真-基于51单片机温度甲醛一氧化碳(co)电机净化报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

tsconfig.json和jsconfig.json配置

{// 编译选项"compilerOptions": {// 生成代码的语言版本:将我们写的 TS 代码编译成哪个版本的 JS 代码// 命令行: tsc --target es5 11-测试TS配置文件.ts"target": "es5",// 指定要包含在编译中的 library"lib&quo…

Vue-7.命令创建Vue项目

使用预设默认配置创建Vue项目 创建一个简单的 Vue 项目需要使用 Vue CLI(命令行界面)。Vue CLI 是一个用于快速构建 Vue.js 项目的工具,它可以帮助你设置项目的基本结构、配置以及开发环境。 以下是创建一个简单的 Vue 项目的步骤&#xff…

NodeJs导出PDF

(优于别人,并不高贵,真正的高贵应该是优于过去的自己。——海明威) 场景 根据订单参数生成账单PDF 结果 示例代码 /* eslint-disable no-unused-vars */ /* eslint-disable no-undef */ /* eslint-disable complexity */ const…