用户线程和内核线程

 我来答
户如乐9318
2022-07-27 · TA获得超过6657个赞
知道小有建树答主
回答量:2559
采纳率:100%
帮助的人:139万
展开全部

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多核,同时需要自己实现阻塞调度,否则会影响其他用户线程的执行

进程中的一个线程被阻塞,内核能调度同一进程的其他线程(就绪态)占有处理器运行,可以利用多核,但是线程数量不能过多

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式