Linux--进程(1)

目录

前言

1.冯诺依曼体系结构

2. 操作系统(Operator System)--第一个被加载的软件

3.进程 

3.1基本概念 

 3.2Linux中的PCB

 3.3通过系统调用创建子进程-fork初识

fork:创建一个子进程

为什么要创建子进程?

fork的原理:

进一步了解fork的返回值

demo代码(一次创建多个子进程)


前言

在学习进程之前,我们要明白先了解两个东西:

                                1.体系结构----硬件上

                                2.操作系统----软件上


1.冯诺依曼体系结构

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

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成

  • 输入单元:包括键盘, 鼠标,扫描仪, 写板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显示器,打印机,磁盘,显卡,网卡,声卡等

关于冯诺依曼,必须强调几点:

  • 这里的存储器指的是内存(掉电易失)
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
  • 一句话,所有设备都只能直接和内存打交道。

再谈一个问题,为什么在体系结构中要有内存?

        冯诺依曼体系结构中要有内存,主要是因为内存可以适配CPU与外设之间速度不匹配的问题,从而提高整机效率。
        在冯诺依曼体系结构中,CPU的速度最快,而输入输出设备是最慢的。这会导致从输入设备传入数据到CPU处理,再从CPU传出已处理的数据到输出设备,这些过程之间的速度不匹配问题,降低了整机效率。为了解决这个问题,冯诺依曼体系引入了内存的概念。
        内存具有数据存储的能力,可以提前把数据准备好,CPU只需要从内存中拿数据进行处理。此外,根据局部性原理,当CPU需要获取某一行数据时,内存可以将该行数据之后的数据一同加载进来,而CPU处理数据和内存加载数据是可以同时进行的,这样下次CPU就可以直接从内存当中获取数据。
        因此,内存作为计算机数据的核心,可以大大提高数据处理的效率和速度。引入内存就把,效率问题,转化为了软件问题。

场景:

程序在运行的时候必须把程序先加载到内存中,为什么?

程序最终都是文件,文件都存储在硬盘上,硬盘属于外设;程序运行所产生的指令和数据,最终是要让cpu执行的;存储在硬盘中的程序(外设)最终会交给内存,是因为在数据层面,cpu只和内存交互,程序需要加载到内存中,再由内存交给cpu处理,这是冯诺依曼体系结构这么规定的。


对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。 从你打开窗口,开始给他发消息,到他的到消息之后的数据流动过程。如果是在qq上发送文件呢?
 聊天的时候,键盘输入的信息储存在内存中,并将其打包成特定的网络协议格式。CPU对这些数据进行处理,确保它们可以正确地通过网络发送。这些数据包通过网络发送到朋友的计算机上。朋友的计算机上的QQ程序处理这些接收到的消息,将其解包并显示在屏幕上。

如果是发送文件,这个文件首先被从硬盘读取到内存中。再以同样的方式发送到朋友那,朋友接收后,QQ程序处理这些数据包,去掉头信息,并将它们重新组装成原始的文件。这个文件随后被存储在朋友的计算机的硬盘上,朋友可以在其计算机上访问和查看这个文件。

这个过程内存也是起着核心作用。


2. 操作系统(Operator System)--第一个被加载的软件

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

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

设计OS的目的:

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

定位:在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件
在这里我们引入一张图:计算机的层状结构

在这里我们先谈硬件部分:

        首先,底层硬件是计算机系统的最底层部分,包括处理器、内存、硬盘、显卡等物理设备。这些硬件是计算机系统的基础,提供了运行程序和存储数据的能力。
        其次,驱动程序是介于底层硬件和操作系统之间的软件。由于不同的硬件厂商生产的硬件设备可能采用不同的技术和协议,因此操作系统无法直接识别和管理这些硬件。驱动程序的作用就是为操作系统提供与硬件设备进行通信和控制的能力。驱动程序包含有关硬件设备的信息,可以让操作系统识别和管理硬件,并与其进行交互。
        最后,操作系统是运行在计算机硬件之上的系统软件,它是计算机系统的核心。操作系统负责管理和控制计算机的硬件和软件资源,提供用户界面,支持多任务处理和文件系统等功能。操作系统通过与驱动程序进行交互,实现对底层硬件的管理和控制。

        底层硬件提供了计算机系统的物质基础,驱动程序为操作系统提供了与硬件进行交互和控制的能力,而操作系统则负责管理和控制整个计算机系统的资源和运行(先描述,在组织)。

