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

进程基本概念:

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://xiahunao.cn/news/2809108.html

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

相关文章

HarmonyOS—添加/删除Module

Module是应用/服务的基本功能单元&#xff0c;包含了源代码、资源文件、第三方库及应用/服务配置文件&#xff0c;每一个Module都可以独立进行编译和运行。一个HarmonyOS应用/服务通常会包含一个或多个Module&#xff0c;因此&#xff0c;可以在工程中创建多个Module&#xff0…

docker部署grafana+zabbix监控

1. grafana介绍 Grafana 是一个开源的数据可视化工具&#xff0c;它可以帮助用户将数据源中的数据进行图形化展示和实时监控&#xff0c;以便于用户能够更加直观地理解数据。Grafana 支持多种数据源&#xff0c;包括 Graphite、Elasticsearch、InfluxDB、Prometheus 等&#x…

SpringBoot -【BeanFactory】基础使用及应用场景

1.介绍 在 Spring 框架中&#xff0c;BeanFactory 是 Spring IoC 容器的核心接口&#xff0c;负责管理 bean 的创建、配置和装配。它是 Spring IoC 容器的基础。BeanFactory 接口定义了一系列方法&#xff0c;用于管理和访问容器中的 bean 对象。 BeanFactoryAware 用于在 Sp…

相机图像质量研究(39)常见问题总结:编解码对成像的影响--运动模糊

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

智慧医疗新篇章:山海鲸可视化引领行业变革

随着科技的不断发展&#xff0c;智慧医疗已经成为医疗行业的新趋势。山海鲸可视化以其独特的视角和前沿的技术&#xff0c;为智慧医疗提供了全方位的解决方案。其强大的数据可视化能力&#xff0c;使得医疗数据更加直观、易于理解。无论是病例分析、手术模拟&#xff0c;还是患…

【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台)

目录 前言1 安装依赖2 安装MySQL3 安装redis4 编译ZLMediaKit代码及依赖下载编译运行&#xff08;如果要运行wvp整个项目&#xff0c;这步可以先不执行&#xff09; 5 编译wvp-pro下载源码&#xff08;建议从github上下载&#xff0c;gitee上维护有时候不是很同步&#xff09;编…

半导体物理基础-笔记(续)

源内容参考&#xff1a;https://www.bilibili.com/video/BV11U4y1k7zn/?spm_id_from333.337.search-card.all.click&vd_source61654d4a6e8d7941436149dd99026962 掺杂半导体的费米能级与温度及杂质浓度的关系图 在温度一定的条件下&#xff0c;施主杂质浓度越高&#xff0…

20210505-20240223 CSDN 1024天 创作纪念日

作为一个小白&#xff0c;我没想到自己在不知不觉间就走过了如此长久的一段旅程。恍然间&#xff0c;三年多的时光已经过去了。 机缘 我首次写博客是为了记录日常&#xff0c;分享生活。 在这1024天里&#xff0c;我做了一些记录和分享&#xff0c;特别是遇到一些有趣的、值得…

数据分析在企业培训系统中的关键作用与优势

数据分析在企业培训系统中扮演着关键的角色&#xff0c;它不仅能够帮助企业更好地了解员工培训的需求和效果&#xff0c;还能够提供有针对性的教育方案和提高培训效果。 数据分析可以帮助企业准确把握员工培训需求。通过收集和分析员工的培训需求调查和反馈信息&#xff0c;企…

2024.02.23作业

1. 尝试处理普通信号 #include "test.h"#define MAXSIZE 128void handler(int signo) {if (SIGINT signo){printf("用户按下了 ctrl c 键\n");} }int main(int argc, char const *argv[]) {if (signal(SIGINT, SIG_IGN) SIG_ERR){perror("signal …

Navicat Premium连接Django项目的数据库

首先启动django项目&#xff0c;生成数据库文件 安装依赖 cd backend&#xff08;实际后端的路径&#xff09; pip install -r dev_requirements.txt&#xff08;安装环境&#xff09; 初始化系统 python manage.py migrate&#xff08;生成迁移数据库&#xff09; 运行 python…

Spring 容器、核心容器总结

目录 创建容器获取 bean容器类层次结构图核心容器总结容器相关bean 相关依赖注入相关 创建容器 方式一&#xff1a; 类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml");方式二&#xff1a; 文件路径加载配…

Python爬虫实战:图片爬取与保存

引言&#xff1a; 在本文中&#xff0c;我们将学习如何使用Python创建一个简单的图片爬虫。 我们将利用requests库来发送HTTP请求&#xff0c;BeautifulSoup库来解析HTML页面&#xff0c;以及os和shutil库来下载和保存图片。通过这个教程&#xff0c;你将学会如何爬取网…

stable-diffusion-webui安装sd-wav2lip-uhq

按照 https://github.com/numz/sd-wav2lip-uhq/blob/main/README_CN.md 安装即可。 git : https://github.com/numz/sd-wav2lip-uhq.git

在openEuler中通过KVM可视化安装华为FusionCompute的VRM节点

一、说明 本文是华为FusionCompute云平台配置的延续&#xff0c;是在CNA&#xff08;ComputingNode Agent&#xff0c;计算节点代理&#xff09;主机安装配置完成后&#xff0c;详细安装VRM&#xff08;Virtual Resource Manager&#xff0c;虚拟资源管理器&#xff09;节点的…

BlueTooth蓝牙的最新演进版本:BT5.4

现在很多笔记本laptop、电视TV、手机Phone,甚至车机IVI都有了WiFi和蓝牙BT的接入功能。 大约每隔2-3年,就会有一个新版本的蓝牙问世。最新的蓝牙5.4承诺提供比5.3版本更可靠的连接和更高的能效。蓝牙5.4是最新的蓝牙版本,为数千个低能耗节点带来了更高的安全性和高效的连接…

设计推特(Leetcode355)

例题&#xff1a; https://leetcode.cn/problems/design-twitter/ 分析&#xff1a; 推特其实类似于微博&#xff0c;在微博中可以发送文章。 求解这类题目&#xff0c;我们需要根据题目需求&#xff0c;利用面向对象的思想&#xff0c;先对需求做一个抽象&#xff0c;看看能…

【初始RabbitMQ】发布订阅的实现

发布确认原理 生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c;所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消息的…

力扣随笔之移除元素(简单27)

思路&#xff1a;定义一个指针left&#xff0c;使该指针及该指针左边的数全部都不等于val&#xff0c;定义一个遍历指针i&#xff0c;若nums[i] val&#xff0c;则i自加&#xff0c;若nums[i] ! val&#xff0c;则将left&#xff0c;并将nums[i]的值赋给nums[left]&#xff0c…

手撕Transformer(三)| 基础Transformer整体结构代码解析,从宏观到微观

文章目录 1 理解重点2 背景介绍 假设3 过程及重要组件3.1 嵌入层和加入位置编码3.2 编码器 Encoder3.3.1 EncoderLayer编码层3.3.2 LayerNorm归一化层 3.3 解码器 Decoder3.4 整合连接Encoder和Decoder 4 完整可运行代码 1 理解重点 在之前一节我们已经介绍了Transformer的位置…