线程和进程区别
线程(Thread)是操作系统中的最小执行单位,是进程中的一个实体,是 CPU 调度和分派的基本单位。线程是共享进程资源的,每个线程拥有自己的程序计数器(PC)、堆栈和局部变量等,但共享进程的代码、数据和打开的文件等资源。因此,多个线程可以同时访问同一份资源,但可能会发生竞争和冲突。
进程(Process)是操作系统中的一个独立的执行单位,是资源分配和调度的基本单位。进程拥有自己独立的内存空间,包括代码、数据、打开的文件等资源。进程之间相互独立,不能直接访问对方的资源。每个进程都有自己的进程控制块(PCB),用于记录进程的状态、资源占用情况等信息。
因此,线程和进程的区别在于:
- 资源占用:进程是资源分配和调度的基本单位,每个进程都有独立的内存空间和打开的文件等资源;而线程是共享进程资源的,每个线程拥有自己的堆栈和局部变量等,但共享进程的代码、数据和打开的文件等资源。
- 调度:进程之间相互独立,不能直接访问对方的资源;而线程是进程中的一个实体,是 CPU 调度和分派的基本单位。多个线程可以同时访问同一份资源,但可能会发生竞争和冲突。
- 并发性:多个进程之间可以并发执行,相互之间互不干扰;而线程之间也可以并发执行,但它们共享进程的地址空间和资源,因此必须采取同步机制来避免冲突和竞争。
总之,进程是资源分配和调度的基本单位,线程是操作系统中的最小执行单位。进程之间相互独立,线程是共享进程资源的。在编程实现时,线程比进程更轻量级,创建和销毁线程的开销较小,但线程之间的同步和通信比较复杂。
为什么引入线程
引入线程的主要目的是为了提高程序的并发性和响应性。
在单线程程序中,程序必须按照顺序依次执行每一个任务,如果某个任务执行时间过长,就会阻塞程序的执行,导致整个程序变得很慢,甚至失去响应。而在多线程程序中,可以将程序分为多个子任务,并行执行,从而提高程序的执行效率和响应速度。
例如,在图形界面程序中,如果所有的用户交互和界面更新都在一个线程中处理,那么当某个操作需要进行大量计算或者访问网络等 IO 操作时,整个程序就会阻塞,用户体验会很差。而如果将计算和 IO 操作放在另一个线程中处理,就可以保证界面的响应性,并且计算和 IO 操作也可以并行执行,提高程序的执行效率。
另外,引入线程还可以充分利用多核 CPU 的优势,提高程序的并行度,从而更好地利用硬件资源。
总之,引入线程可以提高程序的并发性和响应性,充分利用硬件资源,提高程序的执行效率。
线程有什么缺点
线程虽然有很多优点,但也有一些缺点:
- 调试困难:多线程程序的调试比单线程程序更加困难。由于线程之间的相互依赖性和共享资源,可能会导致难以重现的问题。
- 竞争条件:多个线程访问同一个共享资源时,可能会出现数据竞争和不确定的结果。需要使用同步机制来避免竞争条件。
- 资源占用:线程需要占用系统资源,包括堆栈、寄存器、CPU时间片等。过多的线程会导致系统资源耗尽,从而影响系统的性能和稳定性。
- 上下文切换开销:线程之间的切换需要保存和恢复线程的上下文信息,包括堆栈、寄存器、程序计数器等。频繁的上下文切换会带来额外的开销,从而降低系统的性能。
- 编程复杂性:多线程编程需要考虑线程之间的同步和通信,以及共享资源的保护。这增加了程序的复杂性和难度,可能导致错误和缺陷。
因此,在使用线程时需要权衡其优缺点,根据具体情况选择合适的方案。例如,对于计算密集型的任务,使用多线程可以提高系统的性能;对于IO密集型的任务,可以使用异步编程或协程来避免线程切换开销。ps:(我感觉这里说的不对,多线程在哪都可以提高性能,关键是与cpu的核数匹配上,时间片还要考虑
自己搜索的
CPU密集型
一个计算为主的程序(专业一点称为CPU密集型程序)。多线程跑的时候,可以充分利用起所有的cpu核心,比如说4个核心的cpu,开4个线程的时候,可以同时跑4个线程的运算任务,此时是最大效率。
但是如果线程远远超出cpu核心数量 反而会使得任务效率下降,因为频繁的切换线程也是要消耗时间的。
因此对于cpu密集型的任务来说,线程数等于cpu数是最好的了。
IO密集型
如果是一个磁盘或网络为主的程序(IO密集型)。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的。所以开多线程,比方说多线程网络传输,多线程往不同的目录写文件,等等。
此时 线程数等于IO任务数是最佳的。
from 知乎2
IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。
总之,计算密集型程序适合C语言多线程,I/O密集型适合脚本语言开发的多线程。
协程的话,再说吧