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

2024-06-09 21:12

本文主要是介绍嵌入式学习——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.子进程结束,父进程回收子进程空间,即可避免产生僵尸进程

这篇关于嵌入式学习——Linux高级编程复习(进程)——day39的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046309

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet