Linux 进程概念

目录

冯诺依曼体系结构(了解)

周边知识 

操作系统

如何管理

解释打印

★库函数

★系统调用

进程

概念

PCB

结构示意图

系统调用

监控脚本

gitpid / gitppid

解释样例

chdir 

/proc

解释样例

运行起来后删除磁盘中小体积的可执行程序

fork

概念

创建子进程的目的

工作原理

程序从上往下运行

★进程是独立运行的

样例解释

为什么会fork有两个返回值? 

fork对于父子进程返回值不一样?

为什么id会有不同的值,确又是同一个地址?

总结


冯诺依曼体系结构(了解)

                                数据在硬件中的流通

周边知识 

  •  计算机里几乎所有的设备都有存储数据的能力
  • CPU的数据处理能力很强;内存(掉电易失性存储单元);外设,硬盘(ssd固态硬盘),磁盘(永久的存储介质,机械结构)
  • 设备交互的本质是数据的拷贝;存储的效率直接决定了拷贝的效率决定了设备和设备间通信的效率
  • 数据层面上,当代CPU一般不直接和外设交互,优先和内存交互
  • 内存可以理解为一个硬件级别的大的缓存
  • 冯诺依曼体系结构的本质是:用较少的钱,做出效率不错的计算机(高性价比)
  • 程序运行之必须先加载到内存,使CPU读取其可执行程序的内存和数据(计算机层面都为二进制)

操作系统

  • 操作系统是开机第一个加载的软件
  • 是一款软硬件资源管理的软件(对下手段),为了给用户提供高效,稳定,安全的运行环境

  • 底层硬件采取冯诺依曼的体系结构
  • 除了CPU和内存外都需要驱动程序
  • ★操作系统内部有大量的数据对象和数据结构
  • 操作系统之上不是用户而是系统调用

如何管理

  • 先描述(硬件的重要属性集合)被管理的对象;再通过数据结构将它们组织起来

解释打印

  • 往显示器打印的本质是往底层的硬件打印,操作系统不允许用户直接访问操作系统,那么更不会允许用户直接访问驱动程序或者对应的硬件,几乎用户的所有行为都必须贯彻操作系统,所以会通过printf这个库函数与操作系统的输出功能进行交互,然后由操作系统帮助向硬件打印
  • 所有语言中的大部分功能都和系统调用有关,所以printf必定封装了系统调用
  • 系统调用是上层访问下层的唯一通道

★库函数

  • 通常调用 系统调用 (因为底层封装了系统调用)来实现更高级别的功能
  • 库函数是应用程序调用的函数,通常是由编程语言的标准库或第三方库提供的

★系统调用

  • 是最底层的,是操作系统内核提供的接口,是程序与操作系统内核直接交互的接口
  • 允许用户的程序请求操作系统执行一些特权操作
  • 系统调用通常通过封装在标准库中的函数接口来访问

进程

概念

  • 可执行程序被加载到了内存,而操作系统为了更好管理进程,通过创建对应的PCB(进程 = 可执行程序 + 内核数据结构);管理的本质是管理PCB,数据(程序加载到内存的代码段和数据段...(二进制代码和数据))

PCB

  • 进程控制块(Process Control Block);进程的结构体对象
  • 包含多种属性:id,代码地址,数据地址,进程状态,优先级,链接字段...
  • 操作系统通过进程控制块来管理进程
  • task_struct是Linux内核中具体实现的PCB
  • PCB 是操作系统管理进程的核心数据结构,PCB 完全由操作系统内核创建、管理和销毁。因此,PCB 是操作系统内核的一部分
  • 描述进程的PCB在排队,而不是程序在排队

结构示意图

  •  task_struct 是用于描述每个进程的通用数据结构,所有进程(无论类型如何)都使用这个结构体
  • 纠正:如果在task_struct里实现链接,这也是合理的,链接又很多种方式
  • 一个进程的PCB可以在多个链表里,这是操作系统内核管理和调度进程的重要机制之一
  • 可以通过cur(list)宏 来得到task_struct的地址

