【Linux】进程概念讲解

news2024/11/25 10:33:09

前言

在了解进程概念之前,还有很多东西需要我们先了解,以助我们更好地学习以后的知识

大部分都是概念的东西,大部分大概有个印象就好了

冯诺依曼体系结构(硬件方面)

当代计算机的设计都是按照冯诺依曼体系结构设计(大概结构为下图)的

那么它是有什么魔力呢?可以让那么多的计算机都按照这个结构设计

首先我们要知道,cpu处理数据的能力是最快的,内存次之,外设(磁盘等)最慢

真因此价格也是从高到低的

一台电脑从理论上来说可以全部由cpu组成,因为几乎每个硬件都有存储数据的能力,但是那样计算机的价格就太高了

如果要使计算机被广泛推广并使用,一定要价格合适且效率不错,冯诺依曼体系结构就做到了这点

我们首先要了解一下木桶效应,简单的来说就是一同水的容量多少取决于最小的那块木板

所以如果cpu直接和外设交互,就会导致整机效率过低

一般都是外设的数据加载到内存中,cpu与内存交互并处理数据,然后再返回给内存,再传到输出设备中去

有了以上的了解,我们就能明白为什么以前总是听说程序在运行前要被加载到内存中去

因为程序=代码+数据,本质上就是一个文件,被存储到磁盘中,想被cpu处理就要被加载到内存中

粗谈操作系统

什么是操作系统?

简单来说操作系统就是进行软硬资源管理,并为用户提供安全,稳定,高效的使用环境的一款软件(内存中第一个加载的软件)

我们先来看下三段(操作系统,驱动程序,硬件设备)之间是怎么进行资源管理的

操作系统,驱动程序,硬件设备可以形象地理解为校长,辅导员,学生

如果直接由校长直接管理学生那校长的负担会很大,但是如果只用管理几个辅导员,由辅导员去管理学生,校长的工作量就可以骤减了

先抛出一个结论:管理的本质不是管理一个人,而是管理数据!!!

校长原本愁与管理学生,但是学了编程以后创建了struct结构体,里面包含学生的各种属性,然后还有指针将每个结构体相连成链表,这样对学生的管理就变成了对链表的增删查改

管理方法:先描述(属性赋值),再组织(数据结构)!!!

人是通过属性认识世界的;重要的属性的集合就代表这个人

谈完了下三层,我们再来看上三层(为用户提供高效稳定安全的使用环境)

用户有很多,有的可能是普通用户,有的可能是开发者,有的可能是破坏者

所以操作系统为了安全的环境,实行一刀切政策,不信任任何用户,任何用户只能通过系统调用来使用操作系统

这和银行很像,银行不信任任何客户但是仍然为我们提供服务,所以设置了防弹玻璃保护自己,设置了一个小窗口(系统调用)用来处理业务

但是系统调用的学习成本太高,不利于用户使用,站在开发者的角度上,可以将系统调用封装成各种函数接口,但是一个函数由不同的人来写就有不同的函数接口,所以开发者将函数接口封装成各种各样好用的函数,也就是库,以后的开发者就不用自己再写了,直接调用即可

注意:想访问底层的os数据或者硬件,一定要贯穿整个层状结构

进程

进程和程序很容易混淆,进程是在内存中的程序吗?当然不是!

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

进程在内存中,操作系统理所应当也要对其进行管理,怎么管理呢?先描述再组织!

描述就是各种属性加上拷贝可执行程序的代码,组织就是将其组织成链表结构

当然一个进程的pcb可以不止在一张链表(一个等待队列中)里,也可以在其他的数据结构中

这样对进程的管理,就变成了对链表的增删查改——本质就是一个建模的过程

我们在Linux中平时敲的指令以及各种运行的程序都是进程!!!!

查看进程

每个进程都要有自己的工作目录

进程的信息可以通过  /proc /进程id   来查看

