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

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

相关文章:

  • 若依vue前端queryParams搜索下拉框无法重置或者重置值有问题
  • SpringBoot(一)--搭建架构5种方法
  • 基于控制障碍函数(Control Barrier Function)的二次规划(QP)控制
  • Good Bye 2013 F. New Year Tree 倍增、思维
  • 原函数存在定理
  • 一个基于C语言的猜数字小游戏
  • 【打卡day3】字符串类
  • clickhouse查询效率低
  • C++之list
  • SpringBoot POST和GET请求
  • 【算法】大数据查重
  • 庞加莱映射的性质
  • vs code 设置字体颜色
  • 深入了解蓝牙广播与扫描响应
  • Codeforces Round 258 (Div. 2) E. Devu and Flowers 生成函数
  • 四、云原生应用监控-Etcd
  • IMX6ULL的最简单的LED驱动程序
  • 南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。
  • 掌握Linux基础:从文件链接到Shell命令的全面指南
  • CTF杂项——[WUSTCTF 2020]alison_likes_jojo
  • 王毅将出席《关于建立国际调解院的公约》签署仪式
  • 上影节开幕影片《酱园弄·悬案》,陈可辛执导,章子怡主演
  • 法国参议院调查委员会公布雀巢“巴黎水”丑闻调查报告
  • 长沙至赣州高铁初步设计获批,可填补湘赣两省斜向交通空白
  • 中方是否担忧美国主权信用评级下调?外交部:美国应采取负责任的政策措施
  • 浙江理工大学传播系原系主任刘曦逝世,年仅44岁