为什么要有操作系统?
1. 管理硬件资源:操作系统负责管理计算机的各种硬件资源,如内存、处理器、硬盘、网络等,确保它们能够有效地被应用程序使用。
2. 提供用户接口:操作系统提供了用户与计算机之间的接口,使用户能够方便地与计算机进行交互,运行程序和管理文件。
3. 调度任务:操作系统负责对计算机上运行的各个任务进行调度和管理,确保它们能够按照一定的规则和优先级进行执行。
4. 提供安全性:操作系统通过访问控制和权限管理等机制来保护计算机系统的安全,防止未授权的访问和恶意软件的入侵。
总的来说,操作系统是计算机系统中不可或缺的部分,它为应用程序的运行和用户的操作提供了基础支持和保障,对下管理号软硬件系统(手段),对上提供一个良好的运行环境(目的)。

系统调用和库函数概念

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
     

3.进程 

承上启下

那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把、进程组织起来!


3.1基本概念 

首先在操作系统中是不是只能运行一个程序呢?当然不是。

事实:

1.我们可以启动多个程序---我们一定要将多个.exe加载到内存

2.操作系统要不要管理多个加载到内存的程序呢?要的

3.操作系统如何管理加载到内存的程序 呢?先描述,再组织!

操作系统管理加载到内存的程序通常遵循以下步骤:

  • 加载程序:当用户启动一个程序时,操作系统首先会将程序的可执行文件从磁盘加载到内存中。这个过程涉及将程序的代码段、数据段和堆栈段等部分加载到内存的不同区域。
  • 设置程序的执行环境:操作系统会为每个加载到内存的程序设置一个独立的执行环境,包括分配内存空间、建立程序的数据结构、初始化寄存器等。
  •  创建进程控制块(PCB):操作系统会为每个加载到内存的程序创建一个进程控制块(PCB)是操作系统中用于管理进程的数据结构,它包含了进程的各种信息和状态,PCB对象会根据自己所包含的信息在内存中找到自己对应的程序记录和管理程序的运行状态、资源占用情况、优先级等信息,在内存中的PCB对象会形成数据结构方便操作系统的管理(增删查改)
  • 分配资源:操作系统会根据程序的需求分配各种资源,如内存空间、CPU时间片、文件句柄等,以确保程序能够正常运行。
  • 运行程序:一旦程序被加载到内存并设置好执行环境,操作系统会按照调度算法将程序放入就绪队列,等待CPU执行。当程序获得CPU时间片时,操作系统会将控制权交给程序,程序开始执行。

为什么加载到内存加载到内存,变成进程之后,我们要给每一个进行形成一个PCB对象呢?因为操作系统要进行管理

通以上的操作其实就将对进程的管理,转化成为了对PCB对象的管理,变成了操作系统对PCB对象所形成的数据结构的增删查改。

在这里我们就可以对进程下定义了:

进程= 内核PCB对象(内核数据结构)+可执行程序


 3.2Linux中的PCB

PCB:是操作系统学科的叫法。在Linux中,PCB就是task struct。

我们来见一见Linux中的task struct。这是Linux内核的源代码,里面确实存在这个结构体

task struct中有哪些属性?

命令ps axj可以查看当前的进程

我们生成了一个mytest的可执行程序,并运行它,这时候就变成了进程,程序运行结束进程也就结束了(进程是有“生命”的)。

下面是它所对应的进程,我们发现在mytest进程下面还有一个grep的进程,这是为什么?

这是因为几乎所有的指令,都是程序,运行起来也要变成进程,grep当然也不例外。


  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。

