linux基础5:linux进程1(冯诺依曼体系结构+os管理+进程状态1)

冯诺依曼体系结构+os管理

  • 一.冯诺依曼体系结构:
    • 1.简单介绍(准备一)
    • 2.场景:
      • 1.程序的运行:
      • 2.登录qq发送消息:
    • 3.为什么需要内存:
      • 1.简单的引入:
      • 2.计算机存储体系:
      • 3.内存的意义:
  • 二.操作系统:
    • 1.概念引入:
    • 2.故事引入:(校园环境做背景)
      • 1.管理者和被管理者是不需要见面
      • 2.管理者如何获取被管理者信息?
      • 3.数据量较大的时候怎么办?
      • 4.建立学生的数据结构:保存在容器中
      • 5.总结:管理的过程就是一个 先描述再组织的一个过程!
    • 3.系统调用和库函数的概念:
      • 1.基本概念:
      • 2.从上到下需要注意的一些问题:
  • 三.进程管理:
    • 1.承上启下:
    • 2.基本概念:
      • 2-1事实:
    • 3.描述进程:PCB :task_struct(linux系统下)
    • 4.场景一:加载多个程序到内存:
    • 5.task_struct 内容分类:
      • 5-1:程序计数器
    • 6.组织和查看进程:
      • 6-0:在C/C++下获取当前程序的子父进程号的函数:
      • 6-1:查看进程简单方式:
      • 6-2:创建文件:
      • 6-3:chdir() 修改当前工作目录:
    • 7.系统调用创建进程——fork
      • 7-1:创建子进程:
      • 7-2:三个问题:
        • 1:给父进程返回子进程的pid 给子进程返回0?
        • 2:一个函数只能返回一个值?这个tmp有两个值?返回了两次吗?
        • 3:if 和else 的判断都满足条件说明 tmp==0 并且大于0?
        • 4:一个进程奔溃了影不影响另一个进程?
    • 8.进程状态:
      • 8-1:进程排队:
        • 问题一:需要找到结构体的首地址!
        • 问题二:队列:
      • 8-2:状态:
      • 8-3:运行:
      • 8-4:阻塞:
      • 8-5:挂起:

一.冯诺依曼体系结构:

1.简单介绍(准备一)

在这里插入图片描述

常见的输入设备:磁盘 ,键盘,鼠标,摄像头,麦克风,声卡,网卡,数位板。
常见的输出设备:显示器,声卡,网卡,打印机。
输入+输出:声卡,网卡。
cpu的功能:进行运算操作+控制cpu的信息流动。
存储器就是我们的内存:所以的设备都只能和内存打交道。

2.场景:

1.程序的运行:

一个程序的运行是直接加载到内存当中的!

在这里插入图片描述

2.登录qq发送消息:

在这里插入图片描述

3.为什么需要内存:

1.简单的引入:

1.假设我们的体系结构中只有输入设备,输出设备,cpu三个主要部分?
2.结论:系统效率大大降低,效率只取决与输入输出设备:

在这里插入图片描述

2.计算机存储体系:

在这里插入图片描述

1.从上到下速度越来越慢:
2.造价越来越便宜:
3.每级之间效率相差不大:

3.内存的意义:

1.因为cpu直接和输入输出设备进行交互太缓慢:运行程序多的时候就只能看输入和输出设备:
2.输入设备的中的可执行程序加载到内存中cpu没有执行之前程序都可以预先加载到内存中。
3.cpu要进行运算就从内存中去拿到程序。
4.执行结果也可以在内存中进行保存让输出设备一个一个的拿出去。

有了上面两个知识的铺垫我们就可以解释内存存在的意义:

1.整个系统的效率就由内存的效率决定了:
2.减少了使用成本并且体系结构使用稳定:
3.综上所述:整个硬件体系就不存在影响效率的问题了,转换到了软件的问题,整个机器的效率就要看操作系统了。

二.操作系统:

1.概念引入:

1.操作系统本质是一个软件,是第一个软件。
2.操作系统和底层硬件之间的联系结构图。

在这里插入图片描述

2.故事引入:(校园环境做背景)

校长—>做决策:
辅导员—>保证管理和决策落地:
学生---->被管理人:

1.管理者和被管理者是不需要见面

1.管理者和被管理者之间是通过管理者获取到被管理者的信息进行管理本质上是对信息做管理。

