【Linux系统】认识操作系统和操作系统如何进行管理以及进程相关状态

news2024/10/7 4:30:39

进程概念

  • 1 认识冯诺依曼体系结构
    • 1.1 冯诺依曼体系结构存储器的作用
  • 2 操作系统(Operator System,OS)
    • 2.1 OS如何进行管理
  • 3 进程
    • 3.1 OS管理进程:先描述再组织
    • 3.2 描述进程-PCB
    • 3.3 查看进程
    • 3.4 通过系统调用获取进程标识符
    • 3.5 通过系统调用创建子进程——fork
  • 4 进程状态
    • 4.1 进程阻塞
    • 4.2 挂起状态
    • 4.3 僵尸(zombie)状态
    • 4.4 孤儿进程

本篇文章所涉及到的内容主要是与 进程的基础概念相关,所涉及到的内容有
1认识冯诺依曼系统
2操作系统的概念与定位
3深入了解进程概念,了解PCB
4会学习到进程状态和创建进程,僵尸进程和孤儿进程,及其形成的原因和危害

1 认识冯诺依曼体系结构

我们的计算机大部分都遵循冯诺依曼体系结构
冯诺依曼体系结构如下图所示
在这里插入图片描述
这里的输入设备可以是:键盘,话筒,摄像头,鼠标,网卡,磁盘等
存储器就是我们的内存
输出设备可以是:显示器,磁盘,网卡,声卡音响等
中央处理器部分就是我们常说的CPU

1.1 冯诺依曼体系结构存储器的作用

我们首先要知道,我们的输入输出设备通常称之为外设,而这些外设一般会运行得比较慢,以磁盘为例相对于内存,磁盘运行是比较慢的。
而我们的CPU运行是最快的。

这里要讨论的是冯诺依曼体系结构中存储器的作用,我们尝试去掉存储器
在这里插入图片描述
这种可以运行吗?答案是可以的。
但是比起冯诺依曼体系结构,效率差的太远了。
因为我们前面说过,外设的运行是最慢的,而CPU运行的效率虽然快,但是外设的运行效率拖慢了CPU的运行效率。换句话就是,我输入设备都还没读进来,CPU运行得再快也没用,CPU怎么处理?

所以,我们可以得出大致的一个结论:
冯诺依曼体系结构中的存储器可以更好地提升整个体系的运行效率。

因为有了内存的存在,我们的计算机就可以对数据做预加载,CPU在进行数据计算时,就可以不用访问外设,直接与内存联系即可。
外设要输入输出数据,也只能写入内存或从内存中读取

2 操作系统(Operator System,OS)

操作系统是一款进行软硬件资源管理的软件
操作系统对下通过管理好软硬件资源,对上给提供良好的(安全,稳定,高效,功能丰富等)的执行体验。
如图所示,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统的提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
在这里插入图片描述

2.1 OS如何进行管理

OS管理的手段是:先描述再组织
什么意思呢?我们要先知道这里的管理的本质是指对被管理对象的数据进行管理
也就说,OS是先将所有被管理对象的数据收集起来(先描述),然后再放在相应的数据结构里面(再组织),以方便进行后续的操作。

3 进程

什么是进程?
我们通常说进程是程序的一个执行实例。一个正在执行的程序等
站在内核的角度来说:进程是担当分配系统资源(CPU时间,内存)的实体

3.1 OS管理进程:先描述再组织

我们任何启动程序的行为,都由操作系统帮助我们将程序转换为进程,完成特定的任务。

OS如何管理进程?
还是先描述再组织

3.2 描述进程-PCB

进程控制块(PCB,Process Control Block),进程信息被放在这样的数据结构中,可以理解为进程属性的集合。
Linux操作系统的下的PCB是:task_struct
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
在这里插入图片描述

所以 进程 = 内核关于进程的相关数据结构 + 当前的代码和数据

3.3 查看进程

