计算机通识--进程与线程

        前言

        很多讲解进程与线程的资料,通常会孤立且长篇大论地进行对进程与线程这两个概念进行讲解。例如以下我从百度百科上复制粘贴过来的概念,各位酌情观看。

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。一个进程可以有很多线程,每条线程并行执行不同的任务。在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。

在假想实验中认识进程与线程

        以上对进程的描述,过于学术,属于是看完“懂得都懂,不懂的仍然不懂”。那么让我们忘掉以上内容,从计算机发展历程的角度,从进程线程被引入的来龙去脉的角度来理解进程线程概念。

        现在,请你假设自己是cpu、操作系统与编程语言的全栈设计者。

        你接受第一个需求:想要设计一个单核cpu来播放音乐。你觉得很简单,轻而易举地设计出了一个单核cpu,代号:鸿蒙。然后你写了一段程序叫做网易云音乐,程序顺利在鸿蒙上运行。

        你收到第二个需求:这个芯片必须能同时执行两个程序,一个音乐播放器(网易云)一个聊天软件(微信)。但是你的鸿蒙cpu是单核的,没办法同时处理两个程序。于是你想了一个办法,你做出了一个操作系统,把网易云和微信都包装到操作系统里, 在操作系统定义“时间片”这个概念,把运行网易云和微信两个任务称为进程,每个进程都被切割成一个个“时间片”,操作系统负责轮流把两个进程的一片时间片大小的程序段给到你的单核cpu执行。对于cpu来说, 它只知道自己运行了操作系统这个软件,根本不知道有微信与网易云的差别。对于用户来说,网易云和微信两个轮流执行的任务像是同时发生的,把这种现场称为并发(没错,恭喜你学到了并发的概念)

        你收到第三个需求:网易云这个软件需要下载音乐同时播放音乐,相当于说一个进程里面不再只进行一件事了。于是你在你的操作系统里面加上线程这个概念,进程中多个任务被包装成线程任务,线程任务获取到时间片,被处理器执行。

        你收到第四个需求:你的操作系统在运行了越来越来多的软件之后,每个任务的切换似乎变得明显了起来,比如说音乐播放了1s 又暂停了1s,如此周而复始起来了。你仔细琢磨,原来线程越来越多之后,单个处理器周期性处理多个任务,单个任务两个时间片之间的间隔就变得越来越明显了,出现了所谓的卡顿。性能的瓶颈在处理器上面,于是你改造处理器,把多个cpu集合成一个,叫做多核cpu。这时候cpu中多个核心可以单独地处理每个线程,多个核心并行(没错,恭喜你学到了并行的概念完成任务劳动力数量上来了,问题完美得到解决。

        以上假想实验其实暗合计算机发展历史,以下是我整理计算机发展过程概括导图,供大家总结回顾。

“线程”概念的辨析

        关于线程这个概念你可能会觉得疑惑,你在cpu上看到它的介绍:6核12线程,又在学编程的时候频繁听到多线程编程概念,那么这两者究竟有什么区别和联系呢。

        cpu上的线程姑且叫做物理线程;编程语言上提及的线程称为逻辑线程。

        麻烦你把cpu想象成高速收费站。为了保证秩序,高速收费站人为隔离出过道,一个车道对应一个收费岗亭。岗亭就是一个cpu核心,这个车道就是一个物理线程物理线程就是处理核心的信息队列,核心处理任务就是从头到尾按照这个队列的顺序进行处理;

        好了,现在开始,车辆经过收费站必须严格地排成队列才能经过,但是车辆不能直到收费站才有序地拍排成队列,于是你在马路上画上线,让车辆严格在马路上按照收费站的排队的样子在马路上排列成有序的队伍行驶。各门编程语言为了让cpu顺利执行任务,按照cpu的物理线程设计出逻辑上的线程模型。

        综上所诉,逻辑线程是按照硬件线程设计出来,为硬件线程服务的。cpu线程硬件,所以硬件设计了多少个线程,那就是多少个线程,数量固定。而逻辑线程是理论上可以创建无数个。只不过你无限个逻辑线程最终还是得由物理线程执行,所以决定性能实际上物理线程。

书籍推荐

《码农翻身-用故事给技术加点料》:本文内容灵感由阅读该书获得,推荐大家阅读该书。

补充说明

关于处理器的详细内容可以学习大学计算机课程《计算机组成原理》

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值