Linux——进程初步

学进程前我们需要知道什么?

一、冯诺依曼体系结构

图中就是我们电脑运作时的大致工作流程,其中输入设备、输出设备我们也叫外设。其中,输入设备有比如键盘、鼠标、磁盘、摄像头等。输出设备有显示器、磁盘、打印机等。图中的存储器我们也叫内存,用黄色框起来的部分叫中央处理器也就是CPU。通过这个图片我们需要知道一个点:

CPU在数据层面,不会和外设直接打交道,只会和内存进行交互,也就是CPU想获取信息只能从内存部分提取而不能直接从外设获得。并且,任何程序,运行时都必须先被加载到内存然后进行处理。

这也是有我们的体系结构决定的。代码->可执行程序->运行->加载到内存。我们通俗一点来说,就是我们的输入设备获取我们要输入的信息,然后把文件交给内存,CPU获取内存里的文件并转换成机器可以识别的文件然后再还给内存再输出。这么看来,内存这个东西似乎有点多余,貌似我把内存去掉,直接输入->CPU->输出更便利些。但这样的设计其实并不合理,我们从速度来讲,外设的速度是远低于我们CPU的工作速度的,但由于木桶效应,我们实际的运行速度只会参考外设的速度作为实际速度,同时由于经济原因,如果我们想把外设换成高速配件又太贵,因此我们用内存作为桥梁,它的地位在中间,经济适中且速度不慢也不快,我们让外设和CPU分别和内存交互就可以提高速度了。

二、操作系统的基本概念

操作系统本质分为内核和其他程序,其中前者包含进程管理,内存管理,文件管理,驱动管理。后者也是操作系统不可或缺的一部分,包括函数库,shell程序等等。操作系统是一种进行软硬件资源管理的软件。

三、操作系统如何进行资源管理

管理的本质是对数据进行管理,从下图我们得知,操作系统向上通过管理数据向用户提供一个有效便利的工具进行操作,向下对数据进行有效管理。我们先向下看,研究一下操作系统是如何管理硬件资源的。

我们发现,操作系统和硬件部分并没有直接的联系方式,只能靠中间角色——驱动程序实现上对下的决策,下向上的数据获取。而我们的操作系统以决策为主,驱动部分以执行决策为主,这样就能获取数据了。

但具体细节是怎样呢?虽然每个硬件不一样,但其有大致相同的属性,操作系统用类似结构体封装的方法把每个硬件封装起来,然后如果有新的硬件加入,就可以通过驱动程序报告操作系统,然后操作系统再进行修改。

操作系统向下的管理我们基本了解了,接下来看一下它是如何向上运作便于用户使用呢?

其实就和银行的运作原理是类似的,我们到银行办理业务,正常来说要找业务员进行办理,但实际上,如果我们知道办公的原理,跳过业务员这一步自己办理也是可以的,但是这会大大增加风险,我们不能保证每个人都能顺理成章地完成自己的工作,难免会有失误,因此银行为了避免这种情况,直接封死了客户自行办公的途径,同时又开放了一个新的路径——业务员窗口办公,这样就可以了。我们换到操作系统层面,我们要想对硬件进行写入等操作,并不是直接对硬件进行操作,而是需要经过上图的整个流程,所以,操作系统必须向上提供开放各种接口,方便上层使用并保证下层体系的安全稳定——system call(系统调用接口)。

这部分的意义在哪里呢?其实,我们的红色部分的使用,需要我们对系统有一定了解的人才可以顺利地使用,比如程序员,像很多电脑小白连打字都不熟练自然也就不知道这些底层逻辑,所以为了迎合大部分人的需求,需要再封装一个用户调用接口,再封装成库、shell外壳等接口,让大多数用户也可以便利使用。直接访问库就可以了,就不需要直接访问操作系统了。比如C标准库/C++标准库,我们平时的printf、scanf函数就是在访问这些库接口。

————以上是我们对于计算机结构体系的一些初步认识,下面开始讲解重点内容——进程

