• linux--进程1)


    00. 前言

    操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!

    什么意思哪?

    1. 描述起来,用struct结构体
    2. 组织起来,用链表或其他高效的数据结构

    01. 进程

    001. 基本概念

    课本概念:程序的一个执行实例,正在执行的程序等
    ...............................................
    内核观点:担当分配系统资源(CPU时间,内存)的实体
    
    • 1
    • 2
    • 3

    002. 描述进程-PCB

    进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
    .........................................................................
    课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct
    
    • 1
    • 2
    • 3

    0001. task_struct-PCB的一种

    在Linux中描述进程的结构体叫做task_struct。
    .......................................................................
    task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
    
    • 1
    • 2
    • 3

    0002. task_ struct内容分类

    标示符: 描述本进程的唯一标示符,用来区别其他进程。
    ..................................................................
    状态: 任务状态,退出代码,退出信号等。
    ..................................................................
    优先级: 相对于其他进程的优先级。
    ..................................................................
    程序计数器: 程序中即将被执行的下一条指令的地址。
    ..................................................................
    内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
    ..................................................................
    上下文数据: 进程执行时处理器的寄存器中的数据。
    ..................................................................
    I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
    ..................................................................
    记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
    ..................................................................
    其他信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    其实:
    进程 = 对应的代码和数据 + 进程对应的PCB结构体。

    02. 查看进程

    进程的信息可以通过 /proc 系统文件夹查看

    在这里插入图片描述

    如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。

    在这里插入图片描述

    大多数进程信息同样可以使用top和ps这些用户级工具来获取
    
    • 1

    例:

    #include 
    #include 
    #include 
    int main()
    {
    	while(1)
    	{
    		sleep(1);
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    03. 通过系统调用获取进程标示符

    进程id(PID)
    父进程id(PPID)
    
    • 1
    • 2

    例:

    #include 
    #include 
    #include 
    int main()
    {
    	printf("pid: %d\n", getpid());
    	printf("ppid: %d\n", getppid());
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    04. 通过系统调用创建进程-fork初识

    运行 man fork 认识fork
    fork有两个返回值:

    a. 失败返回 -1
    b. 成功:1.给父进程返回子进程的pid
    …2.给子进程返回0
    父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

    例:

    #include
    #include
    #include
    
    int main()
    {
      printf("I am parent process! pid: %d\n", getpid());  
    
      pid_t ret = fork();
    
      while(1)
      {
        pid_t id = getpid();
      
        printf("hello word! ret: %d  pid: %d ppid: %d\n", ret, id, getppid());
        sleep(1);
      }
    
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    从这里pid_t ret = fork();开始分为两个程序,一个子程序和父程序。
    
    • 1

    在这里插入图片描述

    fork 之后通常要用 if 进行分流
    
    • 1
    #include 
    #include 
    #include 
    int main()
    {
      int ret = fork();
      if(ret < 0)
      {
    	perror("fork");
    	return 1;
      }
      else if(ret == 0)  //child
      { 
    	printf("I am child : %d!, ret: %d\n", getpid(), ret);
      }
      else  //father
      { 
    	printf("I am father : %d!, ret: %d\n", getpid(), ret);
      }
      sleep(1);
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    .
    .
    .
    感觉有所收获的话,友友们给小丁一个赞👍

  • 相关阅读:
    AOP实现接口加密
    性能测试报告模板
    Windows下安装PaddleDetection
    linux系统如何定时关机
    PHP后台实现微信小程序登录
    SpringBoot : ch04 整合数据源
    Junit单元测试为什么不能有返回值?
    nodejs+vue+elementui英语单词学习网站python java
    Talk | 微软亚洲研究院宋恺涛&南大余博涛:面向文本/音乐序列任务的Transformer注意力机制设计
    Github每日精选(第28期):Swift图像下载库 Kingfisher
  • 原文地址:https://blog.csdn.net/Dingyuan0/article/details/126125497