【Linux进程篇】进程概念(1)

news2024/11/18 16:33:59

【Linux进程篇】进程概念(1)

目录

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

作者:爱写代码的刚子
时间:2023.7.30
前言:操作系统和软硬件的关系就相当于管理者和被管理者的关系,管理者并不需要见到被管理者,通过执行者拿到对应数据,通过对数据的管理来达到管理的目的。==对软硬件的管理最后一定会变成对某种数据结构的增删查改。==本篇博客将介绍操作系统如何对进程进行管理,如何创建进程。

进程

基本概念

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

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

    • 通俗一点:一个已经加载到内存中(运行)的程序叫做进程(任务),计算机在开机时也需要将操作系统从外设加载到内存中。
    • 一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程,所以操作系统必须将进程管理起来。
    • 进程需要先描述再进行管理
    • 任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程的结构体对象(进程属性的集合)——PCB,process ctrl block——进程控制块
    • 进程属性: 进程编号、进程状态、优先级…
    • 操作系统根据进程的PCB,为该进程创建对应的PCB对象
    • 进程 = 内核PCB数据结构对象(描述你这个进程的所有属性值)[系统维护] + 你自己的代码和数据
    • 操作系统管理进程只需要管理PCB结构体对象
    • PCB中包含对应的指针信息找到代码和数据
    • 操作系统中中含有多个进程,对进程的管理变成了对双向链表进行增删查改
    • 所有操作系统都是按照以上方案来对进程进行管理(思路是一致),但是具体管理方法有差别。
    • 不要以为将程序加载到内存就叫进程,而是操作系统为了管理这个进程所创建的PCB结构体。(只写一份可执行程序,把同样的进程跑了两次,但是在系统层面上是两进程)
  • ps ajx查看所有进程
    在这里插入图片描述
    用vim编写一段代码,并执行:
    在这里插入图片描述

  • ps ajx | grep myprocess查看myprocess的进程状态

在这里插入图片描述

  • ps ajx | head -1 && ps ajx | grep myprocess将进程的属性也显示出来

在这里插入图片描述

