linux(进程概念)

目录

前言:

正文 

冯诺依曼体系结构 

操作系统 (Operator System)

概念

 目的 

定位 

如何理解“管理” 

进程组织

基本概念 

内核数据结构

代码和数据 

查看进程 

ps指令 

top指令 

 父子进程

 fork创建进程

小结:



前言:

在进入进程的学习之前先整理进程这个章节重点:

  • 认识冯诺依曼系统
  • 操作系统概念与定位
  • 深入理解进程概念,了解PCB
  • 学习进程状态,学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害
  • 了解进程调度,Linux进程优先级,理解进程竞争性与独立性,理解并行与并发
  • 理解环境变量,熟悉常见环境变量及相关指令, getenv/setenv函数
  • 理解C内存空间分配规律,了解进程内存映像和应用程序区别, 认识地址空间

正文 

冯诺依曼体系结构 

        常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系 

 

各组成部分如下:

  • 输入设备:键盘鼠标声卡网卡摄像头 等
  • 输出设备:显示屏喇叭网卡打印机 等
  • 存储器:只读存储器随机存取存储器
  • 运算器+控制器:CPU中央处理器

注意:

输入、输出设备 称为外围设备,即 外设,而 外设 一般都会比较慢,比如磁盘网卡等;CPU中央处理 的速度是最快的,通过与存储器的配合,可以做到高效率处理数据(后面涉及到进程状态详细说);对数据进行预加载,CPU 计算时,直接向存储器要数据就行了,效率很高。

关于冯诺依曼,必须强调几点:
这里的存储器指的是内存
不考虑缓存情况,这里的 CPU 能且只能对内存进行读写,不能访问外设 ( 输入或输出设备 )
外设 ( 输入或输出设备 )要输入或者输出数据,也只能写入内存或者从内存中读取。 一句话,所有设备都 只能直接和内存打交道

操作系统 (Operator System)

概念

 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库, shell 程序等等)

 目的 

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

定位 

        普通用户无法直接与计算机中的硬件打交道,也就是说,在没有 操作系统 的情况下,我们几乎是无法使用计算机的,于是一些计算机大牛就创造出了各种好用的 操作系统因此操作系统它是一款进行软硬件资源管理的软件 

如何理解“管理” 

 一句话:先描述,再组织。这六字真言就像学习linux的指路明灯。

  • 描述:通过 struct 结构体对各种数据进行描述
  • 组织:通过 链表 等高效的数据结构对数据进行组织管理

具体逻辑接口如下图所示:

 

进程组织

基本概念 

 一般课本概念:进程 是程序的一个执行实例,是正在执行的程序(这种说法不全面)

 补充概念:进程 由两边组成,分别是 内核数据结构+代码和数据

内核数据结构

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCBprocess control block),Linux操作系统下的PCB: task_struct

 

 

task_ struct 内容分类
  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]
  • IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

代码和数据 

 数据生万物,任何一个进程都有自己的代码和数据,比如我们常见的 C语言 源文件,经过编译后生成的可执行程序中,就包含着二进制代码和其创建修改的时间、所处位置信息

 

注: ./可执行程序 其实就是将可执行程序加载至内存中,再执行描述+组织

查看进程 

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

如:要获取pid为1的进程信息,需要查看/proc/1这个文件夹、

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

ps指令 

 

$ ps ajx | head -1 && ps ajx | grep 进程名 | grep -v grep

 功能: 查看进程信息,其中利用管道进行了信息筛选,使得进程信息更加清晰(-v取反将查找的grep取消)

 因为查看进程的指令太长了,所以我们可以结合前面学的自动化构建工具 make ,编写一个 Makefile 文件,文件内容如下所示:

 

myprocess:process.cgcc -o myprocess process.c.PHONY:clean
clean:rm -r myprocess.PHONY:catP
catP:ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep

 其中的 make catP 指令就是我们刚刚查看 进程 的那一大串指令

 

top指令 

$ top

 这个指令之前有介绍过,相当于Windows中的 ctrl+alt+del 调出任务管理器一样,top 指令能直接调起 Linux 中的任务管理器,显然,任务管理器中包含有进程相关信息

 

 父子进程

进程间存在 父子关系

比如在当前 bash 分支下运行程序,那么程序的 父进程 就是当前 bash 分支

其中,PID 是当前进程的ID,PPID 就是当前进程所属 父进程 的ID
我们一样可以通过函数来查看 父进程 的ID值

 

 fork创建进程

 fork 函数是一个非常重要的函数,它能在当前进程下主动创建 子进程 ,用于程序中