四、什么是进程

大多数课本的概念是——程序的一个执行实例,正在执行的程序等。更深一步的概念我们可以称进程是内核数据结构+程序的代码和数据。我们来解释一下这个概念

首先我们写的程序或文件都会加载到磁盘里,其中操作系统为了方便管理进程,把磁盘中的程序放进内存(黑框转移到绿框,本质是代码和数据,也就说书本上指的进程),然后根据我们前面操作系统管理硬件的原理参考,操作系统管理进程的方法,也是创建结构体记录进程的属性,其中内部还需要包括进程在内存的指针(可以通过指针查 找进程)和其他进程的结构体指针(使得管理成为一个数据结构的增删查改),在课本上这个结构体成为PCB(process control block),在Linux中成为task_struct,我们要找到一个进程只需要找到其对应的结构体地址即可找到。需要运行时,进程就会先从磁盘进入内存,被操作系统记录管理后再把代码和数据交给CPU处理。这个PCB就是操作系统管理进程的方式。

进程也是运行起来的程序,会被根据task_struct属性被操作系统调度器调度运行。

五、Linux下的进程

1.如何查看进程信息

首先我们需要知道一个知识点:当我们启动一个程序,就相当于启动一个进程,当程序运行时,代表着该进程一直存在。所以就会出现两种进程,一种是刚运行就结束的进程,比如函数的调用等,另一种是长期进程,像杀毒软件,长期在后台运行。

在Linux中,我们想查看系统有哪些进程,可以用ls /proc指令查看,这是因为,我们的根目录下有一个名为proc的文件夹

文件夹里就记录着此刻进行的所有进程

我们发现,这里还有很多以数字为名的文件夹,其实这些数字代表着每一个进程的pid,可以理解为地址,当我们启动一个进程时会生成一个pid,此文件夹有这个pid说明此时这个pid的进程正在运行。因此这些数字文件夹的里面就记录着进程的属性等信息了。我们可以用getpid()函数来获取某个进程的pid。

我们发现,当我们程序运行时,的确能在/proc中找到对应的数字文件夹,当我们把程序终止后就找不到了。

此外,终止程序除了我们了解的ctrl+c,还有kill命令,只需要在另一个终端输入即可。

kill -9 pid(你想要终止程序的pid)

进入某一进程的信息我们发现其实信息属性还是蛮多的,其中cwd和exe是比较重要的,exe会记录当前程序是在哪一路径下运行的,cwd就是当前工作目录,就是进程的cwd。更改cwd的方法可以用chdir函数

chdir(目标路径)

2.ppid

 ppid也就是父进程id,我们新创建任何进程的时候,都是由自己的父进程创建的(是父进程让操作系统创建)。我们可以用getppid函数获得父进程的id,我们在多次运行后发现,一个进程,它的pid是随机的,但ppid是一直不变的。这是因为,命令行中,执行命令/程序,本质是bash的进程创建的子进程,然后子进程来执行我们的代码。那么bash是如何创建新进程来执行程序的呢?

3.使用系统调用创建进程

刚才我们所新建的进程都是通过命令行输入指令实现的,如果不想通过这种方式采用系统调用接口来实现新建进程也可以,这个接口就是fork函数。

fork的功能是创建一个子进程,包含在unistd头文件中,其中fork的返回值是

 一旦我们通过fork成功创建子进程,它就会返回子进程的pid给父进程,返回0给子进程,失败返回-1。我们来看下面的代码

我们发现,第二个printf函数好像被执行了两次,那为什么第一个printf只执行一次呢?

原因是,当我们开始写这个程序的时候,进程已经开始了,也就是第一个printf也是进程,第二个printf前因为有fork,执行分支又一条变成了两条,两个分支都要运行,所以第二个printf会跑两次。我们还发现第二行和第三行的pid差1,第一行和第二行的pid又相同,所以第一个分支就是父进程(自己的进程,第一行的ppid就是bash),由fork创建的新分支就是子进程,而且一个父进程可以有多个子进程,Linux的进程也是树形结构。

