【计算机基础】进程、线程、协程的区别

:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】
:文章若有幸对你有帮助,可点赞 收藏 ⭐不迷路
:内容若有错误,敬请留言 指正!原创文,转载请注明出处

文章目录

  • 一、引言
    • 1.1 单核和多核CPU的区别
    • 1.2 区别总结
  • 二、进程
    • 2.1什么是进程?
    • 2.2进程ID
    • 2.3多进程调度原理
    • 2.4进程运行的虚拟地址空间
  • 三、协程
    • 3.1 协程的定义
    • 3.2 协程的特点
    • 3.3 协程与异步的关系
  • 四、举例说明进程、线程以及协程之间的关系
    • 什么是异步函数?
  • 总结


一、引言

1.1 单核和多核CPU的区别

单核CPU(Central Processing Unit)和多核CPU是计算机处理器的两种类型,它们在核心数量方面存在区别,影响着计算性能和并发能力。

  1. 单核CPU:

单核CPU只有一个物理核心,能够一次执行单个指令流。它通过在一个时刻执行一个指令,按照时钟周期依次处理计算任务。因为只有一个核心,所以单核CPU的执行能力有限,不能同时处理多个任务。在多任务环境下,单核CPU通过快速切换任务之间的执行,给人一种并行执行的感觉,但实际上是通过时间片轮转的方式进行切换,造成任务执行的间隔和延迟。

  1. 多核CPU:

多核CPU具有多个物理核心,每个核心都能独立执行指令流。一个多核CPU可以同时处理多个任务,提供更高的并行处理能力。多核CPU能够并行地执行多个任务,提高程序的整体性能和响应能力。不同的核心可以同时执行不同的任务,也可以协同工作以提高整体的计算能力。

1.2 区别总结

  • 单核CPU只有一个物理核心,能够一次执行单个指令流。多核CPU则拥有多个物理核心。
  • 单核CPU在多任务环境下通过快速切换完成任务执行,而多核CPU能够同时处理多个任务,并行执行。
  • 多核CPU具备更高的并发处理能力和计算性能,可以提供更好的系统响应能力和任务处理效率。
    在实际应用中,多核CPU常被广泛应用于需要高性能和并行计算的场景,如科学计算、图形渲染和服务器处理等。而单核CPU则可以用于一些较为简单的计算任务或嵌入式设备中,要求较低的计算需求。

CPU要同时执行多个任务怎么办
✅单核CPU是怎么执行多任务的呢?
启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。
答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。

✅多核CPU是如何执行多任务的呢?
启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

当然还有第三种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。

✅总结一下,多任务的实现有3种方式:
多进程模式;
多线程模式;
多进程+多线程模式。

二、进程

2.1什么是进程?

✅什么是进程:进程正在运行的程序
进程的状态:创建状态;就绪状态;执行状态;阻塞状态;终止状态

✅什么是进程(Process)
(1)进程是动态过程而不是静态实物。
(2)进程就是程序的一次运行过程,一个静态的可执行程序a.out的一次运行过程(./a.out去运行到结束)就是一个进程。
(3)进程控制块PCB(process control block),内核中专门用来管理一个进程的数据结构。

2.2进程ID

进程ID是操作系统给每个进程分配的编号,用来唯一标识进程。
getpid(获取当前进程自己的IP)、getppid(获取当前进程自己的父进程的IP)、getuid(获取当前进程用户IP)、geteuid、getgid、getegid

2.3多进程调度原理

(1)操作系统同时运行多个进程。逻辑可以看做是只能运行当个进程的操作系统。因为逻辑里面的CPU只能做到运行一个进程的能力,这个是硬件限制和决定了它没有操作系统。而高等CPU能处理多个进程,因此可以安装操作系统。
(2)宏观上的并行(人眼看到进程好像是同时运行的)和微观上的串行
(3)实际上现代操作系统最小的调度单元是线程而不是进程。调度就是操作系统根据进程的差异有选择性的决定谁先运行,谁后运行,这样处理效率就提高了。就好像我们自己手上有很多事情,根据重要性排序进行前后执行。

2.4进程运行的虚拟地址空间

(1)操作系统中每个进程在独立地址空间中运行
(2)每个进程的逻辑地址空间均为4GB(32位系统)
(3)0-1G为OS,1-4G为应用
(4)虚拟地址到物理地址空间的映射
(5)意义。为了提高安全性进行进程隔离,提供多进程同时运行,互不影响。
也就是说进程有多个,但是单核CPU只有一个,不可能同时处理多个进程,因此要完成物理内存就是内存条的大小。

三、协程

3.1 协程的定义

学习协程之前需要对进程和线程有所了解,因为它们之间的关系非常紧密。
进程(Process):对于操作系统来说,一个任务就是一个进程,比如打开一个浏览器就是启动一个浏览器进程,打开两个记事本就启动了两个记事本进程。
线程(Thread):有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。
协程(coroutine):协程是一种并发编程的概念,它可以看作是可以暂停和恢复执行的函数。与线程或进程不同,协程是在同一线程内执行的,因此协程的切换开销较小,能够更高效地利用计算资源。协程可以在执行过程中暂停,并将控制权让出给其他协程或主程序,待某个条件满足后再恢复执行。这种方式可以实现更灵活的任务调度,提升程序的性能和响应能力。

