嵌入式学习——Linux高级编程复习(进程)——day39

1. 进程

        进程是计算机科学中的一个核心概念,它是操作系统进行资源分配和调度的基本单位,代表了一个正在执行中的程序实例。当一个程序被加载到内存并开始执行时,它就变成了一个进程。

        1. 程序:存放在外存中的一段代码的集合

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

2. 进程的创建(创建了一片虚拟内存空间、多个进程共用同一片虚拟内存空间,进程空间在实际的物理地址是独立的)

2.1 进程被执行后,操作系统开辟进程空间,并分为如下区域

        1. 文本段

        2. 数据段

        3. 系统数据段——堆区、栈区

        4. 内核(PCB(进程控制块)存在于操作系统内核中。它是内核用来管理和控制进程的关键数据结构)

补充:PCB块概念

        进程控制块(PCB,Process Control Block)是操作系统中用于描述和控制进程状态和属性的一个重要数据结构。每个活动的进程在操作系统中都有一个对应的PCB,它是进程存在的唯一标识。PCB包含了操作系统管理和调度进程所需的所有关键信息,其具体内容可能因操作系统的设计而异,但通常包括以下基本信息:

  1. 进程标识符(PID):唯一标识每个进程的编号。
  2. 进程状态:当前进程的状态,如就绪、运行、阻塞等
  3. 程序计数器(PC):保存进程下一条将要执行的指令的地址。
  4. 处理器状态寄存器:包括通用寄存器、指令寄存器等,用于保存进程执行时的上下文信息。
  5. 内存管理信息:如基址、界限寄存器值、页表指针等,用于内存访问和管理。
  6. 文件描述符表或打开文件列表:记录了进程当前打开的文件及其状态。
  7. 进程优先级:决定进程调度的优先级。
  8. CPU调度信息:如进程的调度队列指针、时间片剩余量等。
  9. 记账信息:如进程创建时间、CPU使用时间等统计信息。
  10. I/O状态信息:包括I/O请求队列、已完成和待处理的I/O操作等。
  11. 信号处理信息:与进程相关的信号处理规则和屏蔽位。

2.2 内存映射

        1. 进程空间是独立的(物理地址), 进程是操作系统资源分配的最小单元

        2. 所有进程所使用的虚拟地址空间都为同一空间(虚拟地址)

        3. 每个进程运行起来后,操作系统都会分配一个内存空间(虚拟地址)

3. 进程调度

3.1 运行方式

        宏观并行,微观串行

        1.宏观:大角度 用户 
        2.微观:小角度 CPU 

3.2 进程状态(进程在调度过程中频繁保存现场恢复现场,使得进程拥有了一些不同的状态)

    1.就绪态、运行态    R
    2.可唤醒等待态        S(sleep、scanf)        睡眠态
    3.不可唤醒等待态     D(加载驱动)        
    4.暂停态                    T                
    5.僵尸态                    Z(代码运行完了,空间还在,需要回收空间)        
    6.结束态                    X(空间被回收的一瞬间)

3.3 进程调度算法(完成从一个进程切换到下一个进程去执行相应的任务)

        1.先来先执行,后来后执行
        2.高优先级调度算法
        3.时间片轮转调度算法:CPU在一个任务中执行的一小段时间成为一个时间片
        4.多级队列反馈调度算法
        5.负载均衡调度算法

4. 进程相关命令

4.1 top

        根据CPU占用率查看进程信息、PID:进程ID号、PPID:父进程ID号 、q退出

4.2 ps -ef

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

4.3 pstree

        查看进程关系(关系树、类似于族谱)

4.4 ps -aux (ps -aux | less)

        查看进程状态信息

4.5 kill

        kill     -9  进程PID(9强制关闭)
        killall -9  进程名 (杀死所有与进程名相关的进程)
        killall -9  bash(关闭所有)

5. 进程相关函数接口

