当前位置: 首页 > news >正文

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

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

相关文章:

  • 网站设置301跳转/深圳网络公司推广
  • wap网站适配/500个游戏推广群
  • 网页设计属于什么行业/武汉官网优化公司
  • wordpress虚拟空间/网络营销策划目的
  • 普宁17网站一起做网店/软文推广收费
  • 鞋设计师之家官网/百度地图优化
  • 【C语言】数据结构基础(每日小细节025),有三数之和哦
  • 一文搞懂 python 中的 classmethod、staticmethod和普通的实例方法的使用场景
  • Redis缓存和数据库一致性
  • JavaScript - 代理与反射(代理基础)
  • 消息批处理端口说明
  • Win10注册表损坏进不了系统怎么U盘重装系统?
  • python学习笔记---面向对象编程【廖雪峰】
  • QMAKE_POST_LINK QMAKE_PRE_LINK解释
  • 物流企业如何确保网络安全?
  • 【工具使用】Kvaser CANKing的使用
  • QEMU零知识学习5 —— QEMU安装
  • pom.xml文件详解