当前位置: 首页 > news >正文

自学嵌入式 day27 进程

进程:

一、定义:

        进程是一个程序执行的过程,会去分配内存资源,cpu的调度,和其他的硬件资源

二、pcd块组成:

        1、PID:进程标识符。
         2、chdir:当前工作路径 。
        3、umask  0002
        4、fds:进程打开的文件列表  文件IO中有提到。
        5、signal:信号相关设置 处理异步io,用户id,组id。

        6、进程资源的上限。
注:命令:ulimit -a,显示资源上限。

三、进程与程序的区别

        1、程序:静态,存储在硬盘中代码,数据的集合。
        2、进程:动态,程序执行的过程,包括进程的创建、调度、消亡。
        3、
        1)程序是永存,进程是暂时的。
        2)进程有程序状态的变化,程序没有。
        3)进程可以并发,程序无并发。
        4)进程与进程会存在竞争计算机的资源。
        5)一个程序可以运行多次,变成多个进程,一个进程可以运行一个或多个程序。

四、内存(虚拟)分布

        code:代码段,保存.c的代码(只读)

        data:数据段,保存全局变量和静态变量(可读可写)

        heap:动态内存空间

        map/share:硬设区和共享区

        stack:栈,大小为8k

五、内存分类

        1、交互式进程

        2、批处理进程   shell脚本 

        3、 守护进程 :守护计算机

六、进程状态

七、进程作用

        并发(多个任务同时运行)

八、进程的调度

        进程上下文切换

        1、调度算法:

                (1)先来先服务

                (2)段任务优先

                (3)优先级

                (4)时间片轮转

注:(1)man -k :查相关函数。

九、进程相关命令

        1、ps aux         查看进程相关信息

        2、top                根据cpu占用率查看进程相关信息

        3、kill                发送一个信号

                (1)kill -2 pid 

                (2)killall -9 程序名

注:(1)-2:要求关闭,程度较轻

        (2)-9:强制关闭,程度较重

十、进程相关函数

        1、fork():pid_t fork()

                (1)特点:①一次调用,会返回两次。
                                    ②子进程先运行和是父进程先进程,顺序不确定。
                                    ③变量不共享。
                                    ④子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同

                (2)功能:通过该函数可以从当前进程中克隆一个同名新进程,克隆的进程称为子进程,原有

的进程称为父进程,子进程是父进程的完全拷贝,子进程的执行过程是从fork函数之后执行,子进

程与父进程具有相同的代码逻辑。

                (3)返回值:int 类型的数字。

                                        在父进程中:成功 返回值是子进程的pid号 >0
                                                             失败 返回-1;
                                        在子进程中:成功 返回值 0
                                                              失败 无

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

int main()
{
    printf("strat ...\n");
    pid_t ret = fork();
    if(0 == ret)
    {
        while(1)
        {
            printf("child,控制方向\n");
            sleep(1);
    
        }
    }
    else if(0 < ret)
    {
        while(1)
        {
            printf("father,發送視屏\n");
            sleep(1);
        }
    }
    else
    {
        perror("fork\n");
        return 1;
    }
    return 0;
}

        2、getpid:pid_t getpid(void);

                (1)功能:获得调用该函数进程的pid

                (2)参数:缺省

                (3)返回值:进程的pid
       
        3、getppidpid_t getppid(void);

                (1)功能:获得调用该函数进程的父进程pid号

                (2)参数:缺省

                (3)返回值:返回父进程id号

#include<stdio.h>
#include<string.h>
#include <sys/types.h>
#include <unistd.h>
int a = 20;
int main()
{
    printf("strat ...\n");
    pid_t ret = fork();
    if(0 == ret)
    {
        a += 10;
        int i = 10;
        while(i--)
        {
            printf("child,控制方向 pid : %d,ppid : %d\n",getpid(),getppid());
            sleep(1);
    
        }
    }
    else if(0 < ret)
    {
        int i= 10;
        while(i--)
        {
            printf("father,發送視屏 pid : %d,ppid : %d\n",getpid(),getppid());
            sleep(1);
        }
    }
    else
    {
        perror("fork\n");
        return 1;
    }
    printf("%d,%d\n",a,getpid());
    return 0;
}

注:(1)父子进程的关系:子进程是父进程的副本。子进程获得父进程数据段,堆,栈,正文段共享。运行前后具有随机性。

        (2)父子进程的区别:①fork的返回值
                                              ②pid不同

        (3)写时复制:子进程只会复制对于父进程中发生变化和变量的代码

                                优点:速度快,所占空间小

十一、进程的终止

        主动退出:

                1、main 中return

                2、exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。已经清理函数(atexit)。

                3、_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。

                4、主线程退出

                5、主线程调用pthread_exit
        异常终止

                6、abort()

                7、signal   kill pid

                8、最后一个线程被pthread_cancle

                

http://www.lryc.cn/news/576815.html

相关文章:

  • mac系统快捷键及命令安装
  • 状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!
  • 边界的艺术:支持向量机与统计学习时代的王者
  • 设计模式-外观模式、适配器模式
  • 【数据挖掘】聚类算法学习—K-Means
  • YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-conv.py
  • 设备预测性维护和异常检测系统设计方案
  • 【HuggingFace】模型下载至本地访问
  • Git安装全攻略:避坑指南与最佳实践
  • C++ 格式化输入输出
  • 人工智能时代的职业替代风险与应对策略分析
  • MySQL技巧
  • 性能分析专栏 -- top命令
  • 【修电脑的小记录】连不上网
  • 打造地基: App拉起基础小程序容器
  • 疏通经脉: Bridge 联通逻辑层和渲染层
  • 深入理解 Dubbo 负载均衡:原理、源码与实践
  • RK3588集群服务器性能优化案例:电网巡检集群、云手机集群、工业质检集群
  • [Python 基础课程]PyCharm 的安装
  • 大数据Hadoop之——Flume安装与使用(详细)
  • Dify私有化知识库搭建并通过ChatFlow智能机器人使用知识库的详细操作步骤
  • AlpineLinux安装部署MariaDB
  • 怎样优化HDFS的网络传输
  • WireShark网络取证分析第一集到第五集和dvwa靶场环境分析漏洞
  • TCP/IP模型、OSI模型与C# Socket编程详解
  • xcode-XCTest
  • 领域驱动设计(DDD)【28】之实践或推广DDD的学习
  • leetcode437-路径总和III
  • 什么是RAG检索生成增强?
  • #Redis分布式缓存# ——1.Redis持久化