在上图中,PID一栏就是标识符,下面在程序中可以通过getpid函数查看PID

除了PID外还有PPID(父进程),在Linux中每个人进程都有一个父进程,而父进程可能有多个子进程。每一次启动进程PID几乎都会变化,因为我的进程是一个新的进程!而父进程不会变,子进程有父进程创建

我们可以查询16986这个进程,发现它就是bash(命令行解释器)。

除了ps ajx查看进程的方式,我们还可以通过proc文件去查看正在运行的程序的信息

cwd表示当前的进程的工作目录:我们在学习C语言的时候,会学习创建文件,如果你没有指定完整的路径,那么这些操作就会在这个工作目录下进行。

exe记录的是进程可执行文件的位置

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

 3.3通过系统调用创建子进程-fork初识

fork:创建一个子进程

我们先来看一段代码:

我们发现after打印了两次,一旦fork后会创建子进程,这时就会有两个执行分支了,两分支都要执行printf。我们还发现最后一个after,他的父进程就是上一个after,而上面两个的父进程是24662(bash)fork之后,后续的代码父和子都会执行

再看一段代码:

我们发现,fork是有返回值的;在父进程中fork会返回子进程的ID,因为父进程需要记住创建的子进程。在子进程中,会返回0/-1,返回0就代表fork函数执行成功,返回0来标识子进程,返回-1就代表fork函数出错了


为什么要创建子进程?

当然是要子进程帮父进程去办事,让父子做不同的事情。

看下面的代码:使用if语句进行分流,让父子做不同的事情。

通过返回值的不同来区分父子进程,进而让父子进程去做不同的事情。


fork的原理:

1.每一个进程=内核数据结构+可执行代码和数据

2.创建一个进程的时候,系统中会多一个进程;因此会给子进程创建一个task_struct,但是子进程没有代码和数据进行执行,这时子进程会默认指向父进程的代码和数据。

3.但这样是不行的,这时我们虽然是共享了代码,但要使得这个操作有意义,我们得执行不同的操作,因此fork函数就通过返回值的不同,让父与子去执行代码块不同的部分。当然这代码依旧是来自父亲,fork之后,儿子就帮父亲分担了一部分工作。

4.子进程为什么能去调度代码,是因为子进程会继承父进程中task_struct的大多数属性,以父进程为模板创建子进程。


进一步了解fork的返回值

1.给父进程返回父进程的pid,给子进程返回0,为什么?

父:子 = 1:n,父亲可以有很多儿子,而儿子只有一个父亲,因此子进程需要返回自己的ID给父亲,方便父亲唯一性的确认和控制这个子进程,而父亲是唯一的,不需要进行标识。

2.fork 函数为什么会返回两次?

调用fork只能是父进程去调用fork。如果一个函数,已经运行到了最后开始执行return的时候,这个函数的核心逻辑做完了吗?当然做完了。fork是函数,fork执行完了也需要return。而fork也是有自己的执行代码的,在return之前子进程就已经被创建了,创建好了之后,父子进程代码共享,return也是代码,那么子进程当然也可以执行return,因此fork会返回两次,一次是父进程返回的,另一次当然是子进程返回的。

3.这里还有一个最让人不能理解的地方,同一个变量id,怎么可能既等于0,又大于0 呢?

一个进程崩溃了,会不会影响其它进程?当然是不会的。

进程之间是具有独立性的,互不影响。

这个返回值也被存储在一个名为id的变量中,但这个变量是子进程的局部变量,与父进程中的id变量是完全独立的。
这两个返回值是通过操作系统内核的调度机制实现的,它确保了父进程和子进程在逻辑上是并发的,但实际上它们在物理上可能是交替执行的。由于这两个进程有独立的地址空间,因此它们各自的局部变量(即使变量名相同)也是相互独立的。
这就是为什么你会看到id变量似乎“同时”存入了两个值,但实际上这两个值分别属于两个不同的进程上下文。每个进程都有自己的变量副本,这些变量在进程内部是唯一的,并且互不干扰。


