嵌入式学习第二十天!(进程)

进程基本概念:

1. 进程:

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

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

2. 进程相关命令:

    1. top: 

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

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

        优先级:Linux系统中数据高,优先级高(-20 到 19)Windows系统中数值高,优先级高

        进程状态:

            运行态/就绪态

            S  睡眠态/可唤醒等状态

            D  不可唤醒等待态

            T  暂停态

            僵尸态

            X  结束态

            q  退出

  2. nice/renice:

    nice:以指定优先级来运行进程

    示例:

nice -n 优先级 要执行的集成任务

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

    示例:

renice -n 优先级 进程PID

  3. kill/killall:

    kill:杀死指定的进程任务

    示例:

kill -9 进程PID

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

    示例:

killall -9 进程名

  4. ps -ef:

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

    PPID:父进程的ID号

    PID:子进程的ID号

ps -ef | grep a.out

  5. pstree:

    查看进程树关系

  6. ps -aux:

    查看当前时刻的进程信息

  7. ../a.out &

    将a.out任务放在后台执行

  8. jobs:

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

  9. fg 编号:

    将后台任务放到前台执行

3. 进程的创建:

  32bits操作系统:

  一个进程在运行时,操作系统会为该进程分配 0-4G 虚拟内存空间,分为文本段、数据段、系统数据段

  文本段:

    也称为文本区,存放代码和指令

  数据段:

    也称为数据区,可以细分为:

        1. 字符串常量区

        2. 为初始化全局变量/静态变量

        3. 已初始化全局变量/静态变量

  系统数据段:

    包含堆区栈区

4. 进程中虚拟地址和物理地址的关系

  1. 0 - 4G虚拟内存空间只有一个

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

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

5. 进程的调度:

  1. 常见的调度算法:

    1. 先来先执行、后来后执行

    2. 高优先级调度算法

    3. 时间片轮转调度算法

    4. 多级队列后反馈调度算法

    5. 负载均衡调度算法

    时间片:

        1. CPU在一个任务中的运行时间称为一个时间片

  2. 宏观并行,微观串行

  3. 进程的状态:

    R  运行态、就绪态 
    睡眠态/可唤醒等待态 
    D  不可唤醒等待态 
    T  暂停态
    Z  僵尸态
    X  结束态  

6. 进程相关函数接口:

  1. 进程的创建

    1. fork:
pid_t fork(void);

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

    参数:

        void 缺省

    返回值:

        成功子进程返回0 
        父进程返回子进程的PID 
        失败返回-1

    getpid:
pid_t getpid(void);

        功能:获得调用进程的PID

    getppid:
pid_t getppid(void);

        功能:获得调用进程的PPID

    练习:

        创建一个父进程的2个子进程,子进程中打印自己的PID和父进程的PID,父进程中打印自己的PID和两个子进程的PID

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main(void)
{pid_t pid1;pid_t pid2;pid1 = fork();if(pid1 == -1){perror("fail to fork");return -1;}if(pid1 == 0){printf("chird process1: pid:%d, ppid:%d\n", getpid(), getppid());}else if(pid1 > 0){pid2 = fork();if(pid2 == -1){perror("fail to fork");return -1;}if(pid2 == 0){printf("child process2: pid:%d, ppid:%d\n", getpid(), getppid());}else if(pid2 > 0){printf("parent process: pid%d, child pid1:%d, child pid2:%d\n", getpid(), pid1, pid2);}}while(1){}return 0;
}

    2. exit/_exit:

      1. exit:
void exit(int status);

        功能:

            让进程结束

        参数:

            status:进程结束的状态

        返回值:

            缺省

        exit在主函数中使用和return效果一致
        exit会刷新缓存区

    2.  _exit:
void _exit(int status);

        功能:

            让进程直接结束

        参数:

            status:进程结束的状态

        返回值:

            缺省

7. 进程的消亡:

  1. 僵尸进程:

    进程代码执行结束,空间没有被回收,称为僵尸进程

  2. 如何避免产生僵尸进程?

    1. 让父进程先结束

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

  3. 孤儿进程:

    进程的父进程先结束,此时该进程称为孤儿进程,被系统进程收养,进程再结束时,会被系统进进程空间