编写代码如下:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>/** 测试fork创建子进程* 理解fork函数的返回值* 通过if语句进行分流* 总结:fork创建子进程成功时,给父进程返回子进程PID,给子进程返回0,如果失败返回-1;通过两次fork可以发现当父进程执行后,才会去执行子进程,父子进程间存在独立性,即父进程被kill后,子进程任然可以运行,父子进程间存在写时拷贝机制,当子进程的值发生改变时,只会作用于子进程中*/int main()
{pid_t ret = fork(); //获取返回值int val = 1;  //比较值if(ret == 0){//在子进程内再创建(孙)子进程pid_t rett = fork();if(rett > 0){while(1){val = 2;  //写时拷贝printf("二代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);sleep(1);}}else if(rett == 0){while(1){val = 3;  //写时拷贝printf("三代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);sleep(1);}}elseprintf("进程创建失败\n");}else if(ret > 0){while(1){val = 1;  //写时拷贝printf("一代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);sleep(1);}}elseprintf("进程创建失败\n");return 0;
}

 

 

不难发现,子进程 是否出现取决于在当前进程中是否调用 fork 函数

fork函数工作原理:

fork 创建子进程时,会新建一个属于子进程 的 PCB ,然后把父进程 PCB 的大部分数据拷贝过来添加自己属性,暂时两者共享一份代码和数据。
各进程间是相互独立的,包括父子进程。这句话的含义是当我们销毁 父进程 后,它所创建的 子进程 并不会跟着被销毁,而是被 init 1号进程接管,成为一个 孤儿进程。
具体表现如下:

 fork 创建子进程时还存在 写时拷贝 这种现象,即存在一个全局变量,当父进程的改变值时,不会影响子进程的值,同理子进程也不会影响父进程,再次印证 相互独立 这个现象。

 

父子进程相互独立的原因:

代码是只读的,两者互不影响
数据:当其中一个执行流尝试修改数据时,OS 会给当前进程触发发生写时拷贝,随着进程的推进,会进行详细介绍。

小结:

bash 命令行解释器本质上也是一个进程,可以被销毁
命令行启动的所有程序,最终都会变成进程,而该进程对应的父进程都是 bash
父进程被销毁后,子进程会变成 孤儿进程
进程间具有独立性,包括父子进程
因为 写时拷贝 机制,父进程不会影响到子进程

 

 

 

 

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

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

相关文章

【Redis】Redis有哪些适合的场景

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Redis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 &#xff08;1&#xff09;会话缓存&#xff08;Session Cache&#xff09; &#xff08;2&#xff09;全页缓存&#xff08;FPC…

深入理解TCP网络协议(1)

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…

Windows 7 x64 SP1 安装 Google Chrome 109.0.5414.120 (正式版本) (64 位)

1 使用 IE 浏览器 输入网址 Google Chrome 网络浏览器得益于 Google 智能工具&#xff0c;Chrome 现在更易用、更安全、更快速。https://www.google.cn/chrome/&#xff0c;点击下载 Chrome。 2 点击 接受并安装。 3 提示。 4 保存。 5 双击 运行 ChromeSetup.exe。 6 等待安…

9.异步爬虫

异步爬虫可以理解为非只单线程爬虫 我们下面做个例子&#xff0c;之前我们通过单线程爬取过梨视频 https://blog.csdn.net/potato123232/article/details/135672504 在保存视频的时候会慢一些&#xff0c;为了提升效率&#xff0c;我们使用异步爬虫爬取 目录 1 线程池 2 …

类和对象 第五部分第三小节:递增运算符重载

作用&#xff1a;通过重载递增运算符&#xff0c;实现自己的整型数据递增 代码案例 1.重载前置运算符 #include <iostream> #include <string> using namespace std;class MyInteger {friend ostream& operator<<(ostream& out, const MyInteger&…

简盒工具箱iapp源码

一款工具箱兼做软件库。 新增远程更新功能 修复了部分失效功能 修复了偶尔会卡在启动页的情况 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88776737 更多资源下载&#xff1a;关注我。

Open CASCADE学习|读取STEP文件并显示

STEP文件是基于ISO 10303标准创建的三维模型数据交换文件&#xff0c;也称为产品模型数据交换标准&#xff08;Standard Exchange of Product data model&#xff09;。这种文件格式旨在提供一个不依赖具体系统的中性机制&#xff0c;实现产品数据的交换和共享。 STEP文件是一…

C#实现带光标的截图

