操作系统的理解|冯·若依曼体系结构|进程的状态

news2024/12/28 22:18:21

操作系统的理解

  • 冯·诺伊曼体系结构
    • 为什么必须通过内存然后到cpu
    • 存储金字塔
    • 冯·诺伊曼结构的改进在哪?
    • 我们可不可以全部用寄存器来做存储器
    • 在硬件数据流动角度
    • 学以致用:
      • 解释程序运行为什么要加载到内存
      • 程序没被运行之前存在哪里?
  • 操作系统
    • 概念
      • 广义的操作系统
      • 侠义的操作系统
    • 结构
    • 尝试理解操作系统
      • 为什么要有操作系统?
      • 管理
      • 作为用户可以直接访问底层硬件吗?
  • 进程
    • task_struct
    • 查看一个进程的pid
      • 查看父进程
    • 杀死一个进程
    • 创建一个进程
    • 查看一个进程的PCB
    • 进程的状态
      • S睡眠 状态
      • t暂停状态
      • D磁盘休眠状态
      • Z 僵尸状态
      • 孤儿进程
    • 特别的
      • 运行状态的理解
    • 一个进程一旦持有cpu会一直运行到这个进程结束吗?
      • 阻塞状态的理解
    • 挂起态
  • 谢谢观看

在谈操作系统之前我们先从硬件出发

冯·诺伊曼体系结构

红色箭头代表数据信号(数据流动方向),黑色箭头代表控制信号
在这里插入图片描述
可能有的同学,不知道上面五个东西具体是什么,我简单说明下

项目内容
输入设备键盘,鼠标,网卡,摄像头,磁盘,话筒等
存储器内存
输出设备显示器,磁盘,网卡 ,声卡等
cpu运算器,控制器

可能有同学会问为什么网卡和磁盘既是输出设备又是输入设备呢?因为网卡和磁盘可读可写。当我们把东西从内存放在磁盘里时磁盘就是输出设备,当要执行外存中的程序时,必须通过内存然后到cpu,这时磁盘就是输入设备。

为什么必须通过内存然后到cpu

这是冯·诺伊曼体系结构决定的,这样能提高效率。

各个设备之间的数据流动的本质就是数据的拷贝
拷贝的速度决定了数据流动的速度,什么存储器拷贝速度快呢?
下图给了答案

存储金字塔

在这里插入图片描述

冯·诺伊曼结构的改进在哪?

加了存储器,没叫存储器之前,数据直接从输入设备到cpu(cpu是运算器和控制器的集合)然后再到输出设备。这样效率会非常低,因为大量的时间都在等待输入设备输入了。于是我们发明了存储器把程序预先加载在内存中然后再交给cpu,这样做由原先输入设备决定效率变为由内存决定效率。这样做效率提升了1千倍!

我们可不可以全部用寄存器来做存储器

可以是可以,但是价格特别昂贵,不利于计算机的普及。

在硬件数据流动角度

1:cpu不和外设打交道而是和内存打交道
2:外设输入和输出的数据,不是直接传给cpu的,而是先要放入内存中

学以致用:

解释程序运行为什么要加载到内存

因为我们的程序要被cpu访问运算,所以要先到内存才能到cpu
关于拷贝到内存的什么位置,和什么时候拷贝,这是由操作系统完成的

程序没被运行之前存在哪里?

就是普通的二进制文件,在磁盘上

操作系统

概念

进行软硬件资源分配的软件。
对软件比如说我们输入一个文件地址,操作系统就能帮我们找到这个文件,卸载安装程序等等。
对硬件比如说我们分配内存的大小,控制显示器等等。

广义的操作系统

操作系统内核+操作系统外壳周边程序
操作系统周边程序指的是给用户提供使用操作系统的方式,比如说咱们的图形化界面,windows系统安装时自带的office等

侠义的操作系统

只管操作系统的内核

结构

在这里插入图片描述
我们能进行视频通话,我们的操作系统希望控制显示器,摄像头,声卡网卡等硬件,但是每个厂家的硬件设备不一样,那么我们操作系统的程序会随着硬件设备不一样而改变吗?而且我们想硬件的升级,是不是操作系统不答应,我们就改变不了呢?硬件和操作系统中间有一层驱动层,每一个硬件都有驱动。
在这里插入图片描述

