Linux---进程概念

目录

1. 什么是进程?

2. 描述进程---PCB

task_struct---PCB的一种 

task_ struct内容分类 

3. 组织进程 

4. 查看进程 

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

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

1. 什么是进程?

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

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

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

2. 描述进程---PCB

  • 进程信息被放在一个叫做进程控制块数据结构中,可以理解为进程属性的集合。(Linux下一切皆文件,文件 = 属性 + 内容)
  • 我们将进程控制块称之为PCBprocess control block),Linux操作系统下的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
  • 父进程id(PPID)

 代码示例:

运行: 

通过系统调用创建进程---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:父子进程被创建出来,哪一个进程先运行呢?

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值