我们改一下代码验证一下返回值的问题

我们发现,两个while居然同时运行了,也就是if和else if同时成立,这和我们之前的了解不一样啊,我们来解释一下。因为有fork函数,在fork以后就会有两个进程同时运行了,这两个进程会各自执行各自的代码,也就是导致条件不同(因为父子进程返回值的差异)。

父进程的数据是从磁盘获取的,子进程的数据是从父进程继承过来的。但数据却各有一份,即使修改也不会影响对方。

六、多进程代码样例

创建多进程的思路不难,只需要循环调用fork函数即可,我们通过结果发现,每一个子进程的ppid都是父进程的pid,体现了父子的关联性,而每一个子进程的pid都是相邻的,体现了树形结构。

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

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

相关文章

LeetCode-122. 买卖股票的最佳时机 II

其实这题画个折线图就很清晰了&#xff0c;因为我们每天都可以买卖股票&#xff0c;所有我们就只计算上升趋势的股票收益就好了&#xff0c;最小刻度为1&#xff0c;进行差值计算&#xff0c;取总和。 var maxProfit function(prices){let sum0;for(let i1;i<prices.leng…

关于前后端整合和打包成exe文件的个人的总结和思考

前言 感觉有很多东西&#xff0c;不知道写什么&#xff0c;随便写点吧。 正文 前后端合并 就不说怎么开发的&#xff0c;就说点个人感觉重要的东西。 前端用ReactViteaxios随便写一个demo&#xff0c;用于CRUD。 后端用Django REST Framework。 设置前端打包 import { …

Vue | 开学第一课!零基础教程

目录 背景介绍 安装方式 下载环境软件 NodeJS手册 如何查看node版本 镜像源 完整流程 创建根文件夹并拖进 VSCode 调用控制台 安装 vite 脚手架 配置项目 安装依赖 启动项目 查看页面 问题 创建项目失败 解决方法 权限问题 解决方法 其他问题 背景介绍 今…

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况&#xff0c;那么这里就有一些如下的注意事项&#xff0c;如以下代码&#xff1a; // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

Tomato靶机攻略

将tomato改为NAT模式 扫描ip arp-scan -l 扫描端口&#xff0c;发现ssh服务端口从22改为2211 扫描目录 发现http://192.168.31.134/antibot_image/ 访问 查看所有php文件的源码&#xff0c;看看有什么不同的地方 在info.php的源码中发现问题 在输入后&#xff0c;成功显示…

EasyRTC嵌入式音视频通话SDK:基于纯C语言的跨平台实时通信系统设计与实践

随着物联网、移动互联网的快速发展&#xff0c;实时音视频通信技术在智能硬件、远程协作、工业控制等领域广泛应用。然而&#xff0c;跨平台兼容性差、资源占用高、定制化难等问题&#xff0c;仍是传统RTC方案的痛点。 EasyRTC嵌入式音视频通话SDK凭借纯C语言设计与全平台覆盖…

HCIP复习拓扑练习(修改版)

拓扑&#xff1a; 实际&#xff1a; 需求&#xff1a; 需求分析 1.这意味着学校内部网络能够正常解析域名并进行互联网访问。 2. PC1和PC2处于同一个内网192.168.1.0/24&#xff0c;其中PC1有权限访问外部网段3.3.3.0/24&#xff0c;而PC2没有。这涉及ACL&#xff08;访问控制…

vue-next-admin修改配置指南

目录 1.如何开启侧边栏logo 2.修改侧边栏顶部的logo与文字 3.修改侧边栏路由logo 4.浏览器标题栏图标与文字修改 5.修改侧边栏的背景颜色、顶部导航栏背景颜色、字体颜色、激活时颜色等 6.去除或添加修改右上方放大、信息、头像昵称&#xff08;登录获取之后存储进行修改图…

ruoyi-cloud-plus编译记录-1