1&#xff0c;目的&#xff1a; 可通过热键实现带光标与不带光标两种模式的截图。 2&#xff0c;知识点&#xff1a; 快捷键的注册与注销。 [DllImport("user32.dll", SetLastError true)] public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyMo…

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以看做一个动态规划问题。其中&#xff0c;字符串s是背包&#xff0c;而字典中的单词就是物品。…

Dubbo框架注册中心-Zookeeper搭建

Dubbo 是阿里巴巴公司开源的高性能、轻量级的Java RPC框架&#xff0c;致力于提供高性能。 Dubbo官网 本篇开始dubbo的第一篇&#xff0c;注册中心 ZooKeeper 环境搭建。 环境前置&#xff1a;由于Zookeeper是基于Java环境&#xff0c;必须安装有JDK。查看命令 java -version。…

服务端开发小记01——Tomcat

Tomcat Tomcat简介Tomcat在Linux下的安装Tomcat验证Tomcat常用命令&#xff08;Linux下&#xff09; Tomcat简介 Tomcat是一个Web容器&#xff0c;JavaEE程序可以在此运行。Tomcat是一个中间件&#xff0c;在B/S架构中&#xff0c;浏览器发出的http请求经过tpmcat中间件&#…

降压模块LM2596S的操作使用

一、技术参数 二、使用说明 1.引脚说明&#xff1a; IN输入正极 IN-输入负极 OUT输出正极 OUT-输出负极 2.输入电压范围&#xff1a;直流3.2V 至 46V (输入的电压必须比要输出的电压高1.5V以上。不能升压) 3.输出电压范围&#xff1a;直流 1.25V至 35V 电压连续可调&#…

SBDD的节点选择(Node selection)和树的扩展(Tree expansion)的操作是怎么进行的?

Node selection: 1&#xff09;选择规则&#xff1a; “focus atom”是从生成的原子中选出的&#xff0c;如果一个原子没有“capped”&#xff0c;那么它就可以被选为“focus atom”。 一个原子被“capped”是因为它的化合价约束&#xff08;valency constraint&#xff09;…

内网安全:NTLM-Relay

目录 NTLM认证过程以及攻击面 NTLM Relay攻击 NTLM攻击总结 实验环境说明 域横向移动&#xff1a;NTLM中继攻击 攻击条件 实战一&#xff1a;NTLM中继攻击-CS转发上线MSF 原理示意图 一. CS代理转发 二. MSF架设路由 三. 适用smb_relay模块进行中继攻击 域横向移动…

【李宏毅机器学习】Transformer 内容补充

视频来源&#xff1a;10.【李宏毅机器学习2021】自注意力机制 (Self-attention) (上)_哔哩哔哩_bilibili 发现一个奇怪的地方&#xff0c;如果直接看ML/DL的课程的话&#xff0c;有很多都是不完整的。开始思考是不是要科学上网。 本文用作Transformer - Attention is all you…

ASP.NET Core基础之用扩展方法封装服务配置

阅读本文你的收获 了解C#中的扩展方法机制学会在ASP.NET Core 中&#xff0c;用扩展方法封装服务配置&#xff0c;使得代码更加简洁 一、什么是扩展方法 扩展方法使能够向现有类型添加方法&#xff0c;而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法…

Python笔记12-多线程、网络编程、正则表达式

文章目录 多线程网络编程正则表达式 多线程 现代操作系统比如Mac OS X&#xff0c;UNIX&#xff0c;Linux&#xff0c;Windows等&#xff0c;都是支持“多任务”的操作系统。 进程&#xff1a; 就是一个程序&#xff0c;运行在系统之上&#xff0c;那么便称之这个程序为一个运…

CTF CRYPTO 密码学-7

题目名称&#xff1a;敲击 题目描述&#xff1a; 让我们回到最开始的地方 0110011001101100011000010110011101111011011000110110010100110011011001010011010100110000001100100110001100101101001101000011100001100011001110010010110100110100011001000011010100110000…

微搭低代码从入门到精通01应用介绍

目录 1 学习路线图2 应用介绍3 编辑器介绍总结 低代码的概念于2014年由 Forrester 首次正式提出。其将低代码定义为&#xff1a;能够以“最少的手写代码”和设置快速开发应用、配置和部署业务应用程序。 不同应用厂商的解法不一样&#xff0c;Gartner评估了400多款低代码/无代码…

Spark Exchange节点和Partitioning

​Exchange 在explain时&#xff0c;常看到Exchange节点&#xff0c;这个节点其实就是发生了数据交换 此图片来自于网络截取 BroadcastExchangeExec 主要是用来广播的 ShuffleExchangeExec 里面决定了数据分布的方式和采用哪种shuffle 在这里可以看到好几种不同的分区器 shuf…