5.1 fork

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.2 getpid

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.3 getppid

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.4 exit

        1. 定义

        2. 功能

                让进程结束(刷新缓冲区)

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.5 _exit

        1. 定义

        2. 功能

                立即结束调用该函数的进程(不刷新缓冲区)

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.6 wait(阻塞回收) 

        1. 定义

        2. 功能

                阻塞回收子进程空间(随机回收)

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

                wait具有阻塞功能


                WIFEXITED(wstatus)——1正常退出、0异常退出
                检测子进程是否正常退出
                
                WEXITSTATUS(wstatus)——返回子进程的ID号
                检测子进程退出的值
        
                WIFSIGNALED(wstatus)——1子进程被信号杀死、0子进程没被信号杀死
                检测子进程是否被信号杀死
        
                WTERMSIG(wstatus)——返回杀死进程的信号数
                检测子进程被几号信号杀死

5.7  waitpid(非阻塞回收)

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.8 getenv

        1. 定义

        2. 功能

                获得环境变量name对应的数值

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.9  setenv

        1. 定义

        2. 功能

                添加或者修改环境变量的值

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

5.10 system 

        1. 定义

        2. 功能

                加载一条shell命令

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6. exec函数族

        利用进程空间执行另一段代码

        用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),
子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的
用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建
新进程,所以调用exec前后该进程的id并未改变。

      l:执行另一段代码参数以列表形式传递
      v:执行另一段代码参数以指针数组形式传递
      p:执行另一段代码文件在系统环境变量PATH对应的路径下查找
      e:执行另一段代码,更新环境变量

6.1 execl

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.2 execlp

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.3 execle

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.4 execv

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.5 execvp

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

6.6 execvpe

        1. 定义

        2. 功能

        3. 参数

        4. 返回值

        5. 示例程序

        6. 注意

7. 进程消亡

7.1 僵尸进程

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

        当子进程(child process)先于父进程(parent process)退出,但是父进程没有调用wait/waitpid回收子进程的资源,则子进程变成僵尸进程。

7.2 如何避免产生僵尸进程

        1.让父进程先结束,子进程会成为孤儿进程,被系统进程收养,子进程结束系统进程
          回收子进程空间
        2.子进程结束,父进程回收子进程空间,即可避免产生僵尸进程

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

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

相关文章

牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】

题目 题目链接: https://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8 https://www.lintcode.com/problem/2 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改&#xff…

Python 很好用的爬虫框架:Scrapy:

了解Scrapy 爬虫框架的工作流程&#xff1a; 在scrapy中&#xff0c; 具体工作流程是这样的&#xff1a; 首先第一步 当爬虫引擎<engine>启动后&#xff0c; 引擎会到 spider 中获取 start_url<起始url> 然后将其封装为一个request对象&#xff0c; 交给调度器<…

Elastic Search 8.14:更快且更具成本效益的向量搜索,使用 retrievers 和重新排序提升相关性,RAG 和开发工具

作者&#xff1a;来自 Elastic Yaru Lin, Ranjana Devaji 我们致力于突破搜索开发的界限&#xff0c;并专注于为搜索构建者提供强大的工具。通过我们的最新更新&#xff0c;Elastic 对于处理以向量表示的大量数据的客户来说变得更加强大。这些增强功能保证了更快的速度、降低的…

Activity->Activity中动态添加Fragment->add和replace方式添加的区别

XML文件 Activity布局文件R.layout.activity_main <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/root_ll"android:orientation"v…

Linux本地搭建DataEase并发布公网远程访问进行数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

【RAG入门教程01】Langchian框架 v0.2介绍

LangChain 是一个开源框架&#xff0c;旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…

数据库之PostgreSQL详解

一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议&#xff0c;这个协议基本和MIT开源协议一样&#xff0c;说人话&#xff0c;就是你可以对PostgreSQL进行一些封装&a…

如何在本地和远程删除 Git 分支

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;目前是武汉城市开发者社区主理人 擅长.net、C、python开发&#xff0c; 如果遇…

SpringBoot之Mybatis-plus实战

文章目录 MybatisPlus 介绍一、MyBatisPlus 集成步骤第一步、引入依赖第二步、定义mapper 二、注解TableNameTableldTableField 加解密实现步骤 在SpringBoot项目中使用Mybatis-plus&#xff0c;记录下来&#xff0c;方便备查。 MybatisPlus 介绍 为简化开发而生&#xff0c;官…

CSAPP Lab01——Data Lab完成思路

