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

[Linux] 通透讲解 什么是进程

标题:[Linux] 通透讲解 什么是进程 

个人主页:@水墨不写bug

(图片来自网络)

目录

一.深入进程基本概念

 二.管理好进程

1.管理好进程的方法

2.描述进程-PCB

3.组织进程


正文开始: 


本文按照对进程的先描述再组织进行讲解 。

一.深入进程基本概念

        课本概念:程序的一个执行实例,正在执行的程序等。

        内核观点:担当分配系统资源(CPU时间,内存)的实体。

 由于进程的概念非常重要,所以我们在这里再次讲解一遍:

        当我们写好一个程序的时候,编译源代码会产生对应的可执行程序,当我们./运行这个程序1的时候,操作系统会做两件事:

        1)将可执行程序加载到内存:

        但是尽管内存中已经加载了可执行程序,但是此时操作系统还无法管理这些程序,因为内存中没有描述相关属性的数据结构。所以在操作系统中,为了描述加载到内存中的程序的相关属性,所以衍生出一个概念PCB。(Linux中称为task_struct)Linux操作系统使用C语言写的,本质上task_struct就是一个结构体。每一个task_struct内部都存储有对应进程的属性信息。

        2)将代码和数据加载到PCB(task_struct)中:

 

         这样的操作最终我们达成了一个目的:将操作系统对进程的管理工作转化为了对特定数据结构的管理。


 二.管理好进程

1.管理好进程的方法

        想要管理好进程,首先需要描述好进程 ,对进程的管理仍然满足我们之前得出的结论:

先描述,再组织。

2.描述进程-PCB

        进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct(也就是上图的组织进程的链表的节点)

task_struct-PCB的一种

        在Linux中描述进程的结构体叫做task_struct

        task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

(看一眼task_struct,不需要刨根问底)

// task_struct结构注释:

//  ==========================

  long state //任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)。

  long counter //任务运行时间计数(递减)(滴答数),运行时间片。

  long priority //运行优先数。任务开始运行时counter = priority,越大运行越长。

  long signal //信号。是位图,每个比特位代表一种信号,信号值=位偏移值+1。

  struct sigaction sigaction[32] //信号执行属性结构,对应信号将要执行的操作和标志信息。

  long blocked //进程信号屏蔽码(对应信号位图)。

//  --------------------------

  int exit_code //任务执行停止的退出码,其父进程会取。

  unsigned long start_code //代码段地址。

  unsigned long end_code //代码长度(字节数)。

  unsigned long end_data //代码长度 + 数据长度(字节数)。

  unsigned long brk //总长度(字节数)。

  unsigned long start_stack //堆栈段地址。

  long pid //进程标识号(进程号)。

  long father //父进程号。

  long pgrp //父进程组号。


  long session //会话号。

  long leader //会话首领。

  unsigned short uid //用户标识号(用户id)。

  unsigned short euid //有效用户id。

  unsigned short suid //保存的用户id。

  unsigned short gid //组标识号(组id)。


  unsigned short egid //有效组id。

  unsigned short sgid //保存的组id。

  long alarm //报警定时值(滴答数)。

  long utime //用户态运行时间(滴答数)。

  long stime //系统态运行时间(滴答数)。

  long cutime //子进程用户态运行时间。

  long cstime //子进程系统态运行时间。

  long start_time //进程开始运行时刻。

  unsigned short used_math //标志:是否使用了协处理器。

//  --------------------------

  int tty //进程使用tty 的子设备号。-1 表示没有使用。

  unsigned short umask //文件创建属性屏蔽位。

  struct m_inode * pwd //当前工作目录i 节点结构。

  struct m_inode * root //根目录i 节点结构。

  struct m_inode * executable //执行文件i 节点结构。

  unsigned long close_on_exec //执行时关闭文件句柄位图标志。(参见include/fcntl.h)

  struct file * filp[NR_OPEN] //进程使用的文件表结构。

//  --------------------------

  struct desc_struct ldt[3] //本任务的局部表描述符。0-空,1-代码段cs,2-数据和堆栈段ds&ss。

task_ struct内容(内部变量)分类:

        标示符: 描述本进程的唯一标示符,用来区别其他进程。

        状态: 任务状态,退出代码,退出信号等。

        优先级: 相对于其他进程的优先级。

        程序计数器: 程序中即将被执行的下一条指令的地址。

        内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等其他信息。

3.组织进程

        可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。(下面作图的例子是以链表的形式组织进程为例


完~

未经作者同意禁止转载


http://www.kler.cn/a/310984.html

相关文章:

  • Python →爬虫实践
  • C# 模拟浏览器自操作(自动化办公)
  • Java面向对象编程进阶之包装类
  • 【OH】openHarmony开发环境搭建(基于windows子系统WSL)
  • ubuntu中apt-get的默认安装路径。安装、卸载以及查看的方法总结
  • 代码 RNN原理及手写复现
  • 嵌入式常用算法之低通滤波算法
  • libgit2编译
  • 智慧课堂学生行为数据集
  • 2024最新版 Tuxera NTFS for Mac 2023绿色版图文安装教程
  • 达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?
  • ESP8266+httpServer+GET+POST实现网页验证密码
  • 承兑汇票识别API 银行承兑汇票识别接口 电子承兑汇票识别sdk 多进程识别
  • 鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现
  • 使用python-pptx插入图片:将图片添加到幻灯片中并进行位置调整
  • 实战17-NavBar+Vip布局
  • 2024年9月python二级易错题和难题大全(附详细解析)(四)
  • Spring中存储Bean的常见注解
  • python的数据类型详解
  • MyBatis系统学习(三)——动态SQL
  • 简单题28-找出字符传中第一个匹配项的下标(Java and Python)20240918
  • ElasticSearch介绍+使用
  • 3. Python计算水仙花数
  • 利士策分享,赚钱与体重:一场关于生活平衡的微妙探索
  • 云计算服务的底层,虚拟化技术的实现原理
  • 假期学习--iOS 编译链接