进程概念【linux】

news2024/10/6 5:11:06

进程基础

在学习进程之前,首先要有一定的计算机硬件和软件基础。

硬件基础:冯·诺依曼体系结构

如图,是计算机在硬件上的体系结构。 

下面举出一些常见的输入输出设备(有些设备只作输出设备,或者只作输入设备;而有些设备既能作为输出设备,又能作为输入设备)

输入设备:话筒、摄像头、键盘、网卡、磁盘,鼠标等等

输出设备:声卡、显卡、网卡、磁盘、显示器,打印机等等

这些设备连接在一起的目的:设备之间的数据流动。本质是设备之间频繁的数据拷贝!所以说,对数据进行拷贝的整体速度,是决定计算机效率的重要指标

经典场景:程序在运行的时候,必须把程序先加载到内存。

程序文件里都是指令和数据,这些指令和数据最终是要让 CPU 来执行的,而程序文件在生成后会存储在磁盘中,磁盘中的文件要先加载到内存,才能和 CPU 进行交互。所以,程序在运行的时候,必须先将程序加载到内存。

软件基础:操作系统

操作系统是计算机上一个进行软硬件资源管理的软件,同时它也是计算机开机同时第一个被加载的软件,它可以为用户提供一个稳定、高效、安全的运行环境

管理:根据数据做决策(操作系统)

被管理:执行管理者的决策(软硬件)

计算机对数据管理的建模:先将堆数据的管理场景转化为对特定数据结构的增删查改,将具体问题,转化为计算机级别的建模,先描述,再组织

那么到底什么是进程呢?

用程序来举例子,一个可执行程序的本质是二进制文件,保存在磁盘中,在运行时要将程序先加载到内存中;计算机上的软件,如微信,qq,本质上也是一个.exe的可执行程序,在启动时都要先加载到内存中。

这些可执行程序,在被加载到内存中后,就会变成一个个进程!

加载到内存后,如何对这些进程进行管理呢?

对每一个进程,都由一个 内核PCB 和 可执行程序 组成,这个内核PCB也被称为进程控制块(process ctrl block)。

这个内核PCB可以看做一个结构体,这个结构体中包含进程的状态、优先级、标识符、内存指针等包含进程信息的所有属性字段。对进程的管理,可以看做对每一个进程PCB的管理,所有对进程的控制和操作,都只与进程的PCB有关,与进程的可执行程序无关!

总结:对进程的管理,可以粗略的看做在多个PCB对象形成的链表中,对一个个结点进行增删查改

几乎所有的指令,都是程序,加载到内存运行起来后也要变成进程。CPU的主要工作就是在内存中取指令 -> 分析指令 -> 执行指令 这个周期内进行循环。

CPU中也存在着一个 存储器PC ,PC里的指令指针 IP/EIP等存储正在执行指令的下一条指令的地址,指令指针指向哪一个进程的代码,就表示哪一个进程即将调度!判断、循环、函数跳转指令的本质,就是修改储存器PC里的指令指针指向。

进程状态

创建一个进程的,系统中就多了一个进程!在Linux中普通进程都有它的父进程,每个进程都会有一个编号叫 pid ,每次启动进程的 pid 几乎都会变化,因为这个进程是全新的进程!

下面代通过 父进程创建子进程的过程 来测试新创建的进程

fork()函数,头文件 #include<unistd.h>

fork()函数用来创建子进程,有两个返回值,给子进程返回0,给父进程返回子进程的id。(在Linux中,可以用同一个变量名,表示不同的内存) 

 #include<stdio.h>                                                                                                           
 #include<unistd.h>
 #include<stdlib.h>
 #include<sys/types.h>
 #include<sys/wait.h>
 int main()
 {
   pid_t id = fork();
   if(id == 0){
       printf("我是子进程,my_pid:%d,my_ppid:%d,return id:%d\n",getpid(),getppid(),id);
       exit(0);
   }
   else{
       printf("我是父进程,my_pid:%d,my_ppid:%d,return id:%d\n",getpid(),getppid(),id);
   }
 }  

子进程被创建,其实是以父进程为模板的:子进程会将父进程的字段信息浅拷贝过来,利用写时拷贝(写的时候再进行开空间深拷贝,否则就浅拷贝)来优化创建进程的效率。 

运行结果: 

一个进程崩溃了,是否会影响其他进程的运行? 

仅从运行上来说是不会的,任意进程之间具有独立性,互相不影响。

测试:父进程崩溃了,是否会影响子进程的运行?

  #include<stdio.h>                                                                                                                   
  #include<unistd.h>
  #include<stdlib.h>
  #include<sys/types.h>
  #include<sys/wait.h>
  int main()
  {
    pid_t id = fork();
    while(1)
    {
      if(id==0)
      {
  
        printf("我是子进程,my_pid:%d,my_ppid:%d,return id:%d\n",getpid(),getppid(),id);
        sleep(1);
      }
      else
      {
         printf("我是父进程,my_pid:%d,my_ppid:%d,return id:%d\n",getpid(),getppid(),id);
         sleep(1);
      }
    }
    return 0;
  }

