什么是线程?

什么是线程?

说到线程, 离不开的概念就是进程 . 也离不开计算机或操作系统的发展过程. 简单的说一下.

进程的引入

在计算机高度发达的今天, 我们很难想象以前的计算机是什么样的. 

最初的时候, 计算机只能接受一些特定的指令, 用户输入一个指令, 计算机就做一个操作. 当用户在思考或者输入数据时, 计算机就在等待. 显然这样效率很低下, 因为很多时候,计算机处于等待用户输入的状态 .

为了解决这个问题, 批处理操作系统诞生了. 用户可以将需要执行的多个程序写在磁带上(很难想象一个计算机用的是磁带, 更夸张的是更早的时候使用纸带上面打孔), 然后交由计算机去读取并逐个地执行这些程序, 并将输出结果写到另一个磁带上.

但批处理系统仍然存在一个很大的问题, 当第一个程序在进行I/O(数据输入输出)操作时, 另一个程序只能干等着, 但此时CPU也闲着, 第二个程序心想, 你这不是占着x坑不拉x嘛, 白白浪费可爱的CPU. 人们就想能不能在第一个程序I/O的过程中, 让第二个程序开始运行, 当第一个程序I/O完毕后, 暂停第二个程序的运行, 再恢复第一个程序的运行呢?

但还有一个问题摆在面前, 在原来的计算机中, 每次都只有一个程序的运行数据在内存中, 而上面的设想需要内存中装入多个程序, 又该如何处理呢? 内存中的数据谁是谁的又该如何辨别, 如何实现前面说的暂停恢复呢?

这个时候人们就引入了进程的概念, 用进程来描述一个程序, 每个进程对应一定的内存地址空间, 并且只能使用它自己的内存空间, 各个进程间互不干扰. 并且进程保存了程序每个时刻的运行状态, 这样就为进程切换提供了可能. 当进程暂停时,它会保存当前进程的状态 (比如进程标识、进程的使用的资源等) , 在下一次重新切换回来时, 便根据之前保存的状态进行恢复, 然后继续执行.

人们把CPU运行间划分成若干个时间段, 再将时间段分配给各个进程执行. 这样, 在一个时间段内某个进程的代码运行时, 其它进程处于挂起状. 当时间片较小, CPU轮转非常快时, 宏观上有多个进程被同时执行的效果. 这种方式我们称之为并发(Concurrent)

人们在设计多道程序OS时,引入进程的概念,从而解决了单处理机环境下程序并发执行的问题, 提高系统资源的利用率和系统吞吐量. 此后,进程一直作为资源分配和独立调度运行的基本单位 .

线程的引入

在引入进程之后, 解决了操作系统的并发问题, 操作系统的性能得到了很大的提升, 但由于人们对计算机的效率要求越来越高, 人们发现进程在解决并发问题上的时空开销(时间和空间上的花费)太大, 所以, 人们又引入了线程的概念.

从线程的来历看, 它一定比进程轻巧. 先来看进程, 进程是资源分配独立调度基本单位, 概念无罪, 但在多任务环境中,不可能说让所有任务排队,前面的处理完了才处理后面的任务.  举个例子:

我要在一个视频软件中看一部电影, 先让它下载, 如果要下一个小时, 难道在这一个小时里我不能用这个软件的其他功能了吗, 现实中是我还能看早就下好的电影, 一边看一边等. 那么 我看已经下载好的电影 这个操作又要创建一个进程来完成, 然后让CPU并发执行下电影和看电影这两个进程, 进行频繁的轮转切换, 好让我感受到下载电影和看电影任务都是同时执行的. 

这样做是可以的, 但问题也就随之产生了, 问题在于如果要进行进程的切换需要做很多的工作, 因为在操作系统在进程切换时必须要保存好当前CPU的上下文, 好让CPU下次被分配到当前进程时可以继续往前执行,然加载新的进程的CPU上下文. 在这个过程中会花费很多时间. 也是因为如此, 为了保持操作系统的性能, 操作系统限制了系统中所能创建的进程数量.

为了解决多任务下进程切换带来的过大开销, 人们提出将进程的两个属性分开, 由操作系统分开处理.  即对于作为调度和分派的基本单位, 但不同时作为拥有资源的单位; 而对于拥有资源的基本单位, 又不对其进行频繁的切换. 正是在这种思想的指导下, 形成了线程的概念 .

线程(thread)是操作系统能够进行运算调度的最小单位. 它被包含在进程之中, 是进程的实际运作单位. 一条线程指的是进程中一个单一顺序的控制流, 一个进程中可以并发多个线程, 每条线程并行执行不同的任务.

这样, 就前面看电影的例子来说, 当我们 看电影 下载电影 并发执行时, 就不需要两个进程了, 而是让视频软件这个进程下的两个线程分别来完成, 这样CPU轮转切换的就是这两个线程, 而线程又不拥有资源, 资源被进程所拥有, 线程的切换则仅需保存和设置少量寄存器内容. 同一个进程的线程之间切换不会导致进程的切换. 这样就大大节省了时间和空间的开销.提高了效率.

最后总结一下: 进程让操作系统的并发性成为可能, 而线程让进程的内部并发成为可能.

Linux中的线程更具体的概念及特点等写在另一篇博客中: 

戳链接( ̄︶ ̄)↗ https://blog.csdn.net/qq_41071068/article/details/104571277

发布了223 篇原创文章 · 获赞 639 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_41071068/article/details/104556533