3.2 协程的特点

协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
最大的优势:协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势:不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

3.3 协程与异步的关系

✅协程(Coroutine)是一种能够在异步任务中实现暂停和恢复的特殊函数。它可以与异步编程一起使用,以实现并发和并行的异步操作。
✅异步编程是一种并发编程范式,旨在处理需要等待IO操作或耗时任务的程序。它通过将任务分割成小块,并在任务等待期间切换到其他任务,以提高程序的效率和响应能力。
✅协程作为异步编程的一种实现方式,通过使用异步函数和关键字await,能够在需要等待IO操作或其他异步任务完成时主动挂起自身,让出CPU资源给其他任务执行。一旦等待的操作完成,协程可以恢复执行,并继续在等待之前的位置继续执行。
✅在Python中,协程常常与异步框架(如asyncio)一起使用,通过事件循环(Event Loop)来管理和调度协程的执行。异步框架提供了一种机制,可以协调多个协程之间的执行,并实现非阻塞式的并发操作。

协程和异步的关系可以总结如下:
✅1. 异步是一种编程范式,用于处理需要等待IO或耗时操作的程序,目的是提高效率和响应能力。
✅ 2. 协程是一种特殊的函数,可以在异步任务中实现暂停和恢复,以实现异步操作和任务的并发执行。
✅ 3. 通过使用异步函数和关键字await,协程能够在需要等待操作完成时主动挂起,让出CPU资源给其他任务。
✅4. 异步框架提供了事件循环来管理和调度协程的执行,协调多个协程的并发操作。
总之,协程是异步编程的一种实现方式,通过挂起和恢复来实现任务的并发执行和异步操作。异步编程与协程结合使用,能够提高程序的效率和响应能力,适用于处理IO密集型和并发性高的应用场景。

四、举例说明进程、线程以及协程之间的关系

用通俗易懂的方式举例说明进程、线程以及协程之间的关系:
以组建一个模型飞机为例,这需要完成多个任务,比如剪纸板、组装零件、喷涂颜色等。
进程:进程可以看作是组建模型飞机的整个过程。它包括了所有的任务和资源。
线程:线程可以看作是进程中具体的工作单位。比如将剪纸板、组装零件、喷涂颜色等任务分别看作是不同的线程。每个线程都独立地完成特定的任务,但它们共享进程的资源,比如剪刀、胶水和颜料等。
协程:协程可以看作是在线程中的相互配合和协作。假设在组装零件的线程中,要先剪纸板,然后再组装。我们可以把剪纸板和组装这两个任务看作是协程。当我们开始剪纸板时,可以先将组装任务暂时挂起,并在剪纸板完成后恢复组装任务。这样就在同一个线程中交替进行剪纸板和组装操作,提高效率和性能。

什么是异步函数?

异步函数(Async Function)是一种能够异步执行的特殊函数,它可以在执行过程中暂停和恢复,以便于处理耗时的操作、IO操作或等待其他任务完成。
在Python中,异步函数通常使用async关键字来定义。这样的函数可以包含await表达式,用于挂起函数的执行,等待异步操作的完成。当遇到await时,函数将暂停执行,将控制权交给事件循环(Event Loop),以便执行其他任务。一旦被等待的异步操作完成,函数将在恢复执行前等待的位置继续执行。
异步函数通常与协程(Coroutine)一起使用,协程是一种特殊的异步函数。协程可以在异步调度管理下,实现并发和并行执行多个任务。通过协程,可以避免线程或进程之间的上下文切换开销,提高程序的性能和响应能力。
异步函数在处理IO密集型任务(如网络请求、文件读写等)时非常高效,因为它们能够在等待IO完成时释放CPU资源,而不会阻塞主线程。这样能够避免浪费CPU时间,在等待IO的过程中可以同时处理其他任务。
以下是一个简单的异步函数示例,用于使用异步方式下载网页内容:

import asyncio
import aiohttp
async def download_page(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()
# 使用异步方式下载网页
async def main():
    url = "https://example.com"
    content = await download_page(url)
    print(content)
# 创建事件循环并运行异步函数
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

在上述示例中,download_page函数使用aiohttp库进行异步网络请求。在main函数中,我们使用await关键字调用download_page异步函数,等待其返回网页内容。最后,通过运行事件循环,我们可以执行main函数并获取异步函数的结果。

总结

进程是一个包含多个任务和资源的整体,可以看做是飞机模型的组装过程。
线程是进程中的具体任务执行者,比如剪纸板、组装零件等。
协程是在线程中相互配合和协作的小任务,比如剪纸板和组装在同一个线程中的交替执行。通过合理的使用线程和协程,可以提高任务的并发性和响应能力,使整个组装过程更加高效和流畅。

你可能感兴趣的:(计算机基础,计算机网络)