8. wait:

pid_t wait(int *wstatus);

    功能:回收子进程空间

    参数:

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

    返回值:

        成功返回回收到的子进程PID
        失败返回-1

    1. wait函数具有阻塞功能

    2. wait函数具有同步功能

WIFEXITED(wstatus)    //进程是否正常退出 WEXITSTATUS(wstatus)  //进程结束状态值WIFSIGNALED(wstatus)  //进程是否被信号杀死WTERMSIG(wstatus)     //获得杀死进程的信号编号

  作业:

    1.创建一个进程的9个子进程,子进程中打印自己的PID和父进程的PID,父进程中打印自己的PID和9个子进程的PID

#include "head.h"int main(void)
{pid_t pid[9] = {0};int i = 0;int stat = 0;for(i = 0; i < 9; i++){if(i == 0){pid[i] = fork();if(pid[i] == -1){perror("fail to fork");return -1;}}if(pid[i] == 0){printf("child pid[%d]:%d, ppid:%d\n", i, getpid(), getppid());exit(10);}else if(pid[i] > 0){pid[i+1] = fork();if(pid[i+1] == -1){perror("fail to fork");return -1;}wait(&stat);}if(i == 8 && pid[i+1] > 0){printf("parent pid: %d, ", getpid());for(int j = 0; j < 9; j++){if(pid[j] != 0)printf("child pid[%d]:%d ", j, pid[j]);if(j == 3){printf("\n");}}printf("\n");printf("\n");}}return 0;
}

        

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

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

相关文章

简单学习语音唤醒

目录 一、总体介绍 二、来到讯飞开放平台 ​三、代码修改 1.ivw_sample.cpp代码修改 &#xff08;1&#xff09;库的导入 &#xff08;2&#xff09;宏定义​编辑 &#xff08;3&#xff09;定义 &#xff08;4&#xff09;修改OnOutput​编辑 &#xff08;5&#xff0…

C++多态的原理

目录 函数虚表 多态原理 普通调用和多态调用的区别 函数虚表 含有虚函数的类&#xff0c;都会有一个函数虚表指针&#xff0c;指向函数虚表。 class Base{public:virtual void Func1(){cout << "Func1()" << endl;}private:int _b 1;}; _vfptr就是函…

如何在C++中实现文件操作

大家好&#xff0c;今天给大家介绍如何在C中实现文件操作&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在C中&#xff0c;实现文件操作主要涉及到 <fstream> 库&#xf…

批量删除传参那些事

接口参数&#xff1a; public Object batchDeleteUsers(RequestBody List userIds) 工具提示传参&#xff1a; { “userIds”: [] } 错误&#xff01;&#xff01;&#xff01;讨逆猴子 报错&#xff1a;JSON parse error: Cannot deserialize value of type java.util.ArrayL…

C++从入门到精通 第十七章(终极案例)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

Yolov8有效涨点:YOLOv8-AM,添加多种注意力模块提高检测精度,含代码,超详细

前言 2023 年&#xff0c;Ultralytics 推出了最新版本的 YOLO 模型。注意力机制是提高模型性能最热门的方法之一。 本次介绍的是YOLOv8-AM&#xff0c;它将注意力机制融入到原始的YOLOv8架构中。具体来说&#xff0c;我们分别采用四个注意力模块&#xff1a;卷积块注意力模块…

Django定时任务之django_apscheduler使用

Django定时任务之django_apscheduler使用 今天在写一个任务需求时需要用到定时任务来做一部分数据处理与优化&#xff0c;于是在了解完现有方法&#xff0c;结合自己需求决定使用django_apscheduler&#xff0c;记录一下过程&#xff0c;有几篇值得参考的文章放在结尾&#xf…

大数据构建知识图谱:从技术到实战的完整指南

文章目录 大数据构建知识图谱&#xff1a;从技术到实战的完整指南一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图…