使用 kill -9 指令杀死父进程 

可以看到杀死父进程后,子进程依然还在运行,但它的 ppid 发生了改变,变成了‘孤儿进程’。

进程排队

就算进程放在了CPU上,进程也不会是一直在运行的!

CPU中有时间片的概念,即CPU会给当前进程分配一个时间片的时间(极短)来运行,后面的进程按开启时间顺序进行排队,一旦时间片上的时间耗尽,当前进程依然没有运行结束,CPU就会进行切换进程,未完成的进程继续入队,等待下一次调度。这种方式公平、高效,可以有效防止进程阻塞或者挂起而造成CPU资源的浪费!

宏观上来看,我们可以同时打开多个软件,仿佛有很多程序在同时运行。但是实际上,CPU每次只能处理一个进程的内容,只是轮换的时间极短,我们没有发现而已。

进程阻塞

上面提到了进程阻塞的概念,那么进程阻塞一般是什么样的场景呢?

如我们运行一个C语言程序,在程序启动的那一刻,就被加载到内存上,形成了一个进程。这个程序中有需要使用者用键盘输入的部分,但使用者迟迟没有输入。在等待的这段过程中,这个进程看似在运行中,但CPU不可能一直等待着使用者输入。这时候进程就会将自己设置为阻塞状态,根据不同的阻塞类型排入不同的等待队列进行排队,等待软件或硬件资源就绪后再继续运行。

所以总结下来:当进程在等待软硬件资源的时候,且资源没有就绪,进程就会将自己设置为阻塞状态,处于阻塞状态的进程会根据等待资源的不同而被连入多个等待队列中!

进程挂起

当计算机资源吃紧的时候,操作系会对一些优先级不高的进程设置为挂起状态,并将其移到外存,等到条件允许了再将这个进程调回内存中。

僵尸进程

每一个进程的创建都是为了完成某些用户需要的工作的,所以这些进程必须有结果、有数据(进程状态)。进程退出后,它的这些进程状态还需要它自己维持住,供上层读取。

当某个进程死亡(退出)后,它的进程状态没有被他的父进程读取,那这个进程目前的状态,就是僵尸状态。僵尸状态的进程,会一直存在,内存得不到释放,会造成内存泄漏!

孤儿进程

一个进程的父进程先于子进程死亡(退出),那这个子进程就会被1号进程过领养,变成一个孤儿进程。

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

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

相关文章

基于Leaflet的Webgis经纬网格生成实践

目录 前言 一、Leaflet.Graticule 1、参数说明 二、集成使用 1、新建网页模板 2、初始化地图对象 3、运行效果 三、源码调用分析 1、参数注入 2、经纬网构建 总结 前言 众所周知&#xff0c;在地球仪上或地图上&#xff0c;经线和纬线相互交织&#xff0c;就构成经纬…

复旦微固化流程

生成boot.bin 如图所示&#xff0c;psoc下的create boot image&#xff0c;选择文件配置路径output bif&#xff0c;任意命名 点击右侧add&#xff0c;分别添加三部分 1.编译FSBL工程后SDK\system_platform\FSBL\Debug\Exe路径下的FSBL.out 2.PL侧的bit文件 3.编译工程后SDK\sy…

关于对RF射频方面性能要求各有不同

1.1 射频天线性能 对于一个射频设备每个公司对其合格指标要求都不一&#xff0c;有些公司注重于阻抗及电压驻波&#xff0c;有些公司注重与回波损耗及阻抗、有些只关注电压驻波。 1.2 射频的目的 其实射频天线的目的就是在不把无用的杂散放大超标准的前提下&#xff0c;把有用…

穿梭时光的Java魔法:轻松掌握Date类,揭示当前时间的神秘面纱!

一、实现目标 获取当前时间&#xff01; 二、上代码 import java.text.SimpleDateFormat; import java.util.Date; public class Date_ { // 输出当前的时间 public static void main(String[] arg…

项目总结-自主HTTP实现

终于是写完了&#xff0c;花费了2周时间&#xff0c;一点一点看&#xff0c;还没有扩展&#xff0c;但是基本功能是已经实现了。利用的是Tcp为网络链接&#xff0c;在其上面又写了http的壳。没有使用epoll&#xff0c;多路转接难度比较高&#xff0c;以后有机会再写&#xff0c…

大数据技术8:StarRocks极速全场景MPP数据库

前言&#xff1a;StarRocks原名DorisDB&#xff0c;是新一代极速全场景MPP数据库。StarRocks 是 Apache Doris 的 Fork 版本。StarRocks 连接的多种源。一是通过这个 CDC 或者说通过这个 ETL 的方式去灌到这个 StarRocks 里面&#xff1b;二是还可以去直接的和这些老的 kafka 或…

图的导航-最短路径算法-深度优先遍历

