当前位置:   article > 正文

嵌入式学习——进线程(进程的创建和结束)——day24

嵌入式学习——进线程(进程的创建和结束)——day24

1. 进程与程序的区别

    1.程序:存放在外存中的一段代码的集合
    2.进程:是一个程序动态执行的过程,包括创建、调度和消亡

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

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

        1.文本段:
            文本区
        2.数据段:
            数据区
        3.系统数据段:
            堆区、栈区
        4.内核

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. 进程命令

    1.top(按CPU占用率查询进程实时信息)
              PID:进程ID号 
              PPID:父进程ID号 
        q退出
        
    2.ps -ef (按PID排序查询某一个时刻进程信息)
        查看所有进程信息 
    
    3.pstree
        查看进程关系(关系树)
        
    4.ps -aux (ps -aux | less)
        查看进程状态信息
    
    5.kill 
        kill     -9  进程PID(9强制关闭)
        killall -9  进程名 (杀死所有与进程名相关的进程)
        killall -9  bash(关闭所有)

5. 进程相关函数接口

5.1 fork

        1. 定义

               pid_t fork(void);

        2. 功能

                创建一个子进程

                子进程先运行还是父进程先运行,顺序不确定。

                变量不共享。

                子进程的执行过程是从fork函数之后执行。

        3. 参数

               缺省

        4. 返回值(一次调用,会返回两次)

                成功

                        子进程中返回0

                        父进程中返回创建的子进程的PID>0     

                   失败返回-1

        5. 示例程序

  1. #ifndef _HEAD_H_
  2. #define _HEAD_H_
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #endif
  1. #include "head.h"
  2. int main(int argc, char const *argv[])
  3. {
  4. pid_t pid;
  5. pid = fork();
  6. if (-1 == pid)
  7. {
  8. perror("fail to fork!\n");
  9. return -1;
  10. }
  11. if (0 == pid)
  12. {
  13. printf("Child Process! PID:%d PPID:%d\n", getpid(), getppid());
  14. }else if (pid > 0)
  15. {
  16. printf("Parent Process! PID:%d ChildPID:%d\n", getpid(), pid);
  17. }
  18. printf("hello world!\n");
  19. while (1)
  20. {
  21. }
  22. return 0;
  23. }

5.2 getpid

        1. 定义

               pid_t fork(void);

        2. 功能

                获得调用该函数(当前)进程的pid

        3. 参数

               缺省

        4. 返回值

                当前进程的pid

5.3 getppid

        1. 定义

               pid_t getppid(void);

        2. 功能

                获得调用该函数进程的父进程pid号

        3. 参数

               缺省

        4. 返回值

                返回父进程id号

5.4 exit

        1. 定义

               void exit(int status);

        2. 功能

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

        3. 参数

             status:进程结束的值

        4. 返回值

               缺省

        5. 注意

                在主函数中调用exit和return作用等价

5.5 _exit

        1. 定义

               void _exit(int status);

        2. 功能

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

        3. 参数

                status:进程结束的状态

        4. 返回值

               缺省

补充1

        fprintf

        1. 定义

                int fprintf(FILE *stream, const char *format, ...);

        2. 功能

                向指定流中打印格式化字符串

        3. 参数

                stream:文件流指针
                format:字符串格式
                ...:变量表达式

        4. 返回值

                成功返回打印字符的个数
                失败返回负数

        5. 示例程序

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. FILE *fp = NULL;
  5. int num1 = 200;
  6. int num2 = 300;
  7. char tmpbuff[1024] = {0};
  8. int year = 2022;
  9. int mon = 8;
  10. int day = 10;
  11. int hour = 10;
  12. int min = 16;
  13. double pi = 3.1415926;
  14. fp = fopen("file.txt", "w");
  15. if (NULL == fp)
  16. {
  17. perror("fail to fopen");
  18. return -1;
  19. }
  20. // fprintf(fp, "[%04d-%02d-%02d %02d:%02d]:%.2lf\n", year, mon, day, hour, min, pi);
  21. #if 1
  22. fprintf(fp, "hello world\n");
  23. fprintf(fp, "num1 = %d, num2 = %d\n", num1, num2);
  24. // sprintf(tmpbuff, "num1 = %d, num2 = %d\n", num1, num2);
  25. // fputs(tmpbuff, fp);
  26. #endif
  27. fclose(fp);
  28. return 0;
  29. }

        sprintf

            char tmpbuff[1024] = {0};
            sprintf(tmpbuff, "hello world");

补充2

        fscanf

        1. 定义

                int fscanf(FILE *stream, const char *format, ...);

        2. 功能

               从流中接收格式化字符串

        3. 参数

                stream:文件流指针 
                format:格式化字符串 

        4. 返回值

                成功返回匹配到输入控制符的个数
               失败能返回EOF
                读到文件末尾返回EOF

        5. 示例程序

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. FILE *fp = NULL;
  5. int num1 = 0;
  6. int num2 = 0;
  7. int ret = 0;
  8. fp = fopen("file.txt", "r");
  9. if (NULL == fp)
  10. {
  11. perror("fail to fopen");
  12. return -1;
  13. }
  14. ret = fscanf(fp, "num1 = %d, num2 = %d", &num1, &num2);
  15. printf("ret = %d\n", ret);
  16. fclose(fp);
  17. printf("num1 = %d\n", num1);
  18. printf("num2 = %d\n", num2);
  19. return 0;
  20. }

补充3:malloc用例

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. int *p = NULL;
  6. p = malloc(4);
  7. if (NULL == p)
  8. {
  9. printf("malloc failed!\n");
  10. return -1;
  11. }
  12. *p = 100;
  13. printf("*p = %d\n", *p);
  14. free(p);
  15. return 0;
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/638264
推荐阅读
相关标签
  

闽ICP备14008679号