Java基础常见八股文学习总结1

Java基础常见八股文学习总结1 SPI SPI 即 Service Provider Interface &#xff0c;字面意思就是&#xff1a;“服务提供者的接口”&#xff0c;我的理解是&#xff1a;专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。SPI 将服务接口和具体的服务实现分离开来…

C语言中的数据结构选择与实现

大家好&#xff0c;今天给大家介绍C语言中的数据结构选择与实现&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 一、引言 在C语言中&#xff0c;数据结构是实现高效算法的关键。…

一个更好的IP工具箱MyIP

什么是 MyIP &#xff1f; MyIP 是一个完全开源的 IP 信息查看器&#xff0c;可以轻松检查你的 IP&#xff0c;IP 地理位置&#xff0c;检查 DNS 泄漏&#xff0c;检查 WebRTC 连接&#xff0c;速度测试&#xff0c;ping 测试&#xff0c;MTR 测试&#xff0c;检查网站可用性等…

docker 安装mysql8 实现互为主从

目录结构 先按照这个目录结构创建。 mysql.conf 配置&#xff0c;mysql的基础可以在此添加 mysql配置 mysql-master下conf配置 [mysqld] # 设置服务器唯一标识号 server-id1 # 启用二进制日志 log-binmaster-bin # 指定需要复制的数据库 binlog-do-dbtest_db # 指定二进制日…

软件游戏显示d3dx9_42.dll丢失的5种解决方法,快速解决dll问题

当计算机系统中d3dx9_42.dll文件丢失时&#xff0c;可能会引发一系列运行问题和功能异常&#xff0c;具体表现形式多样且影响范围较广。首先&#xff0c;对于依赖于DirectX 9.0c版本的各类应用程序&#xff0c;尤其是部分经典的老款游戏&#xff0c;由于d3dx9_42.dll是其中不可…

【Python】OpenCV-图片差异检测与标注

图片差异检测与标注 在图像处理领域中&#xff0c;检测两张图片之间的差异是一项重要的任务。本文将介绍一个使用OpenCV库进行图片差异检测的简单示例代码&#xff0c;并详细注释每个步骤。 1. 引言 图片差异检测是在两张图片之间寻找差异点或区域的过程。这项技术可用于监测…

顺序表知识点——顺序表的增删查改

目录 准备文件 创建顺序表蓝图 顺序表初始化函数接口 顺序表的销毁函数接口 顺序表的打印函数接口 顺序表的插入函数接口 顺序表的删除函数接口 从本节开始&#xff0c; 复习数据结构。 空间复杂度还有时间复杂度之后利用例题学习。 这节先学习顺序表的增删查改。 首…

并发编程基础

为什么开发中需要并发编程&#xff1f; 加快响应用户的时间使你的代码模块化、异步化、简单化充分利用CPU资源 基础概念 进程和线程 进程 我们常听说的应用程序&#xff0c;由指令和数据组成。当我们不运行应用程序时&#xff0c;这些应用程序就是放在磁盘上的二进制的代码…

【MATLAB】mlptdenoise信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 展示出图效果 1 mlptdenoise分解算法 MLPT denoise&#xff08;Maximum Likelihood Parameter-Tuned Denoise&#xff09;是一种基于小波变换的信号分解算法&#xff0c;它可以将信号分解为多个具有不同频率特性的小波分…

Threejs 实现3D影像地图,Json地图,地图下钻

1.使用threejs实现3D影像地图效果&#xff0c;整体效果看起来还可以&#xff0c;底层抽象了基类&#xff0c;实现了通用&#xff0c;对任意省份&#xff0c;城市都可以只替换数据&#xff0c;即可轻松实现效果。 效果如下&#xff1a; 链接https://www.bilibili.com/video/BV1…

【人工智能高频面试题--基本篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;人工智能高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 人工智能高频面试题--基本篇 1.深度学习和过往的神经网络训练方法有什么区别&#xff1f;列举…

Panalog大数据日志审计系统libres_syn_delete.php命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1、产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校…