线程和进程是程序员老生常谈的问题了,任何阶段的程序员都不敢轻视他。
事实上大部分程序员并没有系统化的学习过,也有很多人并没有机会好好运用它。所以,如果拉一个工作多年的程序员讨论,对方未必能说出个所以然。
本文是Linux 下 C++ 多线程编程开发的系列文章之首,在介绍具体编程实现而言,先讲讲它的基础概念,并给予通俗化的解释,并在文章最后给出一个开放的思考题。
什么是线程?线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
上面的定义来自于百度百科,定义的很准确,但同时也很抽象,线程可一看作是轻量级的进程,它依赖于进程。所以,搞清楚线程前,我们先来看看进程是什么。
什么是进程?
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
上面的定义同样来自于百度百科,定义非常准确,但同时也非常抽象,所以,为了很好的搞明白线程和进程,我尝试用一些通俗的比喻来解释。
我们把整个计算机比喻成一个公司,公司由一些基本的单元组成:
① 软硬件
② 设备资源
③ 部门
④ 员工
⑤ 制度流程
公司要正常运作,依赖于制度流程。
制度流程可以等同于什么呢?
操作系统正因为规章制度流程的存在,公司的软硬件、设备资源可以协调给每一个部门。如果公司十分庞大,组织复杂,那么部门就是最基础的单元。也就是说进程可以看做是部门部门依法使用公司规定的软硬件资源,进程在操作系统的只能也是类似。
上面的定义中有讲到,现代操作系统中,进程是一个容器。
每个进程拥有自己的独立空间,相互间不干扰。
这个好理解,现实中,每个部门有自己的软硬件和员工,一般情况下相互不干涉。
线程和进程有什么区别呢?
进程是资源分配的基本单位,线程是调度的基本单位。
这是一句名言,很好地概括了两者的区别。
用一句话来概括就是:
进程对应操作系统,线程对应CPU。
我们常说的任务调度,其实通常讲CPU 通过时间片轮转,调度线程,也并不是说进程不能调度,是说线程更轻量化。
1、功能不同
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
2、工作原理不同
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
3、作用不同
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
扩展资料
进程是由进程控制块,程序段,数据段三部分组成。一个进程可以包含若干线程(Thread)线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键操作并及时做出反应,互相不干扰)。
在程序被运行后,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。是可并发执行的程序。
在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位,也是称活动、路径或任务,它有两方面性质:活动性、并发性。
进程可以划分为运行,阻塞,就绪三种状态,并随一定条件而相互转化,就绪运行,运行阻塞,阻塞就绪。
进程为应用程序的运行实例,是应用程序的一次动态执行。看似高深,我们可以简单地理解为:它是操作系统当前运行的执行程序,在系统当前运行的执行程序里包括:系统管理计算机个体和完成各种操作所必需的程序;用户开启、执行的额外程序,当然也包括用户不知道,而自动运行的非法程序(它们就有可能是病毒程序)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术