系统调用

监控脚本

  • while :; do ps axj | head -1 && ps axj | grep mybin | grep -v "grep"; sleep 1; echo ""; done
  • 用于动态观察
  • grep命令启动的时候也包含mybin

gitpid / gitppid

  • pid:进程标识符,操作系统用来唯一标识每个进程的一个数字
  • 通过系统调用拿到pid或者ppid
  • kill -9 pid :kill的-9选项可以通过pid杀进程

解释样例

#include <stdio.h>    
#include <unistd.h>    
    
int main()    
{    
    printf("这个进程的pid:%d, ppid:%d\n", getpid(), getppid());        
    while(1)    
    {    
        sleep(1);                                       
    }    
    return 0;    
}

  • 发现32001是一个叫bash的进程
  • bash是shell(命令行解释器)的一种
  • 运行的ps axj命令的父进程是bash
  • 结论:通过命令行解释器(bash)启动的进程的父进程都是bash(bash在登陆后就不变了)
  • 启动进程意味着 进程一般是由其父进程创建

chdir 

/proc

  • 是一个虚拟文件系统,用于提供关于系统和进程的信息,每个正在运行的进程在 /proc 目录下都有一个对应的子目录,该子目录的名称就是该进程的进程ID
  • 是一个动态的目录结构,存放的是所有存在的进程,目录名就是进程的pid
  • ★exe指向了该进程当前正在执行的可执行文件的路径
  • cwdcurrent work directory 当前工作目录

解释样例
chdir("/home/wzf/Linux");//修改cwd路径
FILE* fp = fopen("test.txt", "w");
  • 会在/home/wzf/Linux的工作目录下创建test.txt文件
  • 这里的fopen也可以写成./text.txt,就是相对于cwd去比照
  • 结论:默认情况下,进程启动时所处的路径就是当前路径
  • 结论:每一个进程都要有自己的工作目录
运行起来后删除磁盘中小体积的可执行程序
  • 当一个可执行程序被加载到内存中执行时,文件的内容(机器指令,数据段,代码段,堆栈段)已经被操作系统读取并加载到内存中。此时,即使删除了文件系统中的可执行文件,已经在运行的进程不会受到影响
  • 如果这个可执行程序不是一次全加载到内存上的,进程当然受到影响

fork

概念

  • Linux 系统中,所有进程都是通过 fork() 机制派生出来的

创建子进程的目的

  • 让子进程协助父进程完成一些单进程解决不了的任务
  • 多进程多在服务端(简单来说需要同时处理多个客户端的请求),客户端较少

工作原理

  • 以父进程为模版,复制父进程的虚拟地址空间、文件描述符、寄存器状态等。子进程与父进程几乎完全相同,先全部拷贝到子进程再修改部分信息

程序从上往下运行

  • 进程运行时,CPU里有个(指令指针)eip寄存器(x86架构)/pc指针(arm架构),会保存当前正在执行的指令的地址;当处理器执行一条指令时,eip会指向下一条指令的地址;eip寄存器的值 也会被子进程继承

★进程是独立运行的

  • ★每个进程有自己独立的上下文,包含寄存器状态、内存映射;当进程在 CPU 上运行时,操作系统会加载该进程的上下文到 CPU 中,父进程和子进程虽然共享相同的 EIP 值,但在实际执行时,它们是独立运行的,因为它们拥有各自的进程上下文

样例解释

#include <stdio.h>    
#include <sys/types.h>    
#include <unistd.h>    
    
