计算机基础面试常问之进程和线程的区别
Posted 黑黑白白君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机基础面试常问之进程和线程的区别相关的知识,希望对你有一定的参考价值。
文章目录
0)为什么会有进程和线程?
假如有两个任务A和B,需要读取大量的数据输入(I/O操作),而其实CPU只能处在等待状态,等任务A读取完数据再能继续进行,这样就白白浪费了CPU资源。于是人们就想,能否在任务A读取数据的过程中,让任务B去执行,当任务A读取完数据之后,暂停任务B,让任务A继续执行?
由于CPU与其他资源之间速度的不协调,为了提高资源利用率,提出了多任务系统。得益于CPU的计算速度,我们可以“同时”运行多个任务,实质上是多个任务之间轮流使用CPU资源,由于速度超快,给用户的感觉就是连续的。
-
进程的出现:
用进程来对应一个程序。- 每个进程来对应一定的内存地址空间,并且只能使用它自己的内存空间,各个进程之间互不干扰。
- 进程同时也保存了程序每个时刻的运行状态,为进程切换提供了可能。当进程暂停时,它会保存当前进程的状态(进程标识,进程使用的资源等),在下一次切换回来时根据之前保存的状态进行恢复,接着继续执行。
出现了进程之后,操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题,但是人们不满足,逐渐对实时性有了要求。因为一个进程在一个时间段内只能做一个事情,如果一个进程有多个子任务时,只能逐个得执行这些子任务,很影响效率。
进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。
- 一个进程包含多个线程,但是这些线程共享进程占有的内存地址空间和资源。
- 进程是操作系统进行资源分配的基本单位(进程之间互不干扰)。
- 而线程是操作系统进行调度的基本单位(线程间互相切换)。
1)进程
1.1 什么是进程?
进程(process)是操作系统对一个正在运行的程序的一种抽象。
- 并发运行:一个进程的指令和另一个进程的指令交错执行。
- 上下文切换:无论是在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换,即保存当前进程的上下文,恢复新进程的上下文,然后将控制权传递给新进程。
- 上下文(context):操作系统保持和跟踪进程运行所需要的所有状态信息,这种状态就是上下文,包括如PC和寄存器文件的当前值,以及内存的内容。
实现进程这个抽象概念需要低级硬件和操作系统软件之间的紧密合作。
从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的。
- 内核:操作系统代码常驻主存的部分,不是一个独立的进程,是系统管理全部进程所用的代码和数据结构的集合。
- 当应用程序需要操作系统的某些操作时,比如读写文件,它就会执行一条特殊的系统调用(system call)指令,将控制器传递给内核。然后内核执行被请求的操作并返回应用程序。
1.2 进程控制相关
-
获取进程ID相关:
- 每个进程都有一个唯一的正数(非零)进程ID(PID)。
- 每个进程都有一个唯一的正数(非零)进程ID(PID)。
-
创建和终止进程相关:
- 进程的三种状态(从程序员角度):
- 运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。
- 停止:进程的执行被挂起(suspended),且不会被调度。
- 终止:进程被永远地停止了。
- 父进程通过调用fork函数创建一个新的运行的子进程。
- 新进程几乎但不完全与父进程相同,最大的区别在于它们有不同的PID。
- 进程的三种状态(从程序员角度):
*程序与进程的区别?
- 程序是一堆代码和数据。
- 进程是执行中程序的一个具体的实例。
- 系统中的每个程序都运行在某个进程的上下文中。
- 上下文是由程序正常运行所需的状态组成的,包括存放在内存中的程序的代码和数据等。
2)线程
2.1 什么是线程?
线程(thread)是允许应用程序并发执行多个任务的一种机制。
- 一个进程可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并且共享同样的代码和全局数据。
- 同一程序中的所有线程均会独立执行相同程序,且共享同一份全局内存区域,其中包括初始化数据段(initialized data)、未初始化数据段(uninitialized data),以及堆内存段(heap segment)。
- 同一进程中的多个线程可以并发执行。在多处理器环境下,多个线程可以同时并行。如果一线程因等待I/O操作而遭阻塞,那么其他线程依然可以继续运行。
3)进程和线程的区别?
1、对于某些应用而言,线程要优于进程:
传统UNIX通过创建多个进程来实现并行任务。
- 以网络服务器的设计为例,服务器进程(父进程)在接受客户端的连接后,会调用fork()来创建一个单独的子进程,以处理与客户端的通信。
- 采用这种设计,服务器就能同时为多个客户端提供服务。虽然这种方法在很多情境下都屡试不爽,但对于某些应用来说也确实存在如下一些限制。
对于进程:
- 进程间的信息难以共享。由于除去只读代码段外,父子进程并未共享内存,因此必须采用一些进程间通信(inter-process communication,简称IPC)方式,在进程间进行信息交换。
- 调用 fork()来创建进程的代价相对较高。即便利用写时复制(copy-on-write)技术,仍然需要复制诸如内存页表(page table)和文件描述符表(file descriptor table)之类的多种进程属性,这意味着fork()调用在时间上的开销依然不菲。
但线程解决了上述两个问题:
- 线程之间能够方便、快速地共享信息。只需将数据复制到共享(全局或堆)变量中即可。
- 不过,要避免出现多个线程试图同时修改同一份信息的情况,这需要使用同步技术。
- 创建线程比创建进程通常要快10倍甚至更多。
- 线程的创建之所以较快,是因为调用 fork()创建子进程时所需复制的诸多属性,在线程间本来就是共享的。特别是,既无需采用写时复制来复制内存页,也无需复制页表。
【部分内容参考自】
- 《深入理解计算机系统》
- 《操作系统导论》
- 进程和线程的由来与区别:https://blog.csdn.net/whl_program/article/details/70217354
- 线程和进程的区别是什么?:https://www.zhihu.com/question/25532384
以上是关于计算机基础面试常问之进程和线程的区别的主要内容,如果未能解决你的问题,请参考以下文章