用户线程和内核线程

为什么多线程会用到多核

复习一下线程和进程的区别:
最主要的点就是:进程是资源分配的最小单位,线程是CPU调度的最小单位。(一个是相当于一个容器,一个是具体被CPU操作的)
进程间资源不共享,而多个线程是共享同个进程分配的资源的。
由于线程分用户线程和内核线程。内核线程再调用的时候可以去不同的核心去操作。所以多线程是可以利用到多核的。

Python 为什么IO密集型程序要使用多线程

常说对于IO密集型的程序使用多线程,对于cpu密集型的程序使用多进程。多进程就不用说了,多进程可以充分利用到多核,没有GIL锁的影响。由于GIL的存在导致程序在一个时间点上只能运行一个线程,那么为什么多线程可以提高IO操作呢?
主要核心原因是,python线程操作中的锁,先获取,执行临界区代码,释放锁的过程中,

如果在获取到锁之后,释放锁执行的代码中,出现了IO操作,或者sleep操作,均会导致锁失效。
这个的意思就是,对于IO操作和sleep操作,释放了GIL锁,happy together了,没有锁的干扰,这也就是为什么多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁

用户线程和内核线程

  1. 内核级线程: 切换由内核控制,当线程进行切换的时候,由用户态转换为内核态。切换完毕要从内核态返回用户态,可以很好的利用smp,即利用多核cpu,windows 线程就是这样。 我的理解为,内核线程不能由程序控制,即我们使用的多线程模块,最终控制权在计算机,我们无法掌控线程如何执行,如何调度。

  2. 内核线程:由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows NT和2000/XP支持内核线程。

  3. 用户级线程:内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的。我目前只知道的,协程有这样的特性

以下是用户级线程和内核级线程的区别:

(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。

(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。

(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。

(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。

(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

内核线程的优点:

(1)当有多个处理机时,一个进程的多个线程可以同时执行。

缺点:

(1)由内核进行调度。

用户进程的优点:

(1) 线程的调度不需要内核直接参与,控制简单。

(2) 可以在不支持线程的操作系统中实现。

(3) 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。

(4) 允许每个进程定制自己的调度算法,线程管理比较灵活。

(5) 线程能够利用的表空间和堆栈空间比内核级线程多。

(6) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题。

缺点:

(1)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用

看过的一些资料:
https://www.cnblogs.com/wanglulu/p/5522809.html
https://blog.csdn.net/qq910894904/article/details/41699541

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值