尝试理解操作系统

为什么要有操作系统?

类型的问题学校里面为什么要有除老师,学生以外的其他人员,比如说宿管阿姨,保安。没有宿管阿姨可能会发生串寝的问题,没有保安可能会有校外的闲杂人员进来。这些其他人员给我们提供了良好的学习环境。
操作系统给我们提供了稳定,高效,安全的运行环境

在这里插入图片描述
层状的结构划分

操作系统管理我们的软硬件。那么什么叫管理呢?

管理

什么是管理者呢?
我们简单的定义就是大部分做的事情都是决策有关的。
比如在学校的场景校长就是管理者,大到我们学什么和先学什么,犯错误了是否开除小到寝室住哪里都跟校长的决策有关,校长在学校的场景就是管理者,我们学生就是被管理者
但是除了升学和毕业能见到校长,其他时间都没直接接触
也就是说管理者不需要和管理者直接接触
可是他连我的面都没见过,他是怎么做到的?
比如说我们评优评先都是根据绩点管理,我们寝室在哪里是根据学院和年级班级这些数据确定的。
管理的本质都是对数据做管理,而不是对人做管理
校长怎么拿到我们数据的?通过辅导员间接拿到的。
校长关心的是什么数据?我喜欢打麻将,我喜欢吃葡萄这种数据吗?显然不是,而是绩点,获奖情况等,学习相关的信息
校长是关心你吗?还是关心学生。关心的是学生

校长觉得一个学校几万人还是有点多,但是这个校长会写代码,讷能不能通过计算机把所有的同学管理起来呢?
虽然大家都不一样,但是属性都一样,只是里面的值不一样

于是我们为了描述一个学生定义了一个结构体,然后再根据需求把这些数据组织起来。这个组织称为数据结构
比如我们可以通过链表把这些结构体组织起来,方便删除。
也可以通过顺序表把这些结构体组织起来,方便查找。
具体选什么数据结构要看应用的场景。
从此对学生的管理变成对这个数据结构的增删查改
比如开除一个学生就是对数据结构的删除。
说回操作系统
我们有一个 设备的结构体来描述设备,我们可以把设备这个结构体通过链表组织起来,对设备的工作转化为对链表的增删查改。

struct dev
{
	int type;
	int manufacturer;
	...
};

校长类似操作系统不和硬件直接沟通
在这里插入图片描述

作为用户可以直接访问底层硬件吗?

类比我们去银行柜台取钱,银行可以直接让我们进后台取钱吗?他给我们提供了一个柜台窗口,因为它害怕群众里面有坏人,哪怕只有万分之一这也会对银行造成不小的伤害。
操作系统同理,害怕我们胡乱作用,伤害硬件,所以给了我们系统调用这一层。不能直接访问我们的数据结构,操作系统提供了大量的接口(系统调用)来满足用户的需求。好比柜台把用户隔离了起来但也满足了人们的需求。
在这里插入图片描述

进程

在这里插入图片描述
我们把一个程序加载到内存中 这个程序还不能叫进程
当我们要写了很多程序从磁盘加载到内存时,这么多代码和数据怎么管理起来了?
先描述再组织的思想,我们描述这个代码和数据 的优先级 进程id等等 这个用来描述的结构体称为PCB 然后这些PCB 通过链表的形式组装起来。 这样我们就引出了第一个结论什么是进程
进程是 PCB + 代码和数据
这个PCB相当于进程的简历

task_struct

tack_struct 是Linux下PCB的名称
它有以下内容

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

查看一个进程的pid

我们用的指令和我们编译后的代码都是可执行程序。通过file命令可以证明
都是excutable 可执行的
blog.csdnimg.cn/direct/7e34048c1712421db6937d033fd3dd00.png)
ps ajx | head -1 && ps ajx | grep process
在这里插入图片描述
我们可以看到这个进程的pid是13346 为什么 还有grep 这个进程了?因为grep本身这个命令就是进程 只不过一瞬间执行完毕了而已
我们还可以通过getpid()这个系统调用来查看一个进程的pid
在这里插入图片描述

