进程的相关命令,进程的创建、调度、消亡,进程相关函数接口

我要成为嵌入式高手之2月23日Linux高编第八天!!

学习笔记

进程

一、进程基本概念

程序:存放在外存中的一段数据组成的文件

进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡

二、进程相关命令

1、top

        动态查看当前系统的所有进程信息(根据CPU占用率排序)

        PID:唯一识别进程的ID号(>0)

        优先级:Linux系统中数值越低优先级越高(-20~+19),Windows相反

        进程状态:

                R:运行态/就绪态

                S:睡眠态/可唤醒等待

                D:不可唤醒等待态

                T:暂停态

                Z:僵尸态

                X:结束态

        q退出

2、nice

        优先级(NI)默认为0

        以指定优先级来运行进程

        示例:nice -n 优先级 要执行的进程任务

3、renice

        重新设定一个正在运行的进程的优先级

        示例:renice -n 优先级 进程PID

4、kill

        杀死指定的进程任务

        示例:kil -9 进程PID

5、killall

        杀死进程名对应的所有进程任务

        示例:killall -9 进程名

6、ps -ef

        查看当前时刻所有进程的信息

        PPID:父进程的ID号

        ps -ef | grep a.out

7、pstree

        查看进程树关系

8、ps -aux

        TTY 查看当前进程依赖于哪个终端

9、./a.out &

        将a.out放在后台执行

        fg 数字:将第几个程序放在前台执行

10、jobs

        查看一个终端下后台执行的任务

三、进程的创建

32bits的操作系统:

        有32位地址总线(4字节)

        一个进程在运行时,操作系统会为该进程分配0~4G虚拟内存空间,分为文本段、数据段、系统数据段;通过mmu内存映射单元,虚拟地址和物理地址完成映射。

1、操作系统管理的区域

        文本段:也成为文本区,存放代码和指令

        数据段:也成为数据区,可以细分为①字符串常量区②已初始化静态变量和全局变量区③未初始化静态变量和全局变量区

        系统数据段:堆区和栈区

            ①栈区:1)局部变量存放在栈区

         基本8mb:2)未经初始化为随机值

                           3)代码执行到变量定义时为变量开辟空间

                           4)当变量的作用域结束时回收空间

                           5)栈的增长方向,自高向低增长

            ②堆区:1)程序员手动管理(malloc)

                           2)malloc才能申请到堆区空间,free才能释放堆区空间

                           3)增长方向:自低向高

             ③数据区:1)静态变量、全局变量、字符串常量存放在数据区

                               2)编译时开辟空间,执行时将该空间加载到内存中

                               3)未经初始化为0值

                               4)程序结束回收数据区

             ④文本区:1)存放代码和指令

2、进程中虚拟内存地址和实际物理内存地址的关系

        1、0-4g虚拟内存空间只有一个

        2、实际物理地址中每个进程空间是独立的

        3、通过mmu内存映射单元,当一个进程执行时,将物理地址中的数据加载到虚拟地址中运行

四、进程的调度

1、常见的调度算法

        ①先来先执行,后来后执行

        ②高优先级调度

        ③时间片轮转调度算法

                时间片:CPU在一个任务中的运行时间成为一个时间片

        ④多级队列反馈的调度算法

        ⑤负载均衡的调度算法

2、宏观串行,微观并行

3、进程的状态:

        R        运行态(占用CPU资源)、就绪态(随时准备调度)

        S        睡眠态/可唤醒等待态

        D        不可唤醒等待态(不能被打断/切换的任务)

        T        暂停态(程序运行暂停住了,不占用CPU资源)

        Z        僵尸态(进程代码执行完了,空间未被回收)

        X        结束态(都执行完毕,空间也被回收完)

五、进程相关函数接口

1、fork

#include <sys/types.h>
#include <unistd.h>

pid_t fork(void);

功能:创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程称为父进程

返回值:

        成功:子进程返回0;父进程返回子进程的PID

        失败:失败返回-1;

父进程调用fork创建子进程,子进程拷贝父进程的文本段,数据段,系统数据段

2、getpid

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);

功能:获得调用这个进程的pid号

3、getppid

pid_t getppid(void);

功能:获得调用进程的父进程的pid

#include "head.h"int main(void)
{pid_t pid;pid = fork();if (pid == 0){printf("This is Child Process! PID:%d PPID:%d\n", getpid(), getppid());}else if (pid > 0){printf("This is Parent Process! PID:%d Child PID:%d\n", getpid(), pid);}printf("hello world!\n");while (1){}return 0;
}

练习:创建一个父进程的两个子进程,子进程中打印自己的pid和父进程的pid,父进程中打印自己的pid和两个子进程的pid

