计算机是如何工作的?

本文深入探讨了计算机的工作原理,包括CPU的构成及其运算速度、操作系统的功能与类型,以及进程和线程的概念。重点讲解了操作系统如何通过进程控制块(PCB)管理进程,阐述了进程的各个状态、优先级、记账信息以及上下文切换。最后,讨论了进程的虚拟地址空间和进程间通信的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、关于CPU

CPU本质:是通过一些基础的门电路构成的

由电子开关-》基础门电路-》半加器-》全加器-》加法器-》进行加减乘除……逐步实现更复杂的操作

CPU为啥跑的快?

因为CPU集成程度非常高,里面包含了非常多的门电路,许多门电路一起算,就会跑的快


二、关于操作系统:

操作系统:是一个搞“管理”的软件,是计算机上最重要,也是最复杂的软件之一

1、对下,管理好各种硬件设备 2、对上,给各种软件提供稳定的运行环境

操作系统种类:Windows、Linux、mac、Android、ios、openwrt……


三、关于进程和线程

进程process(任务task)跑起来的程序就是进程,(运行起来的.exe可执行文件就是进程)

补充:在.exe可执行文件,没有双击执行前,都是一个个文件存在硬盘中,双击之后,操作 系统就会把这个.exe加载到内存中,并且让CPU开始执行.exe内部的一些指令(.exe里面存了很多这个程序对应的二进制指令),这个时候,就将.exe执行起来了,此时就是进程了(因为运行起来了)

线程:线程是进程内部的一个部分,进程包含线程

如果把进程想象成一个工厂,那么线程就是工厂里的生产线,一个工厂里面可以有一个生产线,或者也可以有多个生产线

对于Java代码来说,最终都是通过Java进程来跑起来的(此处这个Java进程就是JVM)


四、操作系统如何管理进程的?

1、先描述进程(明确出一个进程上面的一些相关属性)-》C语言中的结构体

     操作系统中描述进程的这个结构体成为“PCB”(process control block)-》PCB就是进       程控制块

2、再组织若干个进程(使用一组数据结构,把很多描述进程的信息给放到一起,方便进行增删改)典型的实现是使用双向链表来把每个进程的PCB给串起来(Linux)

就像学校管理学生一样,先描述一个学生的各个信息(姓名、学号、身份证号……)再通过表格组织起来


创建进程”就是先创建出PCB,然后把PCB加到双向链表中

销毁进程”就是找到链表上的PCB,并且从链表上删除

查看任务管理器”就是遍历链表,依次取出链表的每个PCB


五、PCB中的一些属性:-》进程的PCB里有啥?

1、pid:就是进程id,类似于进程的身份证号,可以根据pid来识别不同的进程

2、内存指针(操作内存相关属性)指明了这个进程要执行的代码/指令在内存的哪里,以及这个进程执行中依赖的数据都在哪里

因为当运行一个exe时操作系统就会把这个exe加载到内存中变成进程,此时进程就和这块内存空间相绑定的,此时内存中有很多东西,exe里包含(进程要执行的二进制指令-》通过编译器生成的、一些重要的数据)什么,此时内存中就包含什么,而执行exe会将exe里面的东西分别放在内存的不同区域,因此需要让进程知道当前指令在内存的哪个区域中,要使用的数据又在哪个区域中,通过内存指针就可以找到数据和指令

3、文件描述符表(操作文件相关属性):这个文件描述符表可以视为一个数组,里面的每个元素是一个结构体,对应一个文件的相关信息文件描述符表的下标就是文件描述符

因为程序运行过程中,经常要和文件打交道(文件是在硬盘上存储的)进程每次打开一个文件,就会在文件描述符表上多增加一项。

不管你在代码中是否写了打开/操作文件的代码,但只要一个进程一启动,系统都会自动默认打开三个文件-》标准输入(System.in)、标准输出(System.out)、标准错误(System.err)


和进程调度相关的属性(用作对并发的一些支持)

状态、优先级、记账信息、上下文


补充:

进程调度(关于CPU分配):其实也就是操作系统在考虑CPU资源如何给各个进程分配,让有限个核心,能够同时执行很多很多个任务

因为现在的操作系统都是“多任务操作系统”,即一个系统在同一时间可以同时执行很多任务(看起来是同时执行的,时则不是,因为CPU的核数是有限的,不可能同时让几十个、上百个 任务同时执行,此时就需要进程调度了)

怎么能够做到进程调度呢?

并行:微观上,两个CPU核心同时执行两个任务的代码

并发:微观上,一个CPU核心,先执行一会儿任务1,在执行一会儿任务2,在执行一会儿任务3……再执行一会儿任务1……只要切换的足够快,就好像这么多任务在同时执行一样

