线程共享应用什么计算机,【计算机基础】面试常问之进程和线程的区别

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)。

创建和终止进程相关:

进程的三种状态(从程序员角度):

运行:进程要么在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

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值