getpid()——获取进程id

getppid()——获取父进程id

也可以通过ps(ps axj)和top这种用户级别软件来查看(一般配合grep指令和管道进行操作)

grep指令:grep 文件名——找出含有文件名名字的文件

                   grep -v 文件名——找出不含有文件名的文件

通过系统调用fork创建进程

在外出旅行的时候我们应该试过在车上一边下载视频一边播放视频以打发时间,这里就是两个进程在同时工作,也反映了创建子进程的原因——让子进程去做和父进程不一样的事,以更高地服务我们

格式:pid_t fork()

在fork后一般用if进行分流,fork会给父进程返回子进程的pid,给子进程返回0

接着我们抛出几个问题,下面再一一解释

1.fork干了什么

2.为什么fork有两个返回值

3.为什么fork的两个返回值,会给父进程返回子进程id,给子进程返回0

4.fork之后,父子进程谁先运行

5.如何理解同一个变量却有不同的值(待解决...)

首先有了上面进程的概念,fork创建子进程后,子进程是没有代码和数据的,系统会以父进程的pcb为模板拷贝一份pcb出来,这时父子进程共享代码

但是如果子进程要修改数据的话也会影响到父进程的数据,所以这里的数据采用写时拷贝的方法进行存储

既然共享了代码,所以fork之后,父子进程会执行fork以下的代码,如果要让他们干不同的话,就要用if进行分流

那fork之前的代码呢?fork之前的代码子进程也是可以看到的

在一个函数中,return是一个语句吗?当然是!所以父子进程都会return一次,也就给了fork两个返回值(这里先这样理解,真实情况是os通过寄存器做到的返回两次)

因为父与子是1:n的关系,所以要给父进程返回子进程的id以便知道孩子有哪些,子进程没有孩子所以返回0

那么谁先运行呢?这个由os,pcb中的调度信息(优先级,时间片)等等决定

父子进程是相互独立的,父进程挂掉不会影响子进程,子进程挂了不会影响父进程

关于最后一个问题要学了后面的内容才能更好的理解

进程状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态

怎么知道呢?通过访问pcb里的一个变量数据——所以进程的状态修改本质上就是修改pcb里的存储进程状态的变量数据,并将其pcb列入不同的队列中

运行状态

如字面意思,就是各种资源已经准备好了,在运行队列当中了,随时可以被调度了

只要在运行队列中的进程,都是运行状态

每个cpu中都一定会设置一个运行队列

阻塞状态

我们写的代码,或多或少都要访问一些资源(键盘,磁盘,网卡等),但是当资源没有就位的时候,代码就无法继续往下运行,这个时候我们的进程就卡住了,

挂起状态(阻塞挂起)

当位于阻塞状态的进程越来越多时且os内存资源严重不足的时候,我们的电脑就会很卡,为了不让os挂掉,我们就要清理掉一些内存空间

所以当os内存资源不足的时候,处于阻塞状态的进程的代码段和数据会被交互到磁盘中的swap区域,以清理内存空间

当进程被os调度的时候,被置换出去的代码和数据又要重新被加载回内存中

linux进程的具体状态

R (running)
S (sleeping)
D (disk sleep)
T (stopped)
t (tracing stop)
X (dead)
Z (zombie)

R——其实就是运行状态,但是当代码中有大量的io操作的时候,即使代码正在运行也很难查出R状态,因为io太慢了,一直在等资源就位

状态后面的+表示前台进程——即该进程运行的时候bash的命令行无法运行,并且可以ctrl c终止

 如果想要进程以后台进程的方式运行,要在后面加个&

后台进程可以输入命令行,但是不能ctrl c,如果想要终止后台进程,就要用到 killed -9 PID来终止进程

S——浅度睡眠

为阻塞状态的一种,会对外部的信号作出响应,可以被killed终止

进程在访问资源的时候,可能资源还没就位,就会被设为S状态

