温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
这是一段程序,本身不会执行,就好像是一个做菜的食谱,程序会由程序员写好,放在硬盘中永久保存,而食谱可能会放在抽屉里,那为了做这道菜,我们需要将食谱拿出来放到桌上,然后按照步骤做菜。这相当于CPU来从硬盘中读取程序到内存中,方便CPU读取。那这个在内存中的可执行程序实例就叫做进程。一个程序若多次读取到内存中,则变成了多个独立的进程。硬盘中多个程序读取到内存中运行时,当然也就创造了更多的进程。内存中任何一个地方都有相应的地址方便访问,而在内存中的每个进程,自己内部都有一个虚拟的独立地址空间,在进程内就可以根据虚拟地址来访问。那进程间是怎么访问呢?首先,进程是程序执行的完整单位。
01:00
所以大部分时间都是在进程内,那进程间就需要进程间通行IPC,这可能需要系统调用,访问会更慢。今天我们就不展开了。每个进程都以为自己独占着整个内存,不需要关心其他的进程的实际位置,这样就把进程门很好的分隔开来了。每个进程首先有加载程区,通常只有一个程序计数器记录当前程序执行的位置,会按照程序顺序计算。这里一个执行流就是一个线程,如果有多个线程的话,就需要多个程序计数期,每个线程会独自运行。除此之外,每个线程还有寄存器、堆栈等程序运行时的状态信息,同时线程间共享的则有地址、空间、全局、变量、打开的文件等等信息。那为什么在进程中还要有更小的进程线程呢?假如这是一个文档编辑息。
02:00
自然就是一个进程存放着相应的程序和文档,那现在用户用键盘在第二行末打一个回车,我们需要交互的程序接收键盘的按下事件,然后布局的程序将文字重新计算位置,再把它们渲染出来。另外每隔一段时间需要写入的程序保存文档到硬盘中。所以这三个程序最好是能够并行执行,但他没有需要访问修改同一个文档,所以肯定是在同一个进程中,所以这时候需要更轻量级的三个线程。现在我们了解到线程是并行的最小单位。假如现在计算机只有一个单核CPU,也就是一次只能执行一个线程,那就需要对每一个线程轮流执行,每次单个计算的时间成为一个CPU时间片,实际只有几十毫秒,用户根本感觉不到,然后对于线程来。
03:00
存在等待CPU的时候称为就绪状态,一旦CPU过来执行,就转变成运行状态,当CPU转而执行其他线程时,线程就又变成就绪状态。假如线程正在执行中,程序向硬盘发送访问请求,然后等待,这时CPU就变成空转了,所以线程变成阻塞状态,CPU转而执行其他线程,等到硬盘的数据回复,线程从阻塞态转成就绪状态,等待CPU的再次光临,然后继续执行。那如果是多个CPU确实可以让多个线程真正的并行计算,但是往往线程会很多,所以还是需要时间片轮转。那么为了简化CPU内核中为每个线程提供各自虚拟的CPU,每个线程会认为自己是一直独占着CPU,他们就不需要考虑时间片轮。
04:00
断在问题上。
我来说两句