并行和并发只是在微观上有区分,宏观上区分不了,微观上的区分也都是操作系统自行调度的结果

就比如说:6个核心同时跑20个任务,这二十个任务,有些是并行关系,有些是并发关系,可能任务A和任务B一会儿是并行,一会儿是并发

因为在宏观上区分不了并行和并发,通常用并发来代替并行和并发


4、状态:描述了当前这个进程接下来应该怎么调度(就相当于一个计划表,就像计划今天和A一起做啥事情,明天和B一起做啥事情……)

就绪状态:随时可以去CPU上执行(可以随叫随到)

阻塞状态/睡眠状态:暂时不可以去CPU上执行(不能随叫随到了),处于这样状态的进程,就暂时不进行调度(就比如说A生病了,就暂时不能陪你玩了,此时就不把A放到你的计划表里了)

当然Linux中的进程状态还有很多其他的

5、优先级先给谁分配时间,后给谁分配时间,以及给谁分的多,给谁分的少(就比如说我更喜欢和A一起玩,然后才喜欢和B玩,所以在排计划表时先给A排,就比如周一到周五都和A一起玩,再给B排,周六周日再和B一起玩)

6、记账信息:是给进程调度提供指导依据的。统计了每个进程都分别被执行了多久,分别都执行了哪些指令,分别都排队等了多久……总之就是先统计好每个进程所吃的资源,再根据统计结果,对哪些分配特别少的进程再去做些补偿(就比如说长时间给B安排的时间太少了,此时B可能和你的感情就降低了,此时可以通过这个记账信息来适当的调整和B一起的时间,让感情升升温)

7、上下文:就表示了上次进程被调度出CPU的时候,当时程序的执行状态,下次进程上CPU的时候,就可以恢复之前的状态,然后继续向下执行,就相当于存档+读档

进程被调度出CPU之前,要先把CPU中的所有的寄存器中的数据都给保存到内存中(PCB的上下文字段中),相当于存档了,下次进程再被调度上CPU的时候,就可以从刚才的内存中恢复这些数据到寄存器中,相当于读档了

(就比如说A邀请我下个月去度假,让我提前准备一下,B邀请我下周给她外婆过生日,希望我准备下礼物,但是过了几天后A问我准备好了没,防止我记混说成礼物准备好了,这就尴尬了,此时就需要我们将每次见面的重要信息都记录下来,记录下跟A是要准备度假用品,和B是准备生日礼物,记录之后等到见面的时候,就可以继续做上次约定好的事情了,这样每次见面的时候也能对上号,时间长点也无所谓


上面说了CPU的资源是通过进程调度给各个进程分配的,那么内存资源又是如何分配的呢?

六、关于虚拟地址空间(关于解决内存资源分配问题)-》进程独立性是咋回事?

由于操作系统上同时运行着很多个进程,如果某个进程出现了bug,进程崩溃了,是否会影响到其他进程呢?当然不会,因为“进程的独立性”可以保证,而进程的独立性就依仗了“虚拟地址空间”

(就比如说疫情防控,每个小区有一条路通往外面,有一天突然有个人阳性了,这样就会整个小区被隔离,为了防止这种情况,可以在小区里多弄几条路,让每个人一条路,这样每个人都遇不上,这样如果有一个人阳性了,只需要将这一个人隔离起来即可,就不用整个小区一起隔离了)

如果把进程按照虚拟地址空间的方式给划分出了很多份,这个时候不是每一份都只剩一点儿了吗?

虽然你的系统有百八十个进程,但实际上从微观上看,就6个,每个进程能够捞着的内存还是挺多的,另外一方面,也不是所有进程都用那么多的内存的。


七、虽然进程之间已经通过虚拟地址空间,已将各自隔离开了,但是实际上进程之间有的时候还是需要交互的,那么如何交互呢?-》进程之间如何通信?

(就比如说A和B是彼此隔离开的,有一天A向B借东西,由于他俩不能接触,此时可以找一个地方,让B先把东西放到那个地方,之后A再去那个地方取,这样二者之间你次之间隔离开了但也交互了)

类似的,两个进程之间也是隔离开的,也是不能直接交互的,操作系统也是提供了类似的“公共空间”进程A就可以把数据放到公共空间上,进程B再取走,这样的话就可以在原有隔离性不被破坏的情况下完成交互,这样的操作称为“进程间通信”


操作系统中,提供的“公共空间”有很多种,并且各有特点,有的存储空间大,有的小,有的速度块,有的慢,有的存储空间大,有的小,有的速度块,有的慢,换句话说,操作系统中提供了多种进程间通信机制

现在最主要使用的进程间通信方式:1、文件操作   2、网络操作(socket) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值