D——深度睡眠

为阻塞状态的一种,磁盘休眠状态,不会对外部的信号作出响应,不可以被killed终止,os也没资格

故事:假如os内的一个进程正在向磁盘写入客户的数据,但是os内已经没多少内存了,假如写入数据失败了,但是这个进程又被killed掉了,客户的信息丢失了,那么谁来负责呢?所以设置为D状态,不能被终止,除非拔掉电源

T——暂停状态(stopped)

当进程要访问一个资源的时候,可能暂时不让进程访问,就将其设为T状态——killed -SIGSTOP PID,继续运行killed -SIGCONT,暂停后自动会被换成后台进程

t——debug的时候追踪断点,在断点处让进程暂停

僵尸进程

我们为什么要创建一个进程?让一个进程来帮我们完成某项工作

我们要不要知道一个进程完成的怎么样?当然要!

所以进程在退出的时候,要有一些退出信息,表明自己把任务完成的怎么样(main函数通常都是return 0,return 1 /2/3会怎么样)

进程在退出的时候,退出信息会由os写到退出进程的pcb当中,可以允许代码和数据被释放,但是不允许pcb立即被释放,因为要让父进程或者os获取pcb里的退出信息,要是父进程或者os一直不获取呢,那就是所谓的僵尸状态(Z)了

如果一个进程Z状态了,父进程一直不回收它,他就要一直存在?是的,所以会造成内存泄漏(pcb在内存当中)

孤儿进程

当子进程的父进程直接退出了,子进程的pcb里的退出信息由谁来获取呢?这个时候就要由os接管子进程了,这里子进程被称为孤儿进程

关于进程的大概介绍也就这么多了,希望对大家能有所帮助,我也会继续努力输出Linux的知识

 

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

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

相关文章

Leetcode101.对称二叉树

本专栏内容为:leetcode刷题专栏,记录了leetcode热门题目以及重难点题目的详细记录 💓博主csdn个人主页:小小unicorn ⏩专栏分类:Leetcode 🚚代码仓库:小小unicorn的代码仓库🚚 &…

代码随想录算法训练营第五十二天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 视频讲解:动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III_哔哩哔哩_bilibili 代码随想录 (1)代码 188.买卖股票的最佳时机IV 视频讲解&a…

堆叠注入([强网杯 2019]随便注1)

详解: 堆叠注入(Stack Injection)是一种计算机安全概念,涉及攻击者向程序的堆栈内存中插入恶意代码,以便在程序执行期间执行非预期的操作。 堆栈注入攻击通常利用程序在处理函数调用时使用的堆栈机制。当一个函数被调…

力扣刷题 day43:10-13

1.完全平方数 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 …

一文就懂大语言模型Llama2 7B+中文alpace模型本地部署

大语言模型Llama2 7B中文alpace模型本地部署 VX关注晓理紫并回复llama获取推理模型 [晓理紫] 1、Llama模型 一个由facebook发布的生成式语言模型,具体可以到其官方了解。 为了大家更好理解,这里把目录结构显示下一如下图。 2、 下载Llama并配置环境 …

IWDG与WWDG (学习)

IWDG Independent watchdog,即独立看门狗 IWDG:能产生系统复位信号的计数器 递减的计数器时钟由独立的RC振荡器提供(可在待机和停止模式运行)看门狗被激活后,当递减计数器计数到0x000时产生复位 喂狗:在…

【C++】继承 ② ( 继承语法 | 三种继承 - 共有继承 / 保护继承 / 私有继承 | 继承与父类私有成员 | 子类访问父类私有成员 | 代码示例 )

文章目录 一、继承语法1、语法说明2、三种继承 - 共有继承 / 保护继承 / 私有继承3、继承与父类私有成员4、子类访问父类私有成员 二、代码示例 - 继承语法 一、继承语法 1、语法说明 继承语法 : 使用 class 关键字 定义 子类 , 在 子类后面 使用 冒号 : 与 若干父类隔开 ; cl…