进程的信息可以通过/proc系统文件夹查看
在这里插入图片描述
如:要获取PID为1的进程信息,你需要查看/proc/1这个文件夹

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

我们写出这样一段C语言代码并运行它
在这里插入图片描述
输入

ps axj | head -1 && ps ajx | grep  xxx| grep -v grep

//xxx是可执行文件名称

即可查看该程序的进程
在这里插入图片描述

3.4 通过系统调用获取进程标识符

每个进程都会有对应的PID(进程id),也会有PPID(父进程id)

在这里插入图片描述
在这里插入图片描述
我们反复运行可以看到,每次运行,该程序的PID都不同,而父进程的ID都是一样的。
这里的父进程其实是bash,我们输入以下命令查看2707进程信息

ps axj | head -1 && ps ajx | grep 2707

在这里插入图片描述
这里说明了bash命令行解释器,本质上也是一个进程

3.5 通过系统调用创建子进程——fork

我们运行一下这段代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 int ret = fork();
 printf("hello proc : %d!, ret: %d\n", getpid(), ret);
 sleep(1);
 return 0;
}

在这里插入图片描述
我们发现会发现打印了两行,说明该程序利用fork()创建了两个进程,而且是父子进程的关系。
fork有两个返回值
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

fork 之后通常要用 if 进行分流
当fork返回值是0时,是子进程。
fork返回值大于0时,是父进程。
我们写一段代码验证一下:
在这里插入图片描述
在这里插入图片描述
可以明显地看到,fork出来的两个进程确实是父子进程的关系。
子进程的ppid一直都是父进程的pid,父进程的ppid也一直是bash的pid

4 进程状态

进程除了运行状态,还会有其他的状态。
我们看一下下面的状态在kernel源代码里的定义

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R运行状态(running):其实运行状态并不代表该进程一定在运行中,它表明进程要么是在运行中或者是在运行队列里。因为在CPU在计算进程时,是将多个进程快速切换并逐一运行的,不是同时运行的,多个进程像队列一样排好队等待CPU计算。因为快速切换的时间非常短,所以我们人很难感觉到。
S睡眠状态(sleeping):意味着程序在等待事件的完成。(这里的睡眠有时候也叫做可中断睡眠)(interruptible sleep)。这里的睡眠状态,本质上是一种阻塞状态
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

4.1 进程阻塞

进程阻塞是一种因为要等待某种条件就绪,而导致的一种不可推进的状态。
说的简单一点,就是该进程需要某种资源才能运行,否则就会卡住。
CPU要处理大量的进程,上面说过,OS要做进程进行管理,管理方式就是先描述,再组织。而我们的PCB可以被维护在不同的队列中,这些队列中都是一个个要被运行的进程,正在排队等待运行的进程的状态,可以看成阻塞状态。或者拿我们的外设键盘来说,如果我们执行了一个需要我们输入后才能运行的程序,在程序等待我们输入的过程中,这个过程就是阻塞状态,并不是运行状态。OS会创建一个相应的结构体task_struct去描述并组织管理这个进程。
所以阻塞就是不被调度,一定是因为当前进程需要某种资源,进程task_struct结构体需要在某种被OS管理的资源下排队。

4.2 挂起状态

前面我们说过,当进程阻塞时就是不被CPU调度,那么此时该进程会在内存里面占有一定的空间,如果这种进程非常多的话就会影响正常的进程运行,所以我们的OS会把这种不被调度的进程的代码和数据放在磁盘中,这种状态就叫做挂起状态,也可以说挂起阻塞状态。

4.3 僵尸(zombie)状态

僵尸状态(Z状态)可以和死亡状态(X状态)联系起来。
如果一个进程退出了,那么它会马上进入X状态,立即退出,那么由于写时拷贝的原因,我们的父进程可能会没有机会拿到子进程的退出结果。所以Linux当进程退出的时候,一般进程不会立即进入X状态,而是要维持Z状态,方便后续父进程或者OS读取该子进程退出的结果。