#include<stdio.h>                                                        
#include<unistd.h>
 int main()
 {
 pid_t id = getpid(); 
 while(1)
 {
  printf("当前进程pid:%d",id);  
   printf("prcess is workig\n");  
   sleep(1);                      
  }           
   return 0;                       
 }             
~  

查看父进程

getppid()

杀死一个进程

kill -9 进程id
在这里插入图片描述

创建一个进程

fork()
在这里插入图片描述
当我们运行这个代码的时候 printf会被执行两次 因为fork创建了一个子进程

在这里插入图片描述
多了一个进程就是多了一个PCB

查看一个进程的PCB

ls /proc/进程名 exe指向的是绝对路径下的可执行程序
当一个程序正在运行时我们把这个可执行删了,这个程序还是在运行的,因为它以及从磁盘加载到内存了
在这里插入图片描述
通过cwd 我们可以看到进程所在的路径,我们能不能改掉这个路径呢?
可以的通过chdir

#include<stdio.h>    
#include<unistd.h>    
#include<sys/types.h>    
int main()    
{    
  chdir("/home/lj/111");    
  FILE *pf = fopen("log.txt","w");    
  (void)pf;    
  while(1)    
  {    
    printf("this process is working\n");    
    sleep(1);    
  }                                                                   
  return 0;    
}  

在这里插入图片描述

进程的状态

本质是task_struct 的一个变量(标志位)有哪些状态呢?

  1. R运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列中
  2. S睡眠状态(sleeping):意味着进程在等待某件事完成(这里的睡眠也叫浅睡眠,可以被中断)
  3. D磁盘休眠状态(Disk sleep):这个也叫不可中断状态
  4. T停止状态:可以通过SIGSTOP信号给进程来停止另一进程,这个暂停的进程可以通过SIGCONT信号让进程继续运行。
  5. X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

S睡眠 状态

int main()    
{    
  pid_t pid = getpid();    
  while(1)    
  {    
    printf("I am process id:%d\n",pid);    
    sleep(1);    
  }                                                               
  return 0;    
} 

监视小脚本

while :; do ps ajx| head -1 && ps ajx | grep testStatus | grep -v grep; sleep 1; done

在这里插入图片描述
为什么这个程序是S状态了?因为cpu的速度很快 它打印了大量的字符缓冲到缓冲区里,然后显示器慢慢的1秒1秒的显示,所以cpu大量处于空闲状态,等待显示器准备就绪
当我们把sleep去了 也是S状态因为cpu比外设的速度快太多了。
当我们把sleep 和 printf去掉之后 才是R状态 因为CPU不和外设打交道了。

t暂停状态

通过kill -l 可以看到kill命令的选项
kill-19 可以让一个进程停止
在这里插入图片描述
kill-18 可以让一个进程恢复
我们的调试也是让一个进程停止

D磁盘休眠状态

在这里插入图片描述
操作系统有权在内存不够的清空下杀死进程。 如果我们直接杀死进程 就会直接丢失1GB的数据,所以操作系统把这个进程标记为D状态不可杀死,等待这个IO结束。

磁盘休眠状态,又是又叫不可中断睡眠状态,通常会等待IO的结束

Z 僵尸状态

进程退出的时候不是直接释放的,需要父进程读取该进程PCB中的退出信息(知道事情是否办成功),如果一直没有父进程读取那么该进程一直是僵尸状态。数据和代码释放了 但是PCB没有释放

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
void runchild()
{
    int cnt = 5;
    while(cnt)
    {      
      printf("进程号:%d 我是子进程\n",getpid());
      sleep(1); 
      cnt--;
    }   
}
int main()
{

  int ret = fork();
  if(ret == 0)

    runchild();
  }
  else
  {
    while(1)
    {
      printf("进程号:%d 我是父进程\n",getpid());
      sleep(1);
    } 
  }
  return 0;
}

当这段代码执行完毕子进程就会一直在僵尸状态,会造成内存泄漏!

孤儿进程

子进程运行期间父进程先退出了
子进程将会被1号进程“收养”
我们命令行启动的进程父亲是bash,会自动回收

特别的

下图是操作系统课上的进程状态 和Linux的进程状态有共性但是不完全一样
在这里插入图片描述

运行状态的理解