Viewport的作用

什么是 Viewport? viewport 是用户网页的可视区域。 viewport 翻译为中文可以叫做"视区"。 手机浏览器是把页面放在一个虚拟的"窗口"(viewport)中,通常这个虚拟的"窗口"(viewport)比…

如何实现前端路由保护?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C语言编写简易图书管理系统

这篇文章介绍了一个基本的图书管理系统的实现,它允许用户添加、插入、删除、修改、显示和查询图书的功能。该系统通过使用二进制文件将图书信息保存到磁盘,并且在程序启动时能够加载已保存的图书信息。 介绍 在计算机科学中,图书管理系统是…

buffer overflow detected

背景 在应用上云改造中,业务场景如下: 在使用ecs的场景中,应用的ip都是固定的;在使用k8s之后pod的ip就变的不固定了,k8s提供了statefulset的模式来支持这种场景,以固定域名的方式支持。 问题 在平台pod开…

Locust性能测试框架,从入门到精通

1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁、轻量、高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力。 主要特点如下: 使用普通的Python脚本用户测试场景分布式和可扩展&#xff…

论文阅读:ECAPA-TDNN

1. 提出ECAPA-TDNN架构 TDNN本质上是1维卷积,而且常常是1维膨胀卷积,这样的一种结构非常注重context,也就是上下文信息,具体而言,是在frame-level的变换中,更多地利用相邻frame的信息,甚至跳过…

用于医学图像分割的分段任意模型 (SAM)

一、说明 在不断发展的人工智能 (AI) 领域,医学成像是一个正在经历深刻变革的领域。乘着这一变革浪潮,Facebook 的(现为 Meta)研究小组开发了一种突破性的模型架构,称为 SegmentAnything (SAM)。SAM 的卓越之处在于它能…

队列:如何在线程池等有限资源池中的应用?

文章来源于极客时间前google工程师−王争专栏。 我们知道,CPU 资源是有限的,任务的处理速度与线程个数并不是线性正相关。相反,过多的线程反而会导致CPU频繁切换,处理性能下降。所以,线程池的大小一般都是综合考虑要处…

MTK6877/MT6877天玑900安卓5G核心板_安卓开发板主板定制开发

2021年5月13日,MediaTek 宣布发布旗下的天玑900系列芯片,又名MT6877。天玑900基于6nm先进工艺制造,搭载硬件级4K HDR视频录制引擎,支持1.08亿像素摄像头、5G双全网通和Wi-Fi 6连接、旗舰级存储规格和120Hz的FHD超高清分辨率显示&a…

GD32F10x系列单片机下载方式

GD32F10x系列单片机下载方式 简介烧录接口KEIL在线烧录选择下载器ST-link接线 DAP、JLINK等 烧录软件烧录STlink接线操作 ISP烧录接线 总结 简介 GD32F10x系列的单片机是兆易创新推出对标意法半导体STM32F10x系列的国产单片机。本文将以GD32F103C8T6展开,GD32F103C8…

持续提升信息安全运维保障服务能力,天玑科技助力企业快速实现数字化转型

近年来,以互联网、云计算、大数据、物联网为代表的新一代信息技术快速发展。给人们的生产生活方式带来方便的同时,也给信息系统的安全带来了严峻的挑战。我国信息化和信息安全保障工作的不断深入推进,以应急处理、风险评估、灾难恢复、系统测…

电动车租赁小程序开发方案详解php

电动车租赁小程序开发功能有哪些? 1.地图找车 进入小程序后,在地图上显示门店位置,点击位置可查看门店信息。进入门店后可以看到车辆列表,车辆里详细的介绍的车辆名称、图片、车辆介绍、租赁价格、押金等信息。 2.租赁/购车 电…

【LeetCode:1488. 避免洪水泛滥 | 有序表 哈希表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…