2.管理者如何获取被管理者信息?

1.通过辅导员拿到被管理者的信息!

3.数据量较大的时候怎么办?

1.当管理者在面对大量的被管理者的时候,这么多的数据如何去处理?把对人的管理变成对数据的管理!

4.建立学生的数据结构:保存在容器中

1.我们知道每一个学生都有相同的属性不同的内容,每一个学生的属性内容都是不一样的。
2.建立学生结构体,把信息保存在容器中,进行对学生数据的管理:
3.对学生的管理就转移到了对容器的每一个学生信息结构体的增删查改。

5.总结:管理的过程就是一个 先描述再组织的一个过程!

通过上面的介绍:对于底层硬件的管理就是
1.操作系统(驱动管理)----------->校长。
2.硬件驱动-------->辅导员
3.硬件本身-------->学生
4.总结:对于硬件的管理本质上就是一个先描述再组织的过程。
描述:结构体进行描述 组织:使用数据结构进行组织
5.为什么需要操作系统?
5-1:没有操作系统需要自己管理和控制硬件:
5-2:对下:更好的控制软硬件资源:
5-3:对上:提供良好的运行环境:
5-4:稳定,高效,安全。

3.系统调用和库函数的概念:

1.基本概念:

1.在开发角度,对外会表现为一个整体,但是会暴露自己的部分接口,供上层进行开发使用,这部分由操作系统提供的接口叫做系统调用。
2.系统调用在使用上,功能比较基础,对用户的要求相对比较高,所以有心的开发者可以对部分系统进行适度的封装,从而形成了库,有了库,就更加利于用户的使用和开发者的开发。
3意义:解决系统调用:减少接口使用成本:
4.上面这个概念有可能不是特别容易听懂:说一个故事!

可以把系统调用接口想象成银行的取钱的窗口,一个比较会存取钱的人(不需要lib库可以直接和系统接口交互)来了呢可以直接取号去到窗口办理业务。那么现在有一位老大爷要来取钱老大爷什么也不会那么这个老大爷就找到了大堂经理(lib库),大堂经理就帮助老大爷进行拿号到窗口办理业务取钱的整个过程相当于调用系统接口借助了lib库的帮助一样。

在这里插入图片描述

2.从上到下需要注意的一些问题:

1.从上到下是不可以发生越级访问。
2.不可以绕过操作系统
3.操作系统从头到尾是贯穿的。

三.进程管理:

1.承上启下:

操作系统是怎么进行进程管理的呢?
非常简单先描述再组织的一个过程!

2.基本概念:

课本上:程序的一个执行实例,正在执行的的一个程序:
内核上:担当分配系统资源(cpu时间 , 内存)实体。

上面这些概念不是特别的好可以不看!用网上比较火的说法就是:如说!

2-1事实:

1.我们可以同时启动多个程序—多个exe加载到内存中:
2.操作系统需要管理多个加载到内存中的程序!
3.操作系统如何管理加载到内存中的程序呢?先描述再组织!

3.描述进程:PCB :task_struct(linux系统下)

task_struct(进程控制块:进程属性的合集) 是PCB的一种是linux系统下的描述进程属性的结构体,它会被装载到RAM(内存)里并且包含进程的信息。

4.场景一:加载多个程序到内存:

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

在这里插入图片描述

5.task_struct 内容分类:

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

5-1:程序计数器

程序计数器: 程序中即将被执行的下一条指令的地址。
在这里插入图片描述

6.组织和查看进程:

1.PCB->task_struct :PCB操作系统规定的名称!
2.结构体中包含进程的所有属性:

在这里插入图片描述
在这里插入图片描述

6-0:在C/C++下获取当前程序的子父进程号的函数:

#include<unistd.h>
#include<sys/types.h>
1.获取当前程序的进程:getpid():
2.获取当前程序的父进程:getppid():

6-1:查看进程简单方式:

方法一:查看系统文件夹:/proc/ 下的进程信息!
请添加图片描述

方法二:通过命令进行查询:
ps ajx | head -1 && ps ajx | grep mybin
ps ajx 查看当前系统的所有进程
请添加图片描述

方法三:使用脚本进行进程的刷新:
while : ; do ps ajx | head -1 && ps ajx | grep mybin ;sleep 1 ; done
功能:可以进行实时的进程信息观察:
请添加图片描述

