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

【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)结束

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023软件设计师中级备考经验分享(文中有资料链接分享)

先摊结论吧&#xff0c;软考中级设计师备考只是备考半个月&#xff08;期间还摆烂了几天&#xff09;&#xff0c;然而成绩如下&#xff1a; 我自己都没想到会这么好的成绩。。。 上午题&#xff1a;推荐把软考通APP里的历年真题刷3-4遍&#xff0c;直接刷真题&#xff0c;然后…

分享一些精选的开源框架与代码!

今天主要是收集并精选了一些自己所了解和学习过的优秀的嵌入式开源框架代码和项目&#xff0c;不太了解的就不推荐给大家了&#xff0c;因为开源的东西实在是太多了&#xff0c;鱼龙混杂&#xff0c;所以取其精华去其糟粕是迫在眉睫的大事~ 当然也不要总是沉浸在开源的东西之中…

光伏、储能一体化监控及运维解决方案

前言 今年以来&#xff0c;在政策利好推动下光伏、风力发电、电化学储能及抽水蓄能等新能源行业发展迅速&#xff0c;装机容量均大幅度增长&#xff0c;新能源发电已经成为新型电力系统重要的组成部分&#xff0c;同时这也导致新型电力系统比传统的电力系统更为复杂&#xff0…

基于多任务学习卷积神经网络的皮肤损伤联合分割与分类

文章目录 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network摘要本文方法实验结果 Joint segmentation and classification of skin lesions via a multi-task learning convolutional neural network 摘要 在…

idea 里 controller service impl mapper xml 切换跳转快捷键

首先在controller层&#xff0c;对着接口点方法的方法上按着ctrl和鼠标左键&#xff0c;你会进入service层。 对着方法ctrlaltb不按鼠标&#xff0c;你会进入impl层。service层的方法上按ctrl和鼠标左键会回到controller&#xff0c;ctrlaltb不按鼠标也会进入到impl层,impl上的…

vue echart3个饼图

概览&#xff1a;根据UI设计需要做3个饼图且之间有关联&#xff0c;并且处理后端返回的数据。 参考链接&#xff1a; echart 官网的一个案例&#xff0c;3个饼图 实现思路&#xff1a; 根据案例&#xff0c;把数据处理成对应的。 参考代码&#xff1a; 1.处理后端数据&am…

谐音标注外语发音的学习方式,早该终结了!

语言学习的热潮席卷全国&#xff0c;在多数80、90后记忆里尤为深刻&#xff0c;部分对外语过敏的同学&#xff0c;就像溺水的鱼&#xff0c;使劲扑棱也无济于事&#xff0c;难受但是死不了&#xff0c;在懵懂的年纪就被“摧残”了整个青春。 记忆中遇到记不住读音的单词&#x…

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…

DEVICENET转ETHERNET/IP网关devicenet协议

捷米JM-EIP-DNT&#xff0c;你听说过吗&#xff1f;这是一款自主研发的ETHERNET/IP从站功能的通讯网关&#xff0c;它能够连接DEVICENET总线和ETHERNET/IP网络&#xff0c;从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…

对原型、原型链的理解

在 JavaScript 中是使用构造两数来新建一个对象的&#xff0c;每一个构造函数的内部都有一个 prototype 属性&#xff0c;它的属性值是一个对象&#xff0c;这个对象包含了可以由该构造西数的所有实例共享的属性和方法。当使用构造函数新建一个对象后&#xff0c;在这个对象的内…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

每天一个电商API分享:淘宝/天猫关键字搜索店铺列表 API

淘宝/天猫搜索店铺列表 API 是一个强大而灵活的工具&#xff0c;可以帮助开发者在自己的应用中集成淘宝/天猫搜索店铺列表的功能。通过这个 API&#xff0c;开发者可以获取指定关键词下的店铺列表&#xff0c;并根据自己的需求自定义搜索条件。该 API 提供丰富的参数选项&#…

【爬虫案例】用Python爬取iPhone14的电商平台评论

用python爬取某电商网站的iPhone14评论数据&#xff0c; 爬取目标&#xff1a; 核心代码如下&#xff1a; 爬取到的5分好评&#xff1a; 爬取到的3分中评&#xff1a; 爬取到的1分差评&#xff1a; 所以说&#xff0c;用python开发爬虫真的很方面&#xff01; 您好&…

redis 高级篇4 分布式锁

一 redis架构图 1.1 redis的架构图 1.2 分布式锁满足条件 1.独占性&#xff1b;2.高可用&#xff1b;3.防死锁&#xff1b;4.不乱抢&#xff1b;5.重入性 二 分布式锁的案例情况 2.1 分布式锁1:单机分布式部署 描述&#xff1a; 使用lock锁和synchronized&#xff0c;单机…

狄耐克带着爱与希望,踏上了又一段关于奉献的旅程

路在脚下&#xff0c; 狄耐克紧盯科技前沿&#xff0c; 聚焦国家发展战略和人民美好生活需要&#xff0c; 在智慧社区和智慧医院领域 敢于筑梦、勇于追梦、勤于圆梦&#xff1b; 心系远方&#xff0c; 狄耐克真情投入奉献事业&#xff0c; 将爱与希望的种子撒向全国各地…

基于C语言 --- 自己写一个三子棋小游戏

C语言程序设计笔记---019 初阶三子棋小游戏(开源)1、arr_main.c程序大纲2、arr_game1.h3、arr_game1.c3.1、 自定义初识化函数 InitBoard( ) 和 自定义显示函数 DisPlayBoard( )3.2、 自定义玩家下棋函数 PlayerMove( )3.4、 自定义电脑下棋函数 ComputerMove( )3.5、 输赢判断…

【Linux下6818开发板(ARM)】SecureCRT串口和交叉编译工具(巨细版!)

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

【前端知识】React 基础巩固(四十)——Navigate导航

React 基础巩固(四十)——Navigate导航 一、Navigate的基本使用 新建Login页面&#xff0c;在Login中引入Navigate&#xff0c;实现点击登陆按钮跳转至/home路径下&#xff1a; import React, { PureComponent } from "react"; import { Navigate } from "reac…

Windows环境下安装及部署Nginx

一、安装Nginx教程 1、官网下载地址&#xff1a;https://nginx.org/en/download.html 2、下载教程&#xff1a;选择Stable version版本下载到本地 3、下载完成后&#xff0c;解压放入本地非中文的文件夹中&#xff1a; 4、启动nginx&#xff1a;双击nginx.exe&#xff0c;若双击…

Java小型操作系统模拟(采用策略模式结合反射进行搭建,支持一些简单的命令)

Java小型操作系统模拟 项目说明第一阶段&#xff1a;反射结合策略模式搭建基本的命令结构第二阶段&#xff1a;注解结合反射与策略模式&#xff0c;将结构进一步规范第三阶段&#xff1a;开启新的窗口&#xff0c;将控制台输入切换到新窗口中&#xff0c;同时创建右键菜单&…