僵尸进程的危害:可能会造成内存泄漏。
一个进程的退出状态要一直被维持下去,直到父进程读取它的信息。如果父进程一直没有读取它的信息,那么该子进程就会一直维持僵尸状态。维护退出状态本身就是要用数据维护,也属于进程的基本信息,所以保存在PCB中,Z进程不退出,PCB要一直维护,如果有大量的这种不被读取信息的进程,不被回收,就会造成内存资源的浪费,导致内存泄漏。

如果在没有特殊要求的情况,一个父进程结束后,会被bash回收,所以我们一般不会直接看到Z状态。

4.4 孤儿进程

如果一个父进程退出,而它的子进程还在,这个子进程会自动被1号进程领养(这个1号进程就是我们的OS),1号进程成为这个子进程的父进程,这种被领养的进程就叫做孤儿进程。
如果没有这种领养机制,那么子进程后续在退出的时候就没有父进程可以回收了,可能会浪费掉内存,这是不被OS认可的,所以OS会领养这种没有父进程的子进程。

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

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

相关文章

vue+echarts:柱状图横向展示和竖向展示

第021个点击查看专栏目录本示例是显示柱状图&#xff0c;分别是横向展示和纵向展示。关键是X轴和Y轴的参数互换。 文章目录横向示例效果横向示例源代码&#xff08;共81行&#xff09;纵向示例效果纵向示例源代码&#xff08;共81行&#xff09;相关资料参考专栏介绍横向示例效…

什么是真正的骨传导耳机,骨传导耳机原理

骨传导耳机大多采用后挂耳/夹耳佩戴方式&#xff0c;但现在很多人分不清哪些是骨传导耳机&#xff0c;哪些是气传导耳机。看完这篇教会你辨别哪些是真正的骨传导耳机。 骨传导耳机采用固体传声方式&#xff0c;整个耳机机身都没有传声音孔的设计&#xff0c;主要通过耳机振子发…

Retrofit+Hilt后端请求小项目3--Retrofit代码完善

目录ApiConstants定义实体类定义 API 接口定义 Repository定义 ApiModule定义 Application定义 ViewModelApiConstants 这一块存放 API 常量&#xff0c;即后端服务器 BASE_URL&#xff0c;以及对应的后缀 URL 代码清单&#xff1a;data/api/ApiConstants.kt object ApiConsta…

最纯净-Ubuntu系统下如何卸载kubernetes(k8s)-2023最新

首先&#xff0c;如果是卸载k8s-1.24以上版本&#xff0c;需要单独卸载containerd&#xff1a; sudo apt-get purge --auto-remove containerd.io1. 步骤 其他步骤如下&#xff1a; 执行命令&#xff1a; kubeadm reset -fsudo apt-get purge --auto-remove kubernetes…

港科夜闻|广东省省长王伟中会见香港科技大学访问团

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、广东省省长王伟中会见香港科技大学访问团。2月17日&#xff0c;广东省省长王伟中先生在广州与香港科大校董会主席廖长城先生、校董会副主席杨佳锠教授、校长叶玉如教授就加强教育合作、科技创新等进行深入交流。王伟中先生表…

华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

特征与处理-sklearn归一化、标准化、缺失值处理

目录 特征的预处理 归一化 标准化 缺失值 特征的预处理 特征处理定义&#xff1a;通过特定的二统计方法&#xff08;数学方法&#xff09;将数据转换成算法要求的数据 归一化 sklearn归一化API&#xff1a;sklearn.preprocessing.MinMaxScaler from sklearn.preprocessing i…

【Selenium学习】Selenium 总结

1.Selenium 简介Selenium 经历了三个大版本&#xff0c;Selenium 1.0、Selenium 2.0 和 Selenium 3.0。Selenium 不是由单独一个工具构成的&#xff0c;而是由一些插件和类库组成的&#xff0c;这些插件和类库有其各自的特点和应用场景。Selenium 1.0 家族关系如下图所示。1.1 …

