java多线程是用户线程还是内核线程(用户级线程和内核级线程的区别)
本文目录
用户级线程和内核级线程的区别
线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread),后者又称为内核支持的线程或轻量级进程。在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程。以下是用户级线程和内核级线程的区别:(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。
用户线程和内核线程
Inter把 C P U 指令集 操作的权限由高到低划为4级
内核态权限大可以复制IO读写,网卡,内存等操作,用户态只能操作应用程序分配的空间 当需要进行高权限操作的时候,就需要从用户态切到内核态,比如,要读取文件,就需要从用户态切换到内核态(通过调用系统函数),进行文件读写,读写完成后再切换回来(普通IO时如果文件过大会进行多次用户和内核态的切换)
操作系统通过CS:IP来查找执行命令,其中CS的最低两位来表示内核和用户态(0:表示内核态,3:表示用户态,刚好符合inter权限)
切换时需要:
在没有DMA时
整个数据的传输过程,都要需要 CPU 亲自参与搬运数据的过程,而且这个过程,CPU 是不能做其他事情的
所以,DMA就是, 在进行 I/O 设备和内存的数据传输的时候,数据搬运的工作全部交给 DMA 控制器,而 CPU 不再参与任何与数据搬运相关的事情,这样 CPU 就可以去处理别的事务。
普通拷贝,byte b = read(),write(b);
文件大的话会循环进行更多次操作
mmap + write文件传输过程
sendfile文件传输过程
Java中通过transferTo来实现零拷贝,如果 Linux 系统支持 sendfile() 系统调用,那么 transferTo() 实际上最后就会使用到 sendfile() 系统调用函数
文件传输过程,其中第一步都是先需要先把磁盘文件数据拷贝「内核缓冲区」里,这个「内核缓冲区」实际上是磁盘高速缓存(PageCache) 读取磁盘数据的时候,需要找到数据所在的位置,但是对于机械磁盘来说,就是通过磁头旋转到数据所在的扇区,再开始「顺序」读取数据,但是旋转磁头这个物理动作是非常耗时的,为了降低它的影响,PageCache 使用了预读功能( 在传输大文件(GB 级别的文件)的时候,PageCache 会不起作用,那就白白浪费 DMA 多做的一次数据拷贝,造成性能的降低,即使使用了 PageCache 的零拷贝也会损失性能,PageCache 由于长时间被大文件占据,其他「热点」的小文件可能就无法充分使用到 PageCache,于是这样磁盘读写的性能就会下降了 )在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O + 直接 I/O」来替代零拷贝技术
用户线程:使用Java,开启一个线程,在这个线程里实现线程的切换(不太准确,其实Java开启一个线程,就是创建了一个用户线程,同时创建了一个内核线程), 所以对于内核来说感知不到用户线程的存在,如果多个用户线程切换到某个线程在执行过程中IO阻塞,此时主线程(进程)就进入阻塞态,那么所有的用户现场都会阻塞
协程就是用户态的线程(好像在java线程里面自己实现的线程)
用户线程的特点:创建销毁快,支持大量的用户线程(创建用户线程比内核线程需要的空间要小的多),但是不能利用CPU多核,同时需要自己实现阻塞调度,否则会影响其他用户线程的执行
进程中的一个线程被阻塞,内核能调度同一进程的其他线程(就绪态)占有处理器运行,可以利用多核,但是线程数量不能过多
更多文章:
product name(product name和proper shipping name 是一个么)
2024年7月16日 23:24
jsonarray添加数据(怎么想向json数组中添加json数据)
2024年3月8日 13:10
pulse secure(win10系统安装软件提示Pulse Secure Application Launcher 缺少组件怎么办)
2024年5月17日 01:29
安卓手机端运行的adb工具(如何在android应用里执行adb 命令)
2023年10月20日 11:20