#include "head.h"int main(void)
{pid_t pid1;pid1 = fork();pid_t pid2;if (-1 == pid1){perror("fail to fork1");return -1;}if (pid1 == 0){printf("First Child Process! PID1:%d PPID:%d\n", getpid(), getppid());}else if (pid1 > 0){pid2 = fork();if (pid2 == -1){perror("fail to fork2");return -1;}if (pid2 == 0){printf("Second Child Process! PID2:%d PPID:%d\n", getpid(), getppid());}else if (pid2 > 0){printf("Parent Process! PID:%d PID1:%d PID2:%d\n", getpid(), pid1, pid2);}}while (1){}return 0;
}

 

4、exit

#include <stdlib.h>

void exit(int status);

功能:让进程结束、刷新缓存区

参数:status:进程结束的状态

返回值:缺省

exit在主函数中使用和return效果一致

#include "head.h"int main(void)
{printf("hello world!");exit(0);printf("how are you");return 0;
}

5、_exit

#include <unistd.h>

void _exit(int status);

功能:直接让进程结束,不刷新缓存区

参数:status进程结束的状态

返回值:缺省

#include "head.h"int main(void)
{printf("hello world!");_exit(0);printf("how are you");return 0;
}

六、进程的消亡 

1、僵尸进程:

        进程代码执行结束,但是空间代码没有被回收

2、如何避免产生僵尸态?

        1)让父进程先结束

        2)让父进程回收子进程空间

3、孤儿进程:

        进程的父进程先结束,此时该进程成为孤儿进程,此时被系统进程收养(1995)进程在结束时会被系统进程回收进程空间

4、wait

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *wstatus);

功能:回收子进程空间,会阻塞,有同步功能

参数:wstatus 存放子进程结束状态空间的首地址

返回值:成功返回回收到的子进程的pid,失败返回-1;

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

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

相关文章

虚拟列表【vue】等高虚拟列表/非等高虚拟列表

文章目录 1、等高虚拟列表2、非等高虚拟列表 1、等高虚拟列表 参考文章1 参考文章2 <!-- eslint-disable vue/multi-word-component-names --> <template><divclass"waterfall-wrapper"ref"waterfallWrapperRef"scroll"handleScro…

js使用import到本js文件中的函数时报错 Error [ERR_MODULE_NOT_FOUND]: Cannot find module

