当前位置: 首页 > 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

                

相关文章:

  • Java 大视界 -- 基于 Java 的大数据分布式存储在科研大数据归档与长期保存中的应用(328)
  • Web应用开发 --- Tips
  • Tomcat服务概述
  • C++基础(FreeRDP编译)
  • 如何用 Kafka Manager 实现 Kafka 集群全面监控
  • Java笔记
  • 非常有科技感的wpf GroupBox 控件
  • 详解WSL(Hyper)网络配置
  • MediaPipe框架解析(二):mediapipe helloworld
  • 进阶向:Django入门,从零开始构建一个Web应用
  • GAN的思考及应用
  • SCAU期末笔记 - 操作系统 英文定义题
  • ShanghaiCity上海,又解锁一塔2025.06
  • PYTHON从入门到实践9-类和实例
  • LeetCode 第80题 删除有序数组中的重复项Ⅱ
  • Modbus 报文结构与 CRC 校验实战指南(二)
  • 学生宿舍智能控电技术的新发展和控制要求
  • 矩阵及矩阵快速幂
  • Kafka4.0初体验
  • [Linux入门] Linux LVM与磁盘配额入门指南