6-2:创建文件:

在这里插入图片描述

1.我们知道在C语言中我们使用fopen()函数打开一个文件进行只写操作,如果当前路径下没有这个文件会创建一个文件用来进行写入!
2.那么 这个路径在linux中是以什么进行保存的呢?
3.我们查看了proc中存放的该进程的程序:
cwd(当前工作路径):/LIMO/proc_learn/
exe(可执行程序的路径):/LIMO/proc_learn/mybin
4.fopen() 函数可以找到cwd的路径并且在这个路径下生成文件!

请添加图片描述

6-3:chdir() 修改当前工作目录:

在这里插入图片描述

动图效果:
请添加图片描述

7.系统调用创建进程——fork

7-1:创建子进程:

使用man fork 查看一下信息!
1.复制当前进程称为父进程生成一个子进程。
2.fork有两个返回值!
3.父进程拿到新开辟子进程的pid,子进程拿到pid为0的返回值!
4.子进程的意义,我们想要生成的子进程去给我们做事情!

在这里插入图片描述

 44 int main()
 45 {
 46     int n1=5;
 47     while(n1--)
 48     {
 49         printf("当前进程:%d 当前父进程: %d\n",getpid(),getppid());
 50     }
 51 
 52     pid_t tmp = fork();
 53     printf("程序pid: %d",getpid());
 54 
 55     while(1)
 56     {
 57         if(tmp == 0)
 58         {
 59             
 60         printf("当前进程是子进程的进程号:%d 当前父进程: %d\n",getpid(),g    etppid());
 61         }
 62         else
 63         {
 64 
 65         printf("当前进程是父进程的进程号:%d 当前父进程: %d\n",getpid(),g    etppid());
 66         }
 67         sleep(1);
 68     }
 69     return 0;
 70 }

//观察一下动图效果:

在这里插入图片描述

7-2:三个问题:

1:给父进程返回子进程的pid 给子进程返回0?

父进程:子进程 = 1:n 一个父进程有可能有多个子进程,所以想要父进程可以确定的找到某一个子进程就需要返回子进程的pid 。对于子进程来说父进程只有一个所以找到父进程是非常容易的所以返回0;

2:一个函数只能返回一个值?这个tmp有两个值?返回了两次吗?

fork()函数的实现:
在这里插入图片描述

子父进程共享变量,在return的时候发生写时拷贝变量名是相同的,地址不相同,进程号不相同,拷贝使用不同的内存空间!在linux下可以使用同一个变量名表示不同的内存!

3:if 和else 的判断都满足条件说明 tmp==0 并且大于0?

这个问题需要一些后面的知识以后再说!

4:一个进程奔溃了影不影响另一个进程?

命令: kill -9 进程号 :单独杀死一个进程!

动图效果:
在这里插入图片描述

8.进程状态:

8-1:进程排队:

在这里插入图片描述

1.进程具有这样的连接状态,只要进程的task_struct 进行这样的排队。直接连在这个地方。我们只要有这个节点就可以找到这个链表,就可以链入全局双链表或者链入队列!

问题一:需要找到结构体的首地址!

在这里插入图片描述

找到了task_struct 的首地址就可以对对象数据进行任意的访问!
在全局还是任何队列消息非常容易找到!

问题二:队列:

1.进程·不是一直在运行的(有可能在等待软硬件的资源)进程放在cpu中也不是一直都会运行的!
2.只要是进程排队就是pcb排队!
3.如何排队就是通过struct listnode 结构体保存信息进行排队!

8-2:状态:

运行,阻塞,挂起:都是一个状态这些状态都有对应的队列!
进程的一个状态就是:进程在状态队列进行的一个排队!把对应的struct listnode 加到保存的对应的位置!

这些状态是如何进行保存的呢?

struct task_struct {
int status;
……………………
}

#define New 1
#define Ready 2
#define runing 3
#define block 4

8-3:运行:

1.一个cpu一个运行队列:
2.struct runqueue{
int num;
task_struct* q ;//保存了pcb中的struct listnode 这个对象的地址!
}
3.已经加载到运行时队列,表示的意思是我已经准备好被随时的进行调度了!

在这里插入图片描述

8-4:阻塞:

在这里插入图片描述
在这里插入图片描述