dockerfile部署jar 添加一个run configuration ‘ruoyi-nacos’ run configuration 参考Docker - 在IntelliJ IDEA中一键部署项目 - hucat - 博客园 jar包编译不成功&#xff0c;没有jar&#xff0c;docker部署nacos就没法进行下去 参考链接 maven 构建报错 This failure was…

【算法day8】整数反转

整数反转 https://leetcode.cn/problems/reverse-integer/description/ class Solution { public:int reverse(int x) {int MAX_LENGTH 11; // 32位整数的最大数字的位数int* num (int*)calloc(sizeof(int), MAX_LENGTH); //用于保存进位每一位的数字int current x;int pos…

MySQL库和表的操作详解:从创建库到表的管理全面指南

目录 一、MySQL库的操作详解 〇、登录MySQL 一、数据库的创建与字符集设置 1. 创建数据库的语法 2. 创建数据库示例 查看创建出来的文件: bash下查看MySQL创建的文件 二、字符集与校验规则 1. 查看系统默认设置 2. 查看支持的字符集与校验规则 3. 校验规则对查询的影响…

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

WPF 与 GMap.NET 结合实现雷达目标动态显示与地图绘制

概述 雷达上位机是雷达系统中用于数据可视化、分析和控制的核心软件。本文将介绍如何使用 C# 和 WPF 框架开发一个雷达上位机程序&#xff0c;主要功能包括&#xff1a; 显示目标轨迹&#xff1a;在界面上实时绘制雷达探测到的目标轨迹。点击显示详细信息&#xff1a;用户点击…

「string」笔记

参考&#xff1a;比特鹏哥 1. string string是一种类型&#xff0c;指的是字符串&#xff0c;比字符数组更高级 头文件 <string> #include <string>int main() {string a;//未初始化string b "good good";//初始化string c("good sfternoon&q…

AutoGen使用学习

AutoGen使用学习 上篇文件使用使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】&#xff0c;本次系统的学习autoGen的使用方法 文章目录 AutoGen使用学习[toc]1-核心知识点2-参考网址3-实战案例1-autoGen安装和基础使用主要功能安装方法使用示例注意事…

207、【图论】孤岛的总面积

题目 思路 相比于 206、【图论】岛屿数量&#xff0c;就是在这个代码的基础上。先遍历边界&#xff0c;将边界连接的岛屿变为0&#xff0c;然后再计算一遍当前为1的岛屿面积。 代码实现 import collectionsn, m list(map(int, input().split())) graph []for _ in range(n…

Python Selenium库入门使用,图文详细。附网页爬虫、web自动化操作等实战操作。

文章目录 前言1 创建conda环境安装Selenium库2 浏览器驱动下载&#xff08;以Chrome和Edge为例&#xff09;3 基础使用&#xff08;以Chrome为例演示&#xff09;3.1 与浏览器相关的操作3.1.1 打开/关闭浏览器3.1.2 访问指定域名的网页3.1.3 控制浏览器的窗口大小3.1.4 前进/后…

在芯片设计的后端流程中,通过metal修timing是什么意思,怎么实施。举个timing违例说明一下

芯片设计后端流程中通过Metal修Timing 在芯片设计后端流程中&#xff0c;"通过metal修timing"是指通过调整金属层布线来解决时序违例问题的一种技术手段。这是物理设计阶段常用的优化方法之一。 什么是通过Metal修Timing 在芯片设计中&#xff0c;Metal&#xff08;金…

【数据结构】List介绍

目录 1. 什么是List 2. 常见接口介绍 3. List的使用 1. 什么是List 在集合框架中&#xff0c;List是一个接口&#xff0c;继承自Collection。此时extends意为拓展 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&…

文件上传漏洞

pass-1 判断本关文件上传检测方式 ①显示源码 本pass在客户端使用js对不合法图片进行检查!js前端检测 2、针对防御措施进行绕过上传 通过JS 限制上传的文件类型&#xff0c;对于这种情况&#xff0c;我们可以采用以下几种方式绕过&#xff1a; 修改JS文件; 上传png后缀的…