进程在运行队列里就称为运行状态
在这里插入图片描述

一个进程一旦持有cpu会一直运行到这个进程结束吗?

不会 因为操作系统会基于时间片轮转调度。
(单个cpu)多个进程以切换的方式进行调度,在同一个时间段内同时推进代码 则称为并发
进程切换中最重要的事情上下文数据的保护和恢复
(多个cpu)任何时间有多个进程真的同时运行,称为并行

阻塞状态的理解

阻塞态时,进程从运行队列里拿出来进入该设备的阻塞队列中。
唤醒:就是从阻塞队列放回运行队列
入队列的不是进程的代码和数据而是进程的task_struct
在这里插入图片描述

挂起态

比阻塞的时候 内存中的进程的代码和数据 为了缓解内存压力被复制磁盘上,然后内存中的代码和数据被释放。牺牲效率换空间
在这里插入图片描述

谢谢观看

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

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

相关文章

H5小程序视频方案解决方案,实现轻量化视频制作

对于许多企业而言&#xff0c;制作高质量的视频仍然是一个技术门槛高、成本高昂的挑战。针对这一痛点&#xff0c;美摄科技凭借其深厚的技术积累和创新能力&#xff0c;推出了面向企业的H5/小程序视频方案解决方案&#xff0c;为企业提供了一种轻量化、高效、便捷的视频制作方式…

flutter布局更新

理论上&#xff0c;某个组件的布局变化后&#xff0c;就可能会影响其他组件的布局&#xff0c;所以当有组件布局发生变化后&#xff0c;最笨的办法是对整棵组件树 relayout&#xff08;重新布局&#xff09;&#xff01;但是对所有组件进行 relayout 的成本还是太大&#xff0c…

目前2024年腾讯云4核8G服务器租用优惠价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

车载以太网AVB交换机 TSN交换机 时间敏感网络 6端口 百兆 SW100TSN

SW100 TSN时间敏感网络AVB交换机 为6端口百兆车载以太网交换机&#xff0c;其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100/1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现纳米级时间同步&#xff0c;车载以太网多通道交换&#xff0c;Bypass数据采集和监控等功能&…

B2 PRO WordPress主题:多功能商用主题,助力资讯、资源、社交、商城、圈子、导航一站式解决

B2 PRO WordPress主题&#xff1a;多功能商用主题&#xff0c;助力资讯、资源、社交、商城、圈子、导航一站式解决 一、产品概述 B2 PRO WordPress主题&#xff0c;作为一款多功能商用主题&#xff0c;致力于为用户提供一站式的内容管理与网站建设服务。它集资讯发布、资源共享…

4.常用CMD命令

扩展一个小点&#xff1a; 在很多资料中都说成是DOS命令&#xff0c;其实是不对的。真正的DOS命令是1981年微软和IBM出品的MS-DOS操作系统中的命令才叫做DOS命令。 而在Windows中&#xff0c;win98之前的操作系统是以非图形化的DOS为基础的&#xff0c;可以叫做DOS命令。到了…

精酿啤酒:特殊酵母的发酵特性与风味表现

Fendi Club啤酒在酿造过程中采用了特殊的酵母&#xff0c;这些酵母具有与众不同的发酵特性和风味表现&#xff0c;为啤酒带来了与众不同的风味和口感。 Fendi Club啤酒使用的酵母种类繁多&#xff0c;包括艾尔酵母和拉格酵母等。这些不同种类的酵母在发酵过程中具有不同的特性和…

unity学习(70)——编译游戏发生错误2

1.全屏问题其实无所谓&#xff0c;windows用tab可以切出来的。 2.现在主要问题是服务器try了以后虽然不崩溃了&#xff0c;但不再显示2个实例对象了&#xff0c;unity和exe此时都只能看到一个实例对象 2.1把之前报错位置的try-catch先注释掉 2.2 unity中此时登录666账号&…

0103设计算法-算法基础-算法导论第三版

文章目录 一、分治法二、分析分治算法结语 我们可以选择使用的算法设计技术有很多。插入排序使用了增量方法&#xff1a;在排序子数组 A [ 1 ⋯ j − 1 ] A[1\cdots j-1] A[1⋯j−1]后&#xff0c;将单个元素 A [ j ] A[j] A[j]插入子数组的适当位置&#xff0c;产生排序好的子…

