嵌入式学习——进线程(进程的创建和结束)——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. 示例程序

#ifndef _HEAD_H_
#define _HEAD_H_

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

#endif
#include "head.h"

int main(int argc, char const *argv[])
{
    pid_t pid;

    pid = fork();
    if (-1 == pid)
    {
        perror("fail to fork!\n");
        return -1;
    }

    if (0 == pid)
    {
        printf("Child Process! PID:%d  PPID:%d\n", getpid(), getppid());
    }else if (pid > 0)
    {
        printf("Parent Process! PID:%d  ChildPID:%d\n", getpid(), pid); 
    }

    printf("hello world!\n");

    while (1)
    {

    }

    return 0;
}

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. 示例程序

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    int num1 = 200;
    int num2 = 300;
    char tmpbuff[1024] = {0};
    int year = 2022;
    int mon = 8;
    int day = 10;
    int hour = 10;
    int min = 16;
    double pi = 3.1415926;

    fp = fopen("file.txt", "w");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

//  fprintf(fp, "[%04d-%02d-%02d %02d:%02d]:%.2lf\n", year, mon, day, hour, min, pi);
#if 1
    fprintf(fp, "hello world\n");
    fprintf(fp, "num1 = %d, num2 = %d\n", num1, num2);
//    sprintf(tmpbuff, "num1 = %d, num2 = %d\n", num1, num2);
//    fputs(tmpbuff, fp);
#endif

    fclose(fp);

    return 0;
}

        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. 示例程序

#include <stdio.h>

int main(void)
{
    FILE *fp = NULL;
    int num1 = 0;
    int num2 = 0;
    int ret = 0;

    fp = fopen("file.txt", "r");
    if (NULL == fp)
    {
        perror("fail to fopen");
        return -1;
    }

    ret = fscanf(fp, "num1 = %d, num2 = %d", &num1, &num2);
    printf("ret = %d\n", ret);

    fclose(fp);

    printf("num1 = %d\n", num1);
    printf("num2 = %d\n", num2);

    return 0;
}

补充3:malloc用例

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int *p = NULL;

	p = malloc(4);
	if (NULL == p)
	{
		printf("malloc failed!\n");
		return -1;
	}

	*p = 100;
	printf("*p = %d\n", *p);
	
	free(p);

	return 0;
}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值