陪你把想念的酸拥抱成温暖 陪你把彷徨写出情节来 未来多漫长再漫长还有期待 陪伴你 一直到 故事给说完 ——陪你度过漫长岁月 完整代码见&#xff1a;CSAPP/datalab-handout at main SnowLegend-star/CSAPP (github.com) 01 bitXor 这道题是用~和&计算x^y。 异或是两个…

红黑树的介绍与实现

前言 前面我们介绍了AVL树&#xff0c;AVL树是一棵非常自律的树&#xff0c;有着严格的高度可控制&#xff01;但是正它的自律给他带来了另一个问题&#xff0c;即虽然他的查找效率很高&#xff0c;但是插入和删除由于旋转而导致效率没有那么高。我们上一期的结尾说过经常修改…

C语言:双链表

一、什么是双链表&#xff1f; 双链表&#xff0c;顾名思义&#xff0c;是一种每个节点都包含两个链接的链表&#xff1a;一个指向下一个节点&#xff0c;另一个指向前一个节点。这种结构使得双链表在遍历、插入和删除操作上都表现出色。与单链表相比&#xff0c;双链表不仅可以…

【机器学习】【遗传算法】【项目实战】药品分拣的优化策略【附Python源码】

仅供学习、参考使用 一、遗传算法简介 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是机器学习领域中常见的一类算法&#xff0c;其基本思想可以用下述流程图简要表示&#xff1a; &#xff08;图参考论文&#xff1a;Optimization of Worker Scheduling at Logi…

DVB-S系统发射端Matlab仿真及FPGA实现

DVB标准 Digital Video Broadcasting&#xff08;数字视频广播&#xff09;是一个完整的数字电视解决方案&#xff0c;其中包括DVB-C&#xff08;数字电视有线传输标准&#xff09;&#xff0c; DVB-T&#xff08;数字电视地面传输标准&#xff09;&#xff0c;DVB-S&#xff…

正确理解iOS中的同步锁

在 iOS 开发中&#xff0c;同步锁&#xff08;synchronized lock&#xff09;是一种用于管理多线程访问共享资源的机制&#xff0c;而不是某一种特定类型的锁。它涵盖了多种具体实现和技术&#xff0c;用于确保同一时间只有一个线程能够访问某个共享资源&#xff0c;从而避免数…

探地雷达正演模拟,基于时域有限差分方法,一

声明&#xff1a;本博客中的公式均是在Word中使用AxMath写好后截图使用的&#xff0c;欢迎引用&#xff0c;但请标注来源。 本系列会有四篇博客&#xff1a; 第一篇内容&#xff1a; 1、基础知识掌握 2、Maxwell方法差分求解原理 第二篇内容&#xff1a; 1、基于C的TE波波…

docker——基础知识

简介 一、什么是虚拟化和容器化 ​ 实体计算机叫做物理机&#xff0c;又时也称为寄主机&#xff1b; ​ 虚拟化&#xff1a;将一台计算机虚拟化为多态逻辑计算机&#xff1b; ​ 容器化&#xff1a;一种虚拟化技术&#xff0c;操作系统的虚拟化&#xff1b;将用户空间软件实…

mongodb总概

一、mongodb概述 mongodb是最流行的nosql数据库&#xff0c;由C语言编写。其功能非常丰富&#xff0c;包括: 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;格式自由&#xff0c;数据格式不固定&#xff0c;生产环境下修改结构都可以不影响程序运行;强大的查询语句…

2 程序的灵魂—算法-2.2 简单算法举例-【例 2.3】

【例 2.3】判定 2000 — 2500 年中的每一年是否闰年&#xff0c;将结果输出。 润年的条件: 1. 能被 4 整除&#xff0c;但不能被 100 整除的年份&#xff1b; 2. 能被 100 整除&#xff0c;又能被 400 整除的年份&#xff1b; 设 y 为被检测的年份&#xff0c;则算法可表示如下…

C语言:定义和使用结构体变量

定义和使用结构体变量 介绍基础用法1.定义结构体2. 声明结构体变量3. 初始化和访问结构体成员4. 使用指针访问结构体成员5. 使用结构体数组 高级用法6. 嵌套结构体7. 匿名结构体8. 结构体和动态内存分配9. 结构体作为函数参数按值传递按引用传递 介绍 在C语言中&#xff0c;结…