int main()    
{    
    pid_t id = fork();    
    if(id < 0)    
        return -1;    
    else if(id == 0)    
    {    
        while(1)    
        {    
            printf("子进程的pid:%d, ppid:%d, &id=%p\n", getpid(), getppid(), &id);    
            sleep(1);    
        }    
    }    
    else    
    {    
        while(1)                                                                                         
        {    
            printf("父进程的pid:%d, ppid:%d, &id=%p\n", getpid(), getppid(), &id);    
            sleep(1);    
        }    
    }    
}

为什么会fork有两个返回值? 
  • 因为子进程在fork的return之前就已经创建好了(eip也被拷贝了),所以return语句子进程也要执行,那么就会有两个返回值
fork对于父子进程返回值不一样?
  • 返回子进程的 PID,这允许父进程知道子进程已经成功创建,并且可以使用这个 PID 来管理子进程,比如等待它终止或者发送信号
  • 在子进程中,fork 返回0 ;这是为了让子进程识别自己,并执行与父进程不同的操作
为什么id会有不同的值,确又是同一个地址?
  • 虚拟地址空间详解

总结

  1. 了解冯诺依曼结构及周边知识
  2. 操作系统的了解
  3. 进程和内核数据结构PCB
  4. cwd,pwd就是打印出cwd
  5. ★fork的理解,样例的解释

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

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

相关文章

RHCSA第二次作业

4、将整个 /etc 目录下的文件全部打包并用 gzip 压缩成/back/etcback.tar.gz 5、使当前用户永久生效的命令别名&#xff1a;写一个命令命为hello,实现的功能为每输入一次hello命令&#xff0c;就有hello&#xff0c;everyone写入文件/file.txt中。 6、创建mygroup组群&#xff…

IDEA关联Tomcat——最新版本IDEA 2024

1.链接Tomcat到IDEA上 添加Tomcat到IDEA上有两种方式&#xff1a; 第一种&#xff1a; &#xff08;1&#xff09;首先&#xff0c;来到欢迎界面&#xff0c;找到左侧的Customize选项 &#xff08;2&#xff09;然后找到Build、Execution、Deployment选项 &#xff08;3&am…

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…

Java 输入与输出(I/O)之字节流、字符流与转换流

Java 输入/输出流&#xff08;Input/Output&#xff0c;简称I/O&#xff09;是Java语言用于读写数据的API&#xff0c;它提供了一系列类和接口&#xff0c;用于读取和写入各种类型的数据信息。 I/O流按数据单元&#xff08;粒度大小&#xff09;可分为字节流&#xff08;以字节…

什么样的JSON编辑器才好用

简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也便于机器解析和生成。随着互联网和应用程序的快速发展&#xff0c;JSON已经成为数据传输和存储的主要格式之一。在处理和编辑JSON数据…

太速科技-212-RCP-601 CPCI刀片计算机

RCP-601 CPCI刀片计算机 一、产品简介 RCP-601是一款基于Intel i7双核四线程的高性能CPCI刀片式计算机&#xff0c;同时&#xff0c;将CPCI产品的欧卡结构及其可靠性、可维护性、可管理性与计算机的抗振动、抗冲击、抗宽温环境急剧变化等恶劣环境特性进行融合。产品特别…

unity开发之可视化制作动画

录制动画 1&#xff09;打开录制动画页面&#xff08;或者按快捷键ctrl6&#xff09; 2&#xff09;选中需要录制动画的对象 3&#xff09;创建动画列表&#xff0c;注意现在还没有录制动画&#xff0c;我这里创建了开门和关门动画列表 4&#xff09;选择需要录制动画的对象的相…

python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)

文章目录 1、任务目标2、网页分析3、代码编写 1、任务目标 目标网站&#xff1a;B站视频&#xff08;https://www.bilibili.com/video/BV1se41117WP/?vd_sourcee8e376ccbc5aa4cfd88e6a7917adfd1a&#xff09;&#xff0c;用于本文测验 要求&#xff1a;抓取该网址下的视频&…

大数据-190 Elasticsearch - ELK 日志分析实战 - 配置启动 Filebeat Logstash

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置