node:internal/process/esm_loader:97internalBinding(errors).triggerUncaughtException(^Error [ERR_MODULE_NOT_FOUND]: Cannot find module D:\桌面\Pagesizedetection\lib\screensize imported from D:\桌面\Pagesizedetection\index.js Did you mean to import ../lib/sc…

OpenLayers多要素旋转平移缩放及olext深度定制化

目录 1.前言2.olext官方示例3.重写Transform.js4.自定义样式5.自定义选中机制6.拓展思考6.1包围框的角度问题6.2不选中要素如何平移 7总结 1.前言 首先OpenLayers本身是支持旋转、平移、缩放的。olext 只是在 OpenLayers 的基础上又做了一层封装&#xff0c;使得看起来比较好看…

【k8s核心概念与专业术语】

k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑&#xff0c;分为无状态和有状态 无状态引用如下所示&#xff0c;如果一个nginx服务&#xff0c;删除后重新部署有可以访问&#xff0c;这个属于无状态&#xff0c;不涉及到数据存储。 有状态服务&#xff0c;如redis&a…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture06 Logistic回归

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture06 Logistic回归 课程网址 Pytorch深度学习实践 部分课件内容&#xff1a; import torchx_data torch.tensor([[1.0],[2.0],[3.0]]) y_data torch.tensor([[0.0],[0.0],[1.0]])class LogisticRegressionModel(…

Redis高性能原理

redis大家都知道拥有很高的性能&#xff0c;每秒可以支持上万个请求&#xff0c;这里探讨下它高性能的原理。单线程架构和io多路复用技术。 一&#xff0c;单线程架构 单线程架构指的是命令执行核心线程是单线程的&#xff0c;数据持久化、同步、异步删除是其他线程在跑的。re…

关于使用Mxnet GPU版本运行DeepAR报错解决方案

1.引言 我们经常使用GPU来训练和部署神经网络&#xff0c;因为与CPU相比&#xff0c;它提供了更多的计算能力。在本教程中&#xff0c;我们将介绍如何将GPU与MXNet GluonTS一起使用。 首先&#xff0c;确保您的机器中至少有一个Nvidia GPU&#xff0c;并正确安装了CUDA以及CUDN…

ES6内置对象 - Map

Map&#xff08;Map对象保存键值对&#xff0c;键值均不限制类型&#xff09; 特点&#xff1a; 有序&#xff08;Set集合是无序的&#xff09;&#xff1b;键值对&#xff08;键可以是任意类型&#xff09;&#xff1b;键名不能重复&#xff08;如果重复&#xff0c;则覆盖&…

第九节HarmonyOS 常用基础组件28-Select

1、描述 提供下拉选择菜单&#xff0c;可以让用户在多个选项之间选择。 2、接口 Select(options:Array<SelectOption>) 3、SelectOption对象说明 参数名 参数类型 必填 描述 value ResourceStr 是 下拉选项内容。 icon ResourceStr 否 下拉选项图标。 4…

c语言经典测试题3

1.题1 int a 248, b 4; int const *c 21; const int *d &a; int *const e &b; int const * const f &a; 请问下列表达式哪些会被编译器禁止&#xff1f; A: *c 32; B: *d 43 C: e&a D: f0x321f 我们来分析一下&#xff1a;const用来修饰变量是想其…

HTML5新婚、年会、各种聚会的现场抽奖活动(附源码)

文章目录 1.抽奖平台设计来源1.1 主界面效果1.2 抽奖效果1.3 中奖效果 2.效果和源码配置2.1 动态效果2.2 人员信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

智能运维都有哪些工作?智能运维哪些领域好

智能运维领域包含的各项工作内容包括&#xff1a; 数据采集与管理&#xff1a;该工作内容涉及从各种设备和系统中收集数据&#xff0c;如性能数据、日志数据等&#xff0c;并对这些数据进行清洗、转换和整合。数据采集与管理为后续的分析和决策提供了可靠的数据基础。 分析与诊…

函数栈帧的创建及销毁(超详解)

目录 1.预备知识 1.1内存区的划分 1.2认识相关寄存器和汇编指令 1.2.1寄存器 1.2.2相关汇编指令 2.测试前 2.1测试代码及环境 2.2 main函数也是被其他函数调用的 3.函数栈帧的创建 4.进入函数内部 5.形参与实参 6.call/jump add函数 7.函数栈帧的销毁 7.1保存…

Nginx -2

接着上文写 5.4.7 验证模块 需要输入用户名和密码 模块名称&#xff1a;ngx_http_auth_basic_module 访问控制基于模块 ngx_http_auth_basic_module 实现&#xff0c;可以通过匹配客户端资源进行限制 语法&#xff1a; Syntax: auth_basic string | off; Default: auth_ba…

【STC8A8K64D4开发板】第2-13讲:SPI总线的应用

第2-13讲&#xff1a;SPI总线的应用 学习目的了解SPI总线的结构、特点以及4种通信模式。掌握通过SPI读、写和擦除SPI Flash W25Q128的方法以及代码编写。掌握通过SPI读、写铁电存储器FM25CL64B的方法以及代码编写。 SPI总线原理 SPI是串行外设接口(Serial Peripheral Interfa…

2024-02-23(Spark)

1.RDD的数据是过程数据 RDD之间进行相互迭代计算&#xff08;Transaction的转换&#xff09;&#xff0c;当执行开启后&#xff0c;代表老RDD的消失 RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见了。 这个特性可以最大化…

力扣随笔之按奇偶排序数组(简单905)

思路1&#xff1a;根据双指针对撞指针的思路&#xff0c;定义一个左指针从数组前端开始遍历&#xff0c;定义一个右指针从后端开始遍历&#xff0c;这时候有四种情况 左奇右偶&#xff1a;这种情况需要将其位置交换&#xff0c;将偶数提前&#xff0c;奇数后移左奇右奇&#xf…

vue 导出,下载错误提示、blob与json数据转换

一、成功/失败 - 页面展示 失败 成功 二、成功/失败 - 接口请求/响应展示成功 2. 失败 三、解决 // 导出列表exportReceivedExcel() {if (this.tableCheckedValue) {this.form.ids this.tableCheckedValue.map(v > {return v.id || null})}this.loadingReceivedExcel …

xhell链接虚拟机失败,只需检查以下三步配置

配置一个静态ip地址 然后很重要的一步&#xff1a;修改起始地址&#xff0c;范围要包括你选定机器的地址。 成功啦

文件上传漏洞--Upload-labs--Pass10--双写绕过

一、什么是双写绕过 顾名思义&#xff0c;双写绕过就是双写文件后缀名来进行绕过&#xff0c;如&#xff1a;test.php 双写后为 test.pphphp。通常情况下双写绕过用于绕过源代码中的 str_ireplace()函数。 二、双写绕过原理 1、首先进行代码审计&#xff0c;源代码中有黑名单…