前言
线程与进程,这是两个非常通用的概念,并不仅仅局限于语言本身,因为这是操作系统所提供的,无论什么语言,特别是偏底层语言(比如c、c++、rust等),都能通过对应的函数来创建、操作进程与线程。
但同时要注意,操作系统也有不同类型的,比如主流的windows系统、linux系统、mac系统等等。
虽然各个系统都统一有进程与线程这两个概念,但具体的调用方式,也就是函数接口并不完全一致。
所以如果你使用C/C++在不同的系统上开发软件,并且不使用跨平台的库,那么调用的API就不相同,这也就导致你的程序不跨平台,从而开发难度倍增。
而高级的语言则会提供跨平台的库,比如java、python、rust等等,无论什么平台,都给你提供统一的调用接口,从而实现一份代码,跨平台运行,减少程序员的开发量。
至于协程,则是为了提高线程效率而在应用层实现的一个概念,使得一个线程可以拥有多个协程执行任务。
进程
首先我们来聊聊进程,最直观的解释就是:一个应用程序就是一个进程
或者更进一步的说,一个windows平台上以.exe后缀结尾的可执行文件,当其运行起来之后就是一个进程。
虽然这么说在现在看来有些不合适了,但对于新手理解起来确实会更加的容易。
我们可以在window系统中的任务管理器中看到当前电脑上所有运行中的进程(应用程序):

调出方式为:Win+X快捷键,然后选择任务管理器菜单。
这个页面就是当前我电脑上运行的所有进程,也就是所有的应用程序。
对于操作系统来说,进程是基本的资源分配单位。
怎么理解?比如上图每个进程后面有CPU、内存等内容,其中列出的就是当前某个进程所占用的系统内存、CPU,也就是系统资源。
所以如果你发现电脑卡了,就可以来到任务管理器中,看看是哪个进程占CPU、内存多,然后将它关闭即可。
这就是进程的基本概念:资源分配的基本单位。
并且各个进程是彼此独立的,比如,你QQ崩溃了,一般来说,是不会影响微信的!
但你会发现,任务管理器中很多进程是可以展开的:

比如我在当前浏览器中,打开了本站点,这里就会出现一个标签页。
如果外面的Microsoft Edge是进程,那这些叫什么呢?它们后面也有内存、CPU占用啊!
而这就是前面我说的不合适的原因了,因为现在很多程序都偏爱制作多进程应用。
也就是说,一个应用本身是一个进程组,它是一系列进程的集合,而不单单只是一个进程。
这样做肯定是有好处也有坏处的。
好处就是刚刚所说,进程之间相互彼此独立,比如浏览器中,我一个页面崩溃了,并不会导致整个浏览器崩溃,同时也不会影响到其它页面。
但坏处也很明显,因为每个进程都需要分配资源,就会导致多进程应用对资源占有量一般都比单进程要大的多。
不信的话你可以试一试在浏览器中一次性开几十个页面,一般电脑可能就直接卡死了,不过由于现代浏览器会自动将不活跃的页面休眠释放资源,也不一定会卡死。
以一个基本的C语言代码为例:
int main(){}
虽然它什么也没干,但只要你编译执行它,那它就是一个进程!
关系图如下:
线程
进程很容易理解,就是电脑资源分配的基本单位嘛,并且各个进程相互独立。
那么线程呢?
可能你早就看到过线程的概念,只不过你从来没有注意过。
因为在你买手机、电脑的时候,一般都会有一个配置说明:几核几线程。
比如我的电脑就是14核20线程:

一般来说,一个物理核心同时只能执行一个线程,只不过现代CPU大多采用了超线程技术,让某些物理核心可以同时执行两个线程,因此就会出现线程数量比核心数量多的情况。
而CPU核心是干嘛的?当然是执行计算了,换句话说,就是执行代码的。
请开通后继续阅读后续 70% 并运行完整示例~
DISCUSSION
评论 0
还没有评论,来留下第一条吧。