华为OD机试 - 数组排序(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

我说我为什么抽不到SSR,原来是这段代码在作祟...

本文是龚国玮所写&#xff0c;熊哥有所新增修改删减&#xff0c;原文见文末。 我说我为什么抽不到SSR&#xff0c;原来是加权随机算法在作祟 阅读本文需要做好心理准备&#xff0c;建议带着深究到底的决心和毅力进行学习&#xff01; 灵魂拷问 为什么有 50% 的几率获得金币&a…

【数据结构】顺序表和链表的区别和联系(详解)

顺序表和链表的区别&#xff08;详解&#xff09; 文章目录顺序表和链表的区别&#xff08;详解&#xff09;前言一、顺序表和链表的关系二、顺序表1.优点2.缺点三、链表1.优点2.缺点四、区别表格总结前言 本文给大家介绍顺序表和链表的各自的优缺点和区别与联系&#xff0c;结…

华为OD机试 - 事件推送(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…

20230222 【梳理】肿瘤检测 预处理+ML+DL

一、预处理 1、形态学【使图像中的重要部分更加可见,并消除MRI图像的琐碎部分。】 形态学操作是一种非线性操作,涉及在二值图像上移动一个窗口(或结构元素),以一种方式帮助增长图像(膨胀)或缩小图像(侵蚀)[30]。这种预处理技术更有用,特别是当MRI图像中存在不需要

基于计算机视觉的智慧养老系统

基于计算机视觉的智慧养老系统 Intelligent elderly care system based on computer vision 基于计算机视觉的智慧养老系统通过&#xff08;模拟&#xff09;多组摄像头实时拍摄到的画面&#xff0c;用计算机视觉技术实时分析老人的情感、是否有人摔倒、是否有人闯入禁止区域…

我的 System Verilog 学习记录(2)

引言 从本文开始&#xff0c;就开始系统学习 System Verilog &#xff0c;不只是语法&#xff0c;还有结合 Questa Sim 的实际编程练习、Debug。 本文简单介绍 System Verilog 语言的用途以及学习的必要性。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08…

C#从值类型、引用类型到装箱和拆箱

上一篇文章讲了C#的值类型和引用类型&#xff0c;这里再来看看值类型和引用类型最直接的使用场景&#xff1a;装箱和拆箱。 一、基本概念 装箱&#xff1a;值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的…

面向对象的三大特征

面向对象&#xff08;OOP&#xff09;的三大特征&#xff1a;继承、封装、多态 一、封装性 为什么需要封装&#xff1f;封装的作用和含义&#xff1f; 我要用洗衣机&#xff0c;只需要按一下开关和洗涤模式就可以了。有必要了解洗衣机内 部的结构吗&#xff1f;有必要碰电动机…

C语言【atoi函数】

C语言【atoi函数】&#x1fac5;系统atoi函数&#x1fac5; 模拟实现atoi函数看到atoi函数&#xff0c;有人又会问有这个函数&#xff0c;我怎么没用过。那就说明&#xff1a;不是你刷题太少&#xff0c;就是atoi函数存在感太低。 这篇函数就带你领略atoi函数的魅力 &#x1fa…

APP测试中ios和androis的区别,有哪些注意点

目录 一、运行机制不同 二、对app内存消耗处理方式不同 三、后台制度不同 四、最高权限指令不同 五、推送机制不同 六、抓取方式不同 七、灰度发版机制不同 八、审核机制不同 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;…

Arduino-流水灯

LED流水灯实验产品介绍&#xff1a;电阻&#xff1a;电阻器通常分为三类&#xff1a;固定电阻器、可调电阻器及特殊电阻器。普通电阻器的识别电阻器阻值和允许误差常用的标志方法有下列3种。1、直接标志法将电阻器的阻值和误差等级直接用数字印在电阻器上。对小于1000W的阻值只…