提醒 本文实例是使用uniapp进行开发演示的。 一、需求场景 在开发商品&#xff08;SKU&#xff09;列表页面时&#xff0c;通常有三个需求&#xff1a; 页面下拉刷新&#xff0c;第一页展示最新数据&#xff1b;上拉加载更多数据&#xff1b;列表页面可以滚动到指定位置&#x…

如何为工业未来赋能?通过CodeMeter为工业企业开辟工业自动化安全与灵活性之道

在现代工业自动化领域&#xff0c;数字化转型已经成为不可逆的趋势。然而&#xff0c;要将新一代的自动化软件与传统设备集成&#xff0c;企业面临的不仅是技术上的复杂性&#xff0c;更是如何有效保护宝贵的知识产权并实现灵活管理的严峻挑战。菲尼克斯电气&#xff08;Phoeni…

HTML5教程(一)- 网页与开发工具

1. 什么是网页 网页 基于浏览器阅读的应用程序&#xff0c;是数据&#xff08;文本、图像、视频、声音、链接等&#xff09;展示的载体常见的是以 .html 或 .htm 结尾的文件 网站 使用 HTML 等制作的用于展示特定内容相关的网页集合。 2. 网页的组成 浏览器 代替用户向服务…

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)

文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…

C语言 动态数据结构的C语言实现单向链表-2

建立一个单向链表 在单向链表中查找节点---查找尾节点 在单向链表中查找节点 --- 查找第 n 个节点 向单向链表中插入一个节点 向单向链表的尾部插入一个节点 向单向链表中某节点后插入一个节点 向单向链表中插入一个节点 删除单向链表中的某一节点 链表 vs 数组 动态数据结构

C++核心编程和桌面应用开发 第十五天(deque/stack/queue)

目录 1.deque容器 1.1构造和赋值&#xff08;同vector类似&#xff09; 1.2大小操作 1.3插入和删除 1.5数据存取 1.6排序&#xff08;升序&#xff09; 2.stack容器 3.queue容器 1.deque容器 1.1构造和赋值&#xff08;同vector类似&#xff09; deque内部工作原理&a…

湖北省自闭症全托管:为您推荐湖北省的自闭症服务机构

原文指路&#xff1a;http://www.zibizhengwang.com/page35.html 自闭症&#xff0c;这一复杂而神秘的神经发育障碍&#xff0c;长久以来困扰着无数家庭。它不仅影响着儿童的社交互动、沟通能力&#xff0c;还常常伴随着行为问题和感官过敏。面对这一挑战&#xff0c;湖北省内…

HTML静态网页作业成品(HTML+CSS)——动漫犬夜叉主题网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码1、HTML代码2、CSS部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用DIVCSS布局&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二…

使用Python来下一场深夜雪

效果图&#xff1a;&#xff08;真实情况是动态的&#xff09; 完整代码&#xff1a; import turtle import random# 初始化画布 turtle.bgcolor("#001f3f") # 偏深蓝色的背景 turtle.title("下雪的画面") turtle.speed(0) turtle.hideturtle() turtle.t…

ffmpeg视频滤镜:定向模糊-dblur

滤镜简述 dblur 官网链接 > https://ffmpeg.org/ffmpeg-filters.html#dblur 有一个模糊滤镜&#xff0c;我试了一下&#xff0c;没有感觉到它的特殊之处, 这里简单介绍一下。 滤镜使用 滤镜的参数 angle <float> ..FV.....T. set angle (from 0 t…

基于neo4j的旅游知识图谱维护与问答系统

你还在为毕业设计发愁吗&#xff1f;试试这个基于Neo4j的旅游知识图谱维护与问答系统吧&#xff01;这套系统不仅功能强大&#xff0c;而且几乎涵盖了你需要的一切&#xff0c;完美助力你的毕业项目&#xff01; 系统介绍 该系统是专门针对旅游景点信息的知识图谱工具&#x…