java-获取1688网站商家信息----简单应用

1.下载google浏览器 注: 苹果电脑下载 旧版本google浏览器 点设置时会自动更新, (卸载重装),运行时版本和驱动不匹配会报错 第三方网站下载链接:旧版本(安装后老是提示更新,最新版本没有找到对应的驱动,不能更新它) Google Chrome 64bit OS X版_chrome浏览器,chrome插件,谷歌浏…

基于Springboot的疫情隔离酒店管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的疫情隔离酒店管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

完全二叉树的层序遍历[天梯赛]

文章目录 题目描述思路 题目描述 输入样例 8 91 71 2 34 10 15 55 18 输出样例 18 34 55 71 2 10 15 91思路 完全二叉树最后一层可以不满&#xff0c;但上面的每一层的节点数都是满的 后序遍历的顺序为"左右根"&#xff0c;我们可以用数组模拟完全二叉树&#xff0c;…

奶瓶哪个牌子的比较好?适合新生儿的奶瓶分享

每一位新手家长都要选购很多东西&#xff0c;而必备的无疑就是新生儿奶瓶了。如果你不知道要给宝宝选什么品牌的奶瓶好&#xff0c;不懂哪些材质符合安全无毒标准。那么收藏这篇文章就对了&#xff0c;作为一名测评博主&#xff0c;我近期测评了多款全网热议的奶瓶&#xff0c;…

【机器学习300问】54、如何找到有效的组合特征?

一、为什么需要去寻找有效的组合特征&#xff1f; 因为并不是所有的特征组合都会意义&#xff0c;都能带来价值。 例如在房价预测场景中&#xff0c;卧室数量和浴室数量的比值有意义&#xff0c;但房屋面积与建造年份相组合作为新的组合特征&#xff0c;可能就没有实际含义&…

面试经典150题【111-120】

文章目录 面试经典150题【111-120】67.二进制求和190.颠倒二进制位191.位1的个数136.只出现一次的数字137.只出现一次的数字II201.数字范围按位与5.最长回文子串97.交错字符串72.编辑距离221.最大正方形 面试经典150题【111-120】 六道位运算&#xff0c;四道二维dp 67.二进制…

[HackMyVM]靶场quick5

kali:192.168.56.104 靶机:192.168.56.134 端口扫描 # nmap 192.168.56.134 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-03-27 19:08 CST Nmap scan report for careers.quick.hmv (192.168.56.134) Host is up (0.000056s latency). Not shown: 998 closed tcp p…

Unity编辑器功能将AB资源文件生成MD5码

将路径Application.dataPath/ArtRes/AB/PC文件夹下所有的Ab包文件生成MD5吗&#xff0c;通过文件名 文件长度MD5‘|’的格式拼接成字符串写入到资源对比文件abCompareInfo.txt中。 将路径pathFile扥文件生成MD5码

C语言学习之环境搭建【建议收藏】

学生时代&#xff0c;我们一般使用的VC【Microsoft Visual C 2010&#xff08;学习版&#xff09;】进行学习&#xff0c;该篇博客主要记录如何安装VC&#xff0c;非常详细&#xff0c;适合入门的小白&#xff0c;奶妈级别安装教程&#xff0c;建议收藏。 准备好软件安装包&…

LeetCode刷题--- Dijkstra 求最短路径

首先是图的表示&#xff0c;邻接矩阵和邻接表。实现看代码 邻接矩阵&#xff1a;二维数组&#xff0c; matrix[a][b] 表示 从a可以指向b无向图而言&#xff0c; matrix[a][b]matrix[b][a]&#xff0c;比如可以定义matrix[a][b]1表示ab是连接的&#xff0c;matrix[a][b]0表示ab…

Docker进阶:Docker Swarm —弹性伸缩调整服务的副本数量

Docker进阶&#xff1a;Docker Swarm —弹性伸缩调整服务的副本数量 1、 创建一个Nginx服务&#xff08;Manager节点&#xff09;2、查看服务状态&#xff08;Manager节点&#xff09;3、测试访问&#xff08;Worker节点&#xff09;4、查看服务日志&#xff08;Manager节点&am…