内核态(Kernel Mode)与用户态(User Mode)的研究

栏目:线程与并发 作者:admin 日期:2017-04-10 评论:0 点击: 2,014 次

引言

在多线程并发情况下,互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。

内核态和用户态

内核态: CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡。
用户态: 只能受限的访问内存,且不允许访问外围设备。

为什么要有用户态和内核态?

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据并发送到网络,CPU划分出两个权限等级:用户态和内核态

用户态与内核态的切换

所有用户程序都是运行在用户态的,但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据,或者从键盘获取输入等。而唯一可以做这些事情的就是操作系统,所以此时程序就需要请求操作系统来执行这些操作。通过下面的场景对用户态和内核态有一个更直观的认识:使用传统的I/O程序读取文件内容, 并写入到Socket中。
File.read(fileDesc, buf, len);
Socket.send(socket, buf, len);

上述共有4次用户态和内核态的切换。