demo代码(一次创建多个子进程)

代码:

#include <stdlib.h>const int num = 10;
void worker()
{int cnt = 12;while (cnt){printf("child %d is running,cnt:%d\n", getpid(), cnt);cnt--;sleep(1);}
}
int main()
{for (int i = 0; i < num; i++){pid_t id = fork();if (id < 0) break;if (id == 0){//子进程worker();exit(0);//让子进程退出                           }printf("father create child process success,child pid:%d\n", id);}//只有父亲进程会执行到这里sleep(15);return 0;
}

在主函数 main 中,通过循环创建了10个子进程,每个子进程通过调用 worker 函数来输出信息,然后退出。父进程在创建子进程后会打印子进程的PID,并在所有子进程创建完成后通过 sleep(15) 来延迟一段时间。需要注意的是,父进程在创建子进程时应该检查 fork() 的返回值以处理可能的错误情况。

我们发现最后子进程都退出了,有<defunct>的标识,留下来的只有父进程

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

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

相关文章

关于OceanBase中旁路导入的应用分享

背景 前段时间&#xff0c;在用户现场协助进行OceanBase的性能测试时&#xff0c;我注意到用户常常需要运用 insert into select 将上亿行的数据插入到一张大宽表里&#xff0c;这样的批量数据插入操作每次都需要耗时半个小时左右。对这一情况&#xff0c;我提议用户尝试采用旁…

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇&#xff08;Animation Montage&#xff09; 可以将多个 动画序列&#xff08;Animation Sequences&#xff09; 合并为单个资产并通过蓝图播放&#xff0c;还可以将一个蒙太奇动画切分为多个 蒙太奇分段&#xff08;M…

Prompt-RAG:在特定领域中应用的革新性无需向量嵌入的RAG技术

论文地址&#xff1a;https://arxiv.org/ftp/arxiv/papers/2401/2401.11246.pdf 原文地址&#xff1a;https://cobusgreyling.medium.com/prompt-rag-98288fb38190 2024 年 3 月 21 日 虽然 Prompt-RAG 确实有其局限性&#xff0c;但在特定情况下它可以有效地替代传统向量嵌入 …

外包干了5年,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

DC-5靶机

一.环境搭建 1.下载地址 靶机下载地址&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 2.虚拟机配置 切换nat模式&#xff0c;有问题全选重试和是&#xff0c;打到这了&#xff0c;我感觉这个配置我都不用写了&#xff0c;启动靶机如下图所示即可 二.开始渗透 1.信…

红黑树进阶:正向与反向迭代器的实现及map、set的封装实践

文章目录 一、引言二、红黑树迭代器设计1、迭代器的基本概念和分类2、正向迭代器设计a.迭代器结构定义b.迭代器的 与 -- 3、反向迭代器设计a.反向迭代器的必要性b.反向迭代器的实现要点 4、红黑树封装迭代器 三、使用红黑树实现Map四、红黑树实现Set五、细节理解1、 typname的使…

Linux 在线yum安装: PostgreSQL 15.6数据库

Linux 在线yum安装&#xff1a; PostgreSQL 15.6数据库 1、PostgreSQL数据库简介2、在线安装PostgreSQL15.63、配置 PostgreSQL的环境变量4、使用默认用户登录PostgreSQL5、配置 PostgreSQL 允许远程登录6、修改 PostgreSQL 默认端口7、创建数据库和表、远程用户zyl8、pgAdmin远…

ChatGLM3 Linux 部署

1.首先需要下载本仓库&#xff1a; git clone https://github.com/THUDM/ChatGLM3 2.查看显卡对应的torch 版本 官方文档说明&#xff1a; Start Locally | PyTorch 例如&#xff1a; a. 先查看显卡的CUDA版本 nvcc --version 查看对应版本 Previous PyTorch Versions …

接口测试常用工具及测试方法(基础篇)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff…

家用智能洗地机哪个牌子好?4款型号让你解锁高效省力生活体验

在今天的社会中&#xff0c;随着生活节奏的加快&#xff0c;人们对于家庭清洁的需求不断增加。传统的清洁方法已经无法满足现代家庭的需求。因此&#xff0c;洗地机作为一种高效、方便的清洁工具&#xff0c;已经成为了许多家庭首选的清洁设备。然而&#xff0c;在市场上&#…

个人可以做知识付费网站吗

个人可以做知识付费网站吗 个人能够做学问付费网站吗&#xff1f;答案是肯定的&#xff01;如今个人做学问付费网站并不需求太多的资金和技术支持&#xff0c;我们只需求购置一台效劳器或虚拟主机&#xff0c;然后在该主机空间上搭建一个WordPress网站&#xff0c;最后运用带有…

Unity-UGUI系统

UGUI是什么 UGUI是Unity引擎内自带的UI系统官方称之为:Unity Ul 是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案 它是基于Unity游戏对象的UI系统&#xff0c;只能用来做游戏UI功能 不能用于开发Unity编辑器中内置的用户界面 六大基础组件 概述 Canvas EventS…

光明源:农村智慧公厕主要包括哪些功能

随着乡村振兴战略的深入推进&#xff0c;农村面貌日新月异&#xff0c;生活品质也水涨船高。在这一崭新的农村画卷中&#xff0c;智慧公厕作为生活环境的一部分&#xff0c;正以其独特的魅力引领着人们对美好生活的向往。今日&#xff0c;让我们一同探寻农村智慧公厕的璀璨功能…

openssl 升级1.1.1.1k 到 3.0.13

下载 https://www.openssl.org/source/ tar -zxvf openssl-3.0.13.tar.gzcd openssl-3.0.13/./config enable-fips --prefix/usr/local --openssldir/usr/local/opensslmake && make install 将原有openssl备份 mv /usr/bin/openssl /usr/bin/openssl.bak mv /usr/i…

使用 STL 容器发生异常的常见原因分析与总结

目录 1、概述 2、使用STL列表中的元素越界 3、遍历STL列表删除元素时对迭代器自加处理有问题引发越界 4、更隐蔽的遍历STL列表删除元素时引发越界的场景 5、多线程同时操作STL列表时没有加锁导致冲突 6、对包含STL列表对象的结构体进行memset操作导致STL列表对象内存出异…

2024蓝桥杯每日一题(树状数组2)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;数星星 试题二&#xff1a;小朋友排队 试题三&#xff1a;逆序对数量 试题四&#xff1a;火柴排队 试题一&#xff1a;数星星 【题目描述】 天空中有一些星星&#xff0c;这些星星都在…

3.18_C++_day6_作业

作业要求&#xff1a; 程序代码&#xff1a; #include <iostream>using namespace std;class Animal { private:string name;string color;int *age; public://无参构造函数Animal(){cout << "Animal::无参构造函数" << endl;}//有参构造函数Anim…

【计算机】——51单片机——持续更新

单片机是一种内部包含CPU、存储器和输入/输出接口等电路的集成电路&#xff08;IC芯片&#xff09; 单片机是单片微型计算机&#xff08;Single Chip Microcomputer&#xff09;的简称&#xff0c;用于控制领域&#xff0c;所以又称为微型控制器&#xff08;Microcontroller U…

Python零基础---爬虫技术相关

python 爬虫技术&#xff0c;关于数据相关的拆解&#xff1a; 1.对页面结构的拆解 2.数据包的分析&#xff08;是否加密了参数&#xff09;&#xff08;Md5 aes&#xff09;难易程度&#xff0c;价格 3.对接客户(433,334) # 数据库 CSV 4.结单&#xff08;发一部分数据&a…

服务器运行一段时间后

自己记录一下。 一、查看目录占用情况 df -h 命令查看磁盘空间 du -ah --max-depth=1 / 查看根目录下各个文件占用情况 二、mysql日志清空 这个日志是可以清空的 echo > /usr/local/mysql/data/syzl-db2.log #将文件清空 说明: 这个文件这么大是因为,开启 …