1.这个时候就进入了阻塞状态。
2.为什么产生?需要获取软硬件的资源所以进入阻塞状态!
3.阻塞状态是有一个阻塞队列的和运行队列是一个作用!
4.阻塞队列(等待队列)是由对应的的硬件提供的!
5.进程进入等待队列是把进程链入底层设备的一个过程!
6.对于设备来说输入数据完成就是表示硬件已经就绪?这个状态只有操作系统最清楚!操作系统在这个地方就进行了管理!

总结:进程在等待软硬件资源的时候,如果没有准备好我们的task_struct
1.将自己设置为阻塞状态,进入对应软硬件提供的等待队列。
2.把自己的pcb链入对应软硬件提供的等待队列。
3.状态的改变,导致pcb会被os变迁到不同的队列中!

8-5:挂起:

1.进入挂起的前提是:资源已经非常吃紧了!
2.这个挂起也叫做阻塞挂起!
3.在阻塞状态下把进程相关的代码和数据转换到外设中节省内存空间。
4.意义:我们可以慢一些但是不可以为了快产生资源吃紧导致有可能最后操作系统就挂掉了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【广州华锐互动】利用VR体验环保低碳生活能带来哪些教育意义?

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进了我们的生活。从游戏娱乐到教育培训&#xff0c;VR技术的应用范围越来越广泛。而在这个追求绿色、环保的时代&#xff0c;VR技术也为我们带来了一种全新的环保低碳生活方式。让我们一起走进…

企业微信web登录实现

企业微信登录流程 实现方式 使用js-sdk 使用 wecom/jssdk 初始化企业微信登录组件。 为了满足网站定制化的需求&#xff0c;我们支持将企业微信登录组件内嵌到开发者的网站中。用户使用企业微信登录授权后&#xff0c;登录组件将 auth code 返回给网站。 企业微信登录组件主…

Android开发从0开始(广播)

应用广播 发送标准广播的三步骤 发送标准广播&#xff1a; //发送标准广播 Intent intent new Intent("com.dongnaoedu.chapter09.standard"); sendBroadcast(intent); 定义广播接受者: public class StanderdReceiver extends BroadcastReceiver { public s…

ECharts与DataV:数据可视化的得力助手

文章目录 引言一、ECharts简介优势&#xff1a;劣势&#xff1a; 二、DataV简介优势&#xff1a;劣势&#xff1a; 三、ECharts与DataV的联系四、区别与选择五、如何选择根据需求选择技术栈考虑预算和商业考虑 结论我是将军&#xff0c;我一直都在&#xff0c;。&#xff01; 引…

关于进制的转化

二进制转十进制&#xff1a; &#x1f530; 方法一&#xff1a;二进制转十进制&#xff0c;用各数的码位与位权的乘积之和&#xff0c;说白了就是用从右到左的每个数去乘以2的幂次方&#xff08;最右边是0&#xff09;&#xff0c;然后就所有的数相加。 补充&#xff1a;位权是…

多模态常见任务介绍

视觉问答&#xff08;VQA&#xff0c; Visual Question Answer&#xff09; 目标&#xff1a;给定一个图片以及问题&#xff0c;需要理解图片的内容并基于此用自然语言回答问题。 例如&#xff0c;图像中发生什么事&#xff0c;人物穿的衣服是什么颜色&#xff0c;图像中有多…

在Windows系统上安装git-Git的过程记录

01-上git的官网下载git的windows安装版本 下载页面链接&#xff1a; https://git-scm.com/downloads 选择Standalone Installer的版本进行下载&#xff1a; 这里给大家一全git-2.43.0的百度网盘下载链接&#xff1a; https://pan.baidu.com/s/11HwNTCZmtSWj0VG2x60HIA?pwdut…

【DDS】OpenDDS配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍OpenDDS配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更…

【译】Spring 6 入参数据校验: 综合指南

原文地址&#xff1a;Spring 6 Programmatic Validator: A Comprehensive Guide 一、前言 在 Spring 6.1 中&#xff0c;有一个非常值得注意的重要改进——编程式验证器实现。Spring 长期以来一直通过注解支持声明式验证&#xff0c;而 Spring 6.1 则通过提供专用的编程式验证…

【挑战业余一周拿证】AWS 认证云从业者 - 基础(AWS Certified Cloud Practitioner- Foundational)

