Linux---进程概念

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1. 什么是进程

2. 描述进程---PCB

task_struct---PCB的一种 

task_ struct内容分类 

3. 组织进程 

4. 查看进程 

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

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

1. 什么是进程

其实我们启动一个软件本质就是启动了一个进程

在Linux中运行一条命令./xxx运行的时候其实就是在系统层面创建了一个进程

Linux是可以同时加载多个程序的Linux是可能同时存在大量的进程在系统中的(OS,内存)              那么Linux要不要管理进程呢答案是必须的                                                                                  如何管理先描述再组织

2. 描述进程---PCB

  • 进程信息被放在一个叫做进程控制块数据结构中可以理解为进程属性的集合。(Linux下一切皆文件文件 = 属性 + 内容)
  • 我们将进程控制块称之为PCBprocess control blockLinux操作系统下的PCB是: task_struct

task_struct---PCB的一种 

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

task_ struct内容分类 

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

3. 组织进程 

可以在内核源代码里找到它。所有运行在系统里的进程都以 task_struct链表 的形式存在内核里。

4. 查看进程 

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

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

top : 查看所有进程信息类似Windows下任务管理器

但是我们更推荐用 ps 查看进程信息

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

  • 进程idPID
  • 父进程idPPID

 代码示例

运行 

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

fork 功能创建一个子进程                                                                                                                fork 特点                                                                                                                                      1. 创建失败返回-1创建成功给父进程返回子进程id给子进程返回0.                                            2. fork后会从原来一个进程分流分两个进程(父进程和子进程),fork后两进程共享后面代码。

因为fork后两进程代码共享所以父进程子进程都会打印第二个printf语句只是id不同罢了。 

因为fork返回值不同的特点fork 之后通常要用 if 进行分流对父子进程进行不同操作。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
     int ret = fork();
     if(ret < 0)//即-1
     {
         printf("创建进程失败\n");
         perror("fork");
         return 1;
     }
     else if(ret == 0)//子进程
     { 
         printf("I am child : %d!, ret: %d\n", getpid(), ret);
     }
     else//父进程
     { 
         printf("I am father : %d!, ret: %d\n", getpid(), ret);
     }
     sleep(1);
 return 0;
}

tip父子进程被创建出来哪一个进程先运行呢

不一定谁先运行这个是由操作系统的调度器决定的。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux