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

Linux进程概念(二)

文章目录

    • 进程
      • 基本概念 课本概念
        • 描述进程-PCB
          • task_struct-PCB的一种
          • task_ struct内容分类
        • 组织进程
        • 查看进程
        • 通过系统调用获取进程标示符
        • 通过系统调用创建进程-fork初识

进程

基本概念 课本概念

​ 一个已经加载到内存中的程序,叫做进程(任务)。

​ 程序的一个执行实例,正在执行的程序等

进程=内核PCB数据结构对象(描述你这个进程的所有的属性值)+你自己的代码和数据

文件本来是在磁盘中的,但是运行起来之后,是cpu在跑,所以一定会加载到内存中。

image-20250224203809262

image-20250223201718778

一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。

所以,操作系统必须得将进程管理起来!先描述,再组织

人是通过属性认识一个事物或者一个对象的,当属性够多时,这一堆属性的集合就是目标对象。

描述进程-PCB

​ 在任何一个进程加载到内存的时候,形成真正的进程,操作系统要先创建进程(进程属性)的结构体对象

​ – PCB(进程属性的集合),process ctrl block – 进程控制块

​ Linux操作系统下的PCB是: task_struct。

​ 根据进程的PCB类型,为该进程创建对应的PCB对象

​ 操作系统只对你的PCB做管理,不对你的代码和数据做管理。

image-20250223221448339

task_struct-PCB的一种

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

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

​ PCB -> task_struct 结构体,里面包含进程得所有属性。

​ Linux内核中,最基本的组织进程task_struct的方式,采用双向链表组织的。(但不仅仅是双向链表)

task_ struct内容分类

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

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

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

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

​ 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

​ 上下文数据: 进程执行时处理器的寄存器中的数据。

​ I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

​ 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

组织进程

​ 可以在内核源代码里找到它。

​ 所有运行在系统里的进程都以task_struct链表的形式存在内核里。

查看进程

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

image-20250223212410735

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

grep通过管道筛选关键字process,grep也是一个进程,

筛选进程的时候,grep筛选process时也带了process关键字,所以也被筛选进去了。

image-20250224105013476

如果不想要grep,加上-v , 反向匹配

image-20250224105713874

​ 正在运行的进程。image-20250223200256377


暂停之后,就没有这个进程了

重启进程之后,进程的PID就不一样了。(PID会重新分配)

image-20250223213455051

cwd : current work dir ,当前进程的工作目录。

在运行这个代码时,PCB就将这个路径的属性记录下来了。

如果要创建一个文件,那就是在当前目录下创建。

因为进程PCB记录的是在当前路径。

exe 就是在执行这个目录的这个文件。

image-20250223213911196

默认在log.txt前面加上了 cwd/log.txt

image-20250224203708348

image-20250224102617912

暂停进程除了用ctrl+c外,还可以用kill

image-20250224110413421

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

进程id(PID)

image-20250224204644098

image-20250224111624372

image-20250224204928019

image-20250224205441059

getpid的值与进程的pid值一样,可以用getpid获得当前进程的pid。

当进程取消后,就查不到进程了。

再次启动进程,pid就会变化。

image-20250224205716405


父进程id(PPID)

image-20250224210322266

image-20250224210719412

重启进程后,pid改变了,但是ppid没有变

image-20250224210952014

bash 命令行解释器,核心:帮助获取用户的输入,帮助用户进行命令行解释。

image-20250224211417731

当我们每次重新登陆XShell时,Linux都会帮我们重新创建一个bash进程。

指令对应的进程就是bash进程的子进程。命令行出问题只会影响子进程。

image-20250224212211364

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

运行 man fork 认识fork

image-20250224213533762

fork之前只有一个执行流,fork之后就有两个执行流了。

image-20250224213909236

image-20250224213946771

fork有两个返回值

如果成功了,父进程返回子进程的pid,0返回给子进程;

如果失败了,-1返回给父进程,没有子进程被创建。

image-20250224214230539

image-20250224215327497

id==0 id>0同时满足,还有两个死循环在同时跑。

父进程就是它自己,新创建的子进程就是它的分支。

./运行程序 – 指令级别

fork() – 代码层面

image-20250224215742614

1.为什么fork要给子进程返回0,给父进程返回子进程的pid?

返回不同的返回值,是为了区分不同的执行流,让不同的执行流执行不同的代码块。

一般而言,fork之后的代码父子共享。

(父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝))

父进程返回子进程的pid就是为了用来标定子进程pid的唯一性。(在多个子进程的情况下,明确控制哪个子进程)


2.一个函数是如何做到返回两次的?如何理解?

return 之前子进程创建完了,也允许被CPU调度了,return语句代码父子共享,所以父和子分别执行return语句。

image-20250224225335123


3.一个变量怎么会有不同的内容?如何理解?

任何平台,进程在运行的时候,是具有独立性的!

(例如,开启了QQ和微信进程,但是QQ进程崩溃,不会影响微信进程)

数据可能被修改,不能让父进程和子进程共享同一份数据!

代码共享,是因为代码不会被修改,双方只对代码进行读取,所以不会对运行产生影响。

子进程可以拷贝一份父进程的数据,修改就可以只修改自己的数据,

但是拷贝出来的数据,子进程可能绝大部分不会访问和修改,使用率低,浪费资源。

子进程刚创建出来,父子进程代码和数据都是被共享的,

但是子进程尝试要改父进程的数据时,操作系统重新开辟一块空间,

子进程在新开辟的空间去写入和修改。

写入或者修改多少,就开辟多少空间。(数据层面的写时拷贝)

image-20250226143730291

image-20250226144402590

父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)


4.fork函数究竟是在干什么?干了什么?

创建子进程:系统中多了一个进程。

填充PCB的内容。父和子指向同一代码块。

fork之后,父子进程代码共享 – 代码是不可以被修改的。

我们为什么要创建子进程呢?

为了让父和子执行不同的事情!需要想办法让父和子执行不同的代码块!

让fork具有不同的返回值

image-20250224223706495

fork 之后通常要用 if 进行分流


如果父子进程被创建好,fork()往后,谁先运行呢?

这个用户是干预不了的,谁先运行由调度器决定,所以是不确定的。

调度器:挑选一个进程放到CPU上运行,对于数据结构的查找的一套算法。(公平调度)


通过创建子进程完成的,bash如何创建?fork();

​ – 让子进程执行解释新命令 , bash继续接受用户的输入,打印提示符,继续命令行解释。

image-20250226150557836


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

相关文章:

  • JavaWeb后端基础(8)spring原理
  • 炒菜的基本逻辑?
  • Codeforces Round 258 (Div. 2) E. Devu and Flowers 生成函数
  • Phi-4-multimodal:图、文、音频统一的多模态大模型架构、训练方法、数据细节
  • 智源开源多模态向量模型BGE-VL:多模态检索新突破
  • google s2部分浅讲
  • JVM - 3.垃圾回收
  • 物联网(Internet of Things, IoT)中的网络层简介
  • Eclipse 查看 JAVA SE 23 官方API 源代码
  • 为什么 MySQL InnoDB 的 Repeatable Read 可以阻止幻读?
  • 【JavaEE进阶】Spring AOP详解
  • preloaded-classes裁剪
  • 工业单板电脑在电商物流中心的应用案例
  • Java多线程与高并发专题——什么是阻塞队列?
  • Windows CMD 命令大全(综合开发整理版)
  • 【编译器】VSCODE搭建ESP32
  • C++:dp3则
  • 数据库---1.0
  • 基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 【redis】全局命令set、get、keys