一、前言 二、开支记录 三、活动时间 四、活动任务 五、关注订阅号 六、如何报名 Q: 我想参加CSDN 孵化器活动&#xff0c;如何报名&#xff1f; Q: 我想正式报考AWS认证考试&#xff0c;该怎么办&#xff1f; Q: 如何领取考试券&#xff1f; Q: 本次活动考试的费用是…

功率半导体器件CV测试系统

概述 电容-电压(C-V)测量广泛用于测量半导体参数&#xff0c;尤其是MOS CAP和MOSFET结构。MOS(金属-氧化物-半导体)结构的电容是外加电压的函数&#xff0c;MOS电容随外加电压变化的曲线称之为C-V曲线&#xff08;简称C-V特性&#xff09;&#xff0c;C-V 曲线测试可以方便的确…

申请二级域名

1、登录腾讯云 腾讯云 产业智变云启未来 - 腾讯 (tencent.com) 2、进入我的域名&#xff0c;点击主域名 3、点击前往DNSPod管理 4、点击我的域名&#xff0c;然后点击主域名 5、点击添加记录&#xff0c;进行添加二级域名信息 6、添加相应二级域名信息 7、添加后需要进行验证…

ThreeJs实现简单的动画

上一节实现可用鼠标控制相机的方式实现动态效果&#xff0c;但很多时候是需要场景自己产恒动态效果&#xff0c;而不是通过鼠标拖动&#xff0c;此时引入一个requestAnimationFrame方法&#xff0c;它实际上是通过定时任务的方式&#xff0c;每隔一点时间改变场景中内容后重新渲…

复亚智能交通无人机:智慧交通解决方案大公开

城市的现代化发展离不开高效的交通管理规划。传统的交通管理系统庞大繁琐&#xff0c;交警在执行任务时存在安全隐患。在这一背景下&#xff0c;复亚智能交通无人机应运而生&#xff0c;成为智慧交通管理中的重要组成部分。交通无人机凭借其高灵活性、低成本、高安全性等特点&a…

前装标配搭载率突破30%,数字钥匙赛道进入「纵深战」周期

在汽车智能化进程中&#xff0c;作为传统高频应用的车钥匙&#xff0c;也在加速数字化升级。同时&#xff0c;在硬件端&#xff0c;从蓝牙、NFC到UWB等多种通讯方式的叠加效应&#xff0c;也在大幅度提升数字钥匙的用户体验。 目前&#xff0c;部分市场在售车型&#xff0c;车企…

蓄电池监控技巧,节省了我80%的无效工作!

在当今社会&#xff0c;蓄电池作为能源存储和备用电源的关键组件&#xff0c;已经在各行各业中扮演着愈发重要的角色。 然而&#xff0c;蓄电池在使用过程中面临着一系列的挑战&#xff0c;包括性能衰减、安全隐患和能源效率等问题。在这种背景下&#xff0c;蓄电池监控技术应运…

系列三、事务

一、事务 1.1、概述 事务是数据库操作的基本单元&#xff0c;它是指逻辑上的一组操作&#xff0c;要么都成功&#xff0c;要么都失败。典型场景&#xff1a;转账&#xff0c;例如Jack给Rose转账1000元&#xff0c;转账成功&#xff1a;Jack账户的余额少1000元&#xff0c;Rose…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来&#xff0c;我国光伏发电行业规模日益壮大&#xff0c;全球领先地位愈发巩固。为解决光伏电站运维中的难题&#xff0c;浙江某光伏电站与复亚智能达成战略合作&#xff0c;共同推出全自动无人机光伏巡检系统&#xff0c;旨在提高发电效率、降低运维成本&#xff0c;最大…

NX二次开发UF_CSYS_create_csys 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_csys Defined in: uf_csys.h int UF_CSYS_create_csys(const double csys_origin [ 3 ] , tag_t matrix_id, tag_t * csys_id ) overview 概述 Creates a CSYS. 创…

算法:给出指定整数区间、期望值,得到最终结果

1&#xff0c;问题&#xff1a; 在游戏中&#xff0c;我们经常会遇到以下情况&#xff1a;打开宝箱&#xff0c;获得x个卡牌碎片。 但通常策划只会给一个既定的数值空间&#xff0c;和一个期望得到的值&#xff0c;然后让我们去随机。比如&#xff1a; 问题A&#xff1a;在1~…