介绍 最短路径&#xff1a;从起点开始访问所有的路径&#xff0c;到达终点的路径有多条&#xff0c;其中路径的权值最短的一条则为最短路径。 最短路径算法有深度优先遍历、广度优先遍历、Bellman-Ford算法、弗洛伊德算法、SPFA算法、迪杰斯特拉算法等。 而本篇讲的是利用深…

TypeScript中的基本类型

提示&#xff1a;TypeScript中的基本类型 文章目录 前言基本类型1.类型声明2.自动类型判断3.类型断言 前言 TypeScript &#xff08;计算机编程语言&#xff09;简称&#xff1a;TS&#xff0c;是 JavaScript 的超集。简单来说就是&#xff1a;JS 有的 TS 都有。JS写的代码在TS…

基于ssm民宿管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本民宿管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

H5 - - - - 移动端禁止长按保存图片

H5 - - - - 移动端禁止长按保存图片 1. 问题描述2. 解决办法2.1 img标签添加css属性2.2 设置为背景图片2.3 图片元素的同级加一个透明盒子 1. 问题描述 H5移动端 img标签长按&#xff0c;会出现如图效果⬇️ 那么该如何修改&#xff0c;能避免长按保存图片操作呢&#xff1f; …

代码随想Day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间

435. 无重叠区间 这道题和前一天的射箭题目思想类似&#xff0c;用总区间个数-不重叠的区间个数等于需要去除的区间个数。首先对左边界排序&#xff0c;如果当前的左边界大于等于上一区间的右边界&#xff0c;则说明是一个不重叠的区间&#xff0c;否则&#xff0c;更新上一重…

Microsoft 发布了 12 月份产品安全问题修复报告。

&#x1f525; Microsoft 发布了 12 月份产品安全问题修复报告。 请注意趋势漏洞 CVE-2023-36011 和 CVE-2023-35632。这些漏洞与 Win32k 内核和负责网络通信的辅助功能驱动程序 (AFD) 驱动程序中的缺陷有关。成功利用这两个漏洞可让进入 Windows 系统的攻击者将其权限提升至系…

NXP应用随记(二):S32K3xx内存随记

目录 1、TCM 1.1、代码放置在ITCM的方式 __attribute__ 的函数属性 __attribute__ 的变量属性 __attribute__ 的类型属性 __attribute__ 的优化控制属性 1.2、DTCM 1.3、TCM的使用注意事项 1、TCM CMTightly Coupled Memory&#xff0c;是一种高速缓存&#xff0c;据说是…

【EI会议征稿】第三届电力系统与电力工程国际学术会议(PSPE 2024)

第三届电力系统与电力工程国际学术会议&#xff08;PSPE 2024&#xff09; 2024 3rd International Conference on Power System and Power Engineering(PSPE 2024) 第三届电力系统与电力工程国际学术会议&#xff08;PSPE 2024&#xff09;于2024年3月29-31日在中国三亚隆重召…

开发案例:使用canvas实现图表系列之折线图

一、功能结构 实现一个公共组件的时候&#xff0c;首先分析一下大概的实现结构以及开发思路&#xff0c;方便我们少走弯路&#xff0c;也可以使组件更加容易拓展&#xff0c;维护性更强。然后我会把功能逐个拆开来讲&#xff0c;这样大家才能学习到更详细的内容。下面简单阐述…

C++怎么快速提升实力?

C怎么快速提升实力&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&…

redis-学习笔记(Jedis hash简单命令)

hset & hget 往 hash 里面塞数据和获取数据 示例代码 hmset & hmget 批量插入数据, 获取数据 注意, hmset 里面插入的是一个 Map hmget 的返回值是一个一个 List 列表 (参数仍是变长参数) 示例代码 hexists 判断 hash 中 域值 存不存在 示例代码 hdel 删除指定的域和值…

SpringBoot 引入nacos 【最新 | 可运行】

SpringBoot 引入nacos 首先要了解在 Springboot 中只支持那些 Springboot 的版本&#xff08;我真的被这个搞死了&#xff09;,可以如下图参考&#xff1a; 下面我们就开始吧 下载 Nacos nacos 下载地址&#xff0c;这里可以选择你要下载的版本&#xff0c;我选择下载了2.2.…

基于Java8构建Docke镜像

基于Java8构建Docke镜像 搜索java8安装包 docker search java8 --no-trunc &#xff0c; --no-trunc展开描述信息 选择拉取 docker pull docker.io/mykro/java8-jre&#xff0c;为了减少磁盘占用&#xff0c;选择jre版本基础镜像 在宿主机创建文件夹iot&#xff0c;并把所需…

【FPGA/verilog -入门学习4】verilog 实现多路脉冲计数

需求&#xff1a; 设计一个脉冲计数器&#xff0c;其功能如下 输入脉冲&#xff1a;4路脉冲信号&#xff0c;分别对每路进行脉冲检测并计数 使能信号&#xff1a;高电平进行计数&#xff0c;低电平清零计数器 计数器&#xff1a;在使能信号高电平期间&#xff0c;对脉冲信号…