一、什么是线程、进程?

进程:进程是资源分配的基本单位,它是程序执行时的一个实例,在程序运行时创建。

在Linux环境下,每个进程有自己各自独立的 4G 地址空间,大家互不干扰对方。不同的进程通过页表映射,映射到物理内存上各自独立的存储空间,在操作系统的调度下,分别轮流占用CPU去运行,互不干扰、互不影响,甚至相互都不知道对方。在每个进程的眼里,CPU就是他的整个世界,虽然不停地被睡眠,但是一旦恢复运行,一觉醒来,仿佛什么都没发生过一样,认为自己拥有整个CPU,一直在占有它。

举例说明:

对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。

线程:线程是程序执行的最小单位,是进程的一个执行流,一个进程由多个线程组成的。

在一个进程中,可能存在多个线程,每个线程类似于合租的每个租客,同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程都有独立一套的寄存器和栈,这样可以确保线程的控制流是相对独立的。在线程中,通过各种加锁解锁的同步机制,一样可以用来防止多个线程访问共享资源产生冲突,比如互斥锁、条件变量、读写锁等。

举例说明:

有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。

个人理解:

一个程序在执行的时候,操作系统为其创建了一个进程,并分配一定的物理内存给这个进程,MMU将这段内存映射到虚拟地址空间,也就是将一小块物理内存映射到0-4G的虚拟地址空间,其中0-3G属于用户空间(进程私有),最高1G属于内核空间(进程之间共享)。每个进程会把虚拟内存空间分成4个段,代码段、数据段、bss段、堆区和栈区都属于进程的用户空间。

操作系统可以同时运行多个程序,每个程序对应一个进程。不同的进程“交替占用”CPU,实际上是指该进程中的不同线程在交替占用CPU。当一个进程被调度到CPU上运行时,操作系统会将CPU的时间片分配给该进程中的一个线程,让它执行一段时间。如果进程中有多个线程,操作系统会根据调度算法,轮流分配时间片给不同的线程,以实现多个线程并发执行。

一小段物理空间如何映射到4G的虚拟地址空间?

下图演示了虚拟内存空间和物理内存空间的映射关系,它们通过页映射表(Page Table)关联起来,其中虚拟内存空间中着色的部分分别被映射到物理内存空间对应相同着色的部分。而虚拟内存空间中灰色的部分表示在物理内存空间中没有与之对应的部分,也就是说灰色部分没有被映射到物理内存空间中。这么做也是本着“按需映射”的指导思想,因为虚拟内存空间很大,可能其中很多部分在一次程序运行过程中根本不需要访问,所以也就没有必要将虚拟内存空间中的这些部分映射到物理内存空间上。

 详解进程的虚拟内存,物理内存,共享内存_进程的内存_子木呀的博客-CSDN博客

虚拟地址和物理地址之间的映射关系_虚拟地址到物理地址的映射_qq_ccc的博客-CSDN博客


二、线程和进程的区别?

  1. 什么的基本单位:进程是资源分配的基本单位;线程是程序执行的基本单位,两者都可并发执行。
  2. 是否拥有独立的地址空间:进程拥有自己的地址空间,每启动一个进程,系统就会为它分配地址空间;而线程与CPU资源分配无关,多个线程共享同一进程内的资源,使用相同的地址空间。
  3. 组成和隶属关系:一个线程只能属于一个进程,线程依赖于进程而存在。而一个进程可以有多个线程,但至少有一个线程。
  4. 切换开销:进程切换的开销也远大于线程切换的开销
  5. 注意:多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。


三、何时使用多进程、多线程?

  1. 对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
  2. 要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。


四、操作系统的四个特征?

1. 并发

2. 共享

3. 虚拟

4. 异步

其中其中 并发 和 共享 是两个最基本的特征,二者互为存在条件。


五、参考内容

1.进程线程(一)——基础知识,什么是进程?什么是线程?_进程 线程_口袋里のInit的博客-CSDN博客

2.终于有人把进程与线程讲清楚了 - 知乎

3.进程和线程的概念、区别及进程线程间通信-腾讯云开发者社区-腾讯云

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