Python线程
进程有很多优点,它提供了多道程序,可以提高计算机CPU的利用率。既然进程这么好,为什么还需要线程呢?其实细看的话,会发现这个过程还是有很多瑕疵的。
主要体现在一下几个方面:
一个进程一次只能完成一项任务。如果要同时做两个或更多的任务,就必须开启多个进程来完成多个任务。
如果进程在执行过程中被阻塞,比如等待输入,整个进程就会挂起,即使进程中的某些工作不依赖于输入数据,也无法执行。
每个进程都有自己独立的空间,所以多个进程的创建和销毁比多线程更耗时,消耗更多的系统资源。
进程是资源分配的最小单位,线程是CPU调度的最小单位。每个进程至少有一个线程。这
线程与进程的区别
可以归纳为以下4点:
1)地址空间:进程间相互独立的每个进程都有自己独立的内存空间,也就是说一个进程内的数据在另一个进程是不可见的。但同一进程中的各线程间数据是共享的。
2)通信:由于每个进程有自己独立的内存空间,所以进程间通信需要IPC,而进程内的数据对于多个线程来说是共享的,每个线程都可以访问,所以为了保证数据的一致性,需要使用锁。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程操作系统中,进程不是一个可执行的实体,它主要的功能是向操作系统申请一块内存空间,然后在内存空间中开线程来执行任务,相当于一个容器,容器中的线程才是真正的执行体。一个进程可以包含多个线程,而一个线程是不能包含进程的。因为进程是系统分配资源的最小单位,所以线程不能向操作系统申请自己的空间,但一个线程内可以包含多个线程。
线程的特点:
在多线程的操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。线程具有以下属性。
1)轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。
2)独立调度和分派的基本单位。
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。
3)共享进程资源。
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的进程id,这意味着,线程可以访问该进程的每一个内存资源;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
4)可并发执行
一个进程中的多个线程可以并发执行,甚至一个进程中的所有线程都可以并发执行;同样,不同进程中的线程也可以并发执行,充分利用处理器和外围设备并行工作的能力。
线程的实现可以分为两类:
用户级线程(User-Level Thread)和内核级线程(Kernel-Level Thread),后者又称为内核支持线程或轻量级进程。在多线程操作系统中,各个系统的实现方法是不同的。在一些系统中,实现了用户级线程,而在一些系统中,实现了内核级线程。
用户线程和内核线程的区别:
1、内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。
2、用户级线程的创建、取消、调度不需要OS内核的支持,在语言(如Java)层面处理;而内核支持的线程的创建、取消和调度需要OS内核的支持,并且与Process的创建、销毁和调度大体相同。
3、用户级线程执行系统调用指令时,所属进程会被中断,而内核支持线程执行系统调用指令时,只有线程被中断。
4、在只有用户级线程的系统中,CPU调度仍然是基于进程的。一个运行进程中的多个线程由用户程序控制轮流运行;在内核支持线程的系统中,CPU调度则以线程为单位,由OS的线程调度器负责线程调度。
5、用户级线程的程序实体是运行在用户态的程序,而内核支持线程的程序实体是可以运行在任意态的程序。
内核线程的优缺点:
优点:当有多个处理器时,一个进程的多个线程可以同时执行。
缺点:由内核进行调度。
用户线程的优缺点:
优点:
线程的调度不需要内核直接参与,控制简单。
可以在不支持线程的操作系统中实现。
创建和销毁线程、线程切换成本等线程管理成本远低于内核线程。
允许每个进程自定义自己的调度算法,线程管理更加灵活。
与内核级线程相比,线程可以利用更多的表空间和堆栈空间。
同一个进程中只能同时运行一个线程。如果一个线程被系统调用阻塞,整个进程就会被挂起。此外,页面失效也会产生同样的问题。
缺点:
资源调度是根据进程进行的。多处理器下,同一个进程中的线程只能在同一个处理器下进行分时复用。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 什么是 python 列表切片09/28
- ♥ 使用python slice的特性10/19
- ♥ python如何定义字节12/22
- ♥ python如何查看编码类型09/21
- ♥ 如何在 mac 上恢复 python11/30
- ♥ 如何将python浮点数转换为整数09/07
内容反馈