描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct(PCB具体的一种)
task_struct-PCB的一种
  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct内容分类
  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。(CPU中有一个寄存器(程序计数器),当运行一个进程时,永远要把当时运行指令的下一条指令的地址记录下来,因为进程可能因为某些原因不被运行,唤醒时才运行
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针(找到代码数据)
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

组织进程

可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。

Linux内核中,最基本的组织进程task_struct的方式是采用双向链表组织的,PCB还有其他的链式属性(队列、二叉树等,数据结构之间的关系非常错综复杂)

查看进程

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

  • 如:要获取PID为1的进程信息,你需要查看/proc/1这个文件夹。

  • ls /proc查看当前系统的所有进程(关机之后目录里的数据没了,上面的所有信息是Linux操作系统用文件系统的方式把内存当中的文件包括进程信息给我们可视化出来,上面的数据都是内存级的)
    在这里插入图片描述
    运行指令时,所有的指令都变成了进程,这些指令都要加载到内存,以进程的方式去运行(很快)

在这里插入图片描述

  • ls /proc -l显示进程(蓝色数字是当前进程的PID)
    在这里插入图片描述
    在这里插入图片描述

当进程重新运行时PID很可能会变化
在这里插入图片描述
cwd:current work directory当前进程的工作目录(目录的重新理解

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

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

在这里插入图片描述

    • 进程id(PID)
    • 父进程id(PPID)
  • kill -9 +PID杀死对应进程

在这里插入图片描述

  • while :;do ps ajx | head -1 ; ps ajx | grep proc | grep -v grep;echo “--------------------------------------------”; sleep 1;done 打印进程相关的信息

在这里插入图片描述

  • getppid() 利用这个函数可以查看父进程id(头文件:#include <sys/types.h>)

  • 多次运行时父进程不会变,但是子进程会变
    在这里插入图片描述

  • 查看该程序的父进程(bash进程)
    在这里插入图片描述
    运行一个进程时,命令行解释器会将这个指令变成bash的子进程,由子进程执行对应的命令。

  • 每次登入iTerm时,系统会为我们单独创建一个bash进程(命令行解释的进程)(所有指令的父进程)

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

  • 运行man fork认识fork
  • fork有两个返回值
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

在这里插入图片描述

在这里插入图片描述

进程创建成功,给父进程返回子进程的PID,给子进程返回0;创建失败返回-1

  • 那是不是表示fork函数会返回两次?
    在这里插入图片描述

在这里插入图片描述
说明这个id具有两个值,说明fork()在程序运行期间创建了一个子进程。

【问题】:

    • 为什么能跑两份的代码?
      因为存在了两个进程。
    • 为什么fork要给子进程返回0,给父进程返回子进程PID?
      返回不同的返回值,是为了区分让不同的执行流,执行不同的代码块,一般而言fork之后的代码父子共享。给父进程返回子进程PID是为了标识子进程的唯一性,父进程来控制子进程,子进程只需调用getpid()就可以知道子进程的PID。
    • 一个函数是如何做到返回两次的?如何解释?
      fork()之后父子进程的代码是共享的,代码是不可以被修改的。虽然代码是共享的,但是我们是希望他们执行不同的代码块,这样才可能让父子进程协同起来。
      fork()也是一个函数,一个函数return了说明该函数的核心工作已经完成。
      fork()函数的功能可以总结为以下:
      1. 创建子进程PCB
      2. 填充PCB对应的内容
      3. 让子进程和父进程指向同样的代码
      4. 父子进程都是有独立的task_struct,可以被CPU调度运行
      5. … …
      6. return ret;

既然return ret;也是一份代码,说明父子进程共享这份代码,父进程在函数调度时返回一次,子进程在函数调度时返回一次。所以fork()函数返回了两次fork()return之前,子进程早就创建了

    • 一个变量怎么会有不同的内容?
      在任何平台,进程在运行的时候,是具有独立性的,直接决定了父子进程不能访问同一份数据,因为数据可能会被修改。(共享代码并不影响独立性),理论上子进程需要将父进程数据拷贝一份(操作系统实现)。但是子进程并不一定使用父进程的全部数据,如果全部拷贝父进程的数据可能造成资源的浪费,造成不必要的内存负担,所以子进程拷贝数据时会进行写时拷贝所以在进程刚创建的时候父子进程的代码和数据全都是共享的,但是一旦当子进程尝试去修改父进程的数据时,操作系统会重新开辟一块空间,去新开辟的这块空间进行写入。(用多少开多少空间)
      (深浅拷贝也用到了写实拷贝)
      由于fork()的返回值写入了id,子进程写入时发生了写实拷贝,操作系统对同一个id变量拷贝了两份,所以父子进程在使用id时,父子进程看到的id的内容就会不一样。(访问了不同的内存区)

【存疑】:同一个变量是如何让父子进程看到不同的内容?(地址空间章节里会介绍)

  • 如果父子进程被创建好,fork()往后谁先运行呢?
    谁先运行是不确定的,由调度器决定,调度的本质是对CPU资源的竞争,调度器的存在保证了竞争的公平

【问题】但是作者发现了一个问题:
在这里插入图片描述

按照上面的理解该程序的输出结果应该为:111111122222221111111
实际运行时:
在这里插入图片描述
【解释现象】:因为代码中的第一个printf打印的字符串后面没有加上\n,导致父进程打印完1111111,该字符串还存在缓冲区中,导致创建子进程时也将父进程的缓冲区也拷贝了,所以也将"1111111"打印了出来。


进程概念篇(1)结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC源码分析 —— 拦截器是何时调用的

SpringMVC源码分析&#xff0c;拦截器是何时、以什么方式调用的&#xff1f;本文将进行详细说明 环境准备 springboot 2.3.7.RELEASE 笔者创建一个springboot的web项目&#xff0c;使用的springboot的版本是2.3.7.RELEASE 对应的spring-web版本是5.2.12.RELEASE 下面将对上面…

【NLP-新工具】语音转文本与OpenAI的用途

一、说明 OpenAI最近2022发布了一个名为Whisper的新语音识别模型。与DALLE-2和GPT-3不同&#xff0c;Whisper是一个免费的开源模型。它的主要功能就是将语音翻译成文本。本文将介绍如何使用这个重要应用库。 二、 Whisper概念 2.1 Whisper是啥&#xff1f; Whisper 是一种自动…

考完软考,有什么备考心得和学习经验可以分享吗?

恭&#xfffd;&#xfffd;您完成软考考试&#xff01;备考软考确实是一项艰苦的任务&#xff0c;但也是一次很有收获的学习和成长过程。下面分享一些备考心得和学习经验&#xff0c;以及针对系统集成项目管理工程师和信息系统项目管理师考试的备考建议&#xff1a; 备考心得…

PACS系统源码:支持三维重建功能、集成放射科管理RIS系统、图文报告编辑、打印、多级审核机制

PACS系统源码 PACS系统是以最新的IT技术为基础&#xff0c;遵循医疗卫生行业IHE/DICOM3.0和HL7标准&#xff0c;开发的多功能服务器和阅片系统。通过简单高性能的阅片功能&#xff0c;支持繁忙时的影像诊断业务&#xff0c;拥有保存影像的院内Web传输及离线影像等功能&#xf…

【Android】APP网络优化学习笔记

网络优化原因 进行网络优化对于移动应用程序而言非常重要&#xff0c;原因如下&#xff1a; 用户体验&#xff1a; 网络连接是移动应用程序的核心功能之一。通过进行网络优化&#xff0c;可以提高应用的加载速度和响应速度&#xff0c;减少用户等待时间&#xff0c;提供更流…

跨境电商还有人在做吗,这十大选品技巧建议收藏!

随着电商的快速发展&#xff0c;无论国内或者国外电商&#xff0c;竞争都比较激烈&#xff0c;很多人觉得现在入行太晚了&#xff0c;玩不过那些老卖家。 不过我想说的是&#xff1a;做电商很重要的一点就是选品&#xff0c;那些很早一批老卖家可能也是借着红利期走过来的&…

ATFX汇市:美联储加息25基点,虽提振美指,或招致衰退

环球汇市行情摘要—— 上周&#xff0c;美元指数上涨0.6%&#xff0c;收盘在101.7点&#xff0c; 欧元贬值0.96%&#xff0c;收盘价1.1017点&#xff1b; 日元升值0.47%&#xff0c;收盘价141.16点&#xff1b; 英镑贬值0.01%&#xff0c;收盘价1.2852点&#xff1b; 瑞郎…

微信小程序配置上传多个u-upload上传

微信小程序配置上传多个u-upload上传 使用的是uView框架 微信小程序配置上传多个u-upload上传图片 场景需求&#xff1a;根据PC端配置项追加图片配置 小程序根据配置的图片数量&#xff0c;图片名称&#xff0c;进行上传图片 难度在于 我们不知道用户会追加多少个图片配置字段 …

预测性维护和预防性维护的区别

预测性维护和预防性维护是两种不同的设备维护策略&#xff0c;它们在维护时机、方法和效果上存在明显的区别。在工业生产和设备管理中&#xff0c;选择适合的维护方式对于提高设备的可靠性、延长寿命以及降低维护成本至关重要。本文将深入探讨预测性维护和预防性维护的区别及其…

【LeetCode】剑指offer礼物的最大价值

礼物的最大价值 题目描述算法分析编程代码 链接: 礼物的最大价值 题目描述 算法分析 编程代码 class Solution { public:int maxValue(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();vector<vector<int>> dp(m1,vector…

开利网络受邀参与战略合作伙伴和合控股 聚焦数据价值

近日&#xff0c;开利网络战略合作伙伴和合控股组织的“数据聚焦价值&#xff0c;引导数据化转型”主体研讨会&#xff0c;开利网络作为和合控股的战略合作伙伴和“数利丰”应用技术合作方&#xff0c;受邀进行落地应用分享。 随着“数字中国”战略的提出&#xff0c;数据已然成…

【爬虫逆向案例】某易云音乐(评论)js逆向—— params、encSecKey解密

声明&#xff1a;本文只作学习研究&#xff0c;禁止用于非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01; 【爬虫逆向案例】某易云音乐&#xff08;评论&#xff09;js逆向—— params、encSecKey解密 1、前言2、行动…

day57|● 647. 回文子串 ● 516.最长回文子序列

647. 回文子串 https://leetcode.cn/problems/palindromic-substrings/solution/by-lfool-2mvg/ Given a string s, return the number of palindromic substrings in it. A string is a palindrome when it reads the same backward as forward. A substring is a contiguous…

【Spring事务学习】事务分类 隔离级别 事务传播机制

目录 需要知道&#xff1a; &#x1f351;1、什么是事务&#xff1f; &#x1f351;2、事务的主要操作3个 一、Spring中事务的实现方式 &#x1f351;1、编程式事务&#xff08;手动写代码操作事务&#xff09;&#xff08;了解&#xff09; &#x1f351;2、声明式事务&…

【模型预测控制MPC】使用离散、连续、线性或非线性模型对预测控制进行建模(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

营销服一体化CRM有哪些?5款CRM系统对比

如今&#xff0c;一个成熟的CRM产品体系已从过去单点销售管理转变为营销、服务、交易的客户全旅程覆盖。那么在这个互联网信息化时代&#xff0c;面对海量的信息&#xff0c;用户很难快速准确地找到属于自己感兴趣的内容的&#xff0c;所以用户画像、兴趣标签变得越来越重要。 …

TCP三次握手和四次挥手以及11种状态(二)

11种状态 1、一开始&#xff0c;建立连接之前服务器和客户端的状态都为CLOSED&#xff1b; 2、服务器创建socket后开始监听&#xff0c;变为LISTEN状态&#xff1b; 3、客户端请求建立连接&#xff0c;向服务器发送SYN报文&#xff0c;客户端的状态变味SYN_SENT&#xff1b; 4、…

低代码在数智化时代中的应用

随着科技的发展&#xff0c;企业从生产到经营中海量的数据持续被记录。数据是望远镜&#xff0c;发现完全不同的商业边界&#xff1b;数据是显微镜&#xff0c;判断肉眼察觉不到的消费和生活行为&#xff1b;数据是雷达&#xff0c;帮助企业提前预测未来的行为。 而通过人工智…

红宝石阅读笔记

第七章 迭代器与生成器 7.3 生成器 乍一看理解&#xff0c;仔细想没理解&#xff0c;然后自己让n2&#xff0c;还原nTimes&#xff0c;等价于 function* nTimes() {if (true) {yield* (function* A() {if (true) {yield* (function* B() { })();yield 0;}})();yield 1;} } 最…

测试libcurl库的demo时,报错 curl_easy_perform() failed: SSL connect error

系统&#xff1a;麒麟V10 arm roothg-TR3250:/home/cur765/curl-7.65.3/docs/examples# cat /etc/os-release NAME"Kylin" VERSION"银河麒麟桌面操作系统(国防版)V10" VERSION_US"Kylin Linux Desktop (GFB)V10" IDkylin ID_LIKEdebian PRETT…