Java教程

进程的系统调用

本文主要是介绍进程的系统调用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

换个角度看,也就是说,进程即可以在用户空间运行,又可以在内核空间中运行。进程在用户空间运行时,被称为进程的用户态,而陷于内核空间的时候,被称为进程的内核态。 

      

从用户态到内核态的转变,需要通过系统调用来完成。比如,当我们查看文件内容时,就需要多次系统调用来完成:首先调用 open() 打开文件,然后调用 read() 读取文件内容,并调用 write() 将内容写到标准输出,最后再调用 close() 关闭文件。

那么,系统调用的过程有没有发生 CPU 上下文的切换呢?答案自然是肯定的。

CPU 寄存器里原来用户态的指令位置,需要先保存起来。接着,为了执行内核态代码,CPU 寄存器需要更新为内核态指令的新位置。最后才是跳转到内核态运行内核任务。

而系统调用结束后,CPU 寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。所以,一次系统调用的过程,其实是发生了两次 CPU 上下文切换。

不过,需要注意的是,系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源,也不会切换进程。这跟我们通常所说的进程上下文切换是不一样的:

进程上下文切换,是指从一个进程切换到另一个进程运行。

而系统调用过程中一直是同一个进程在运行。

所以,系统调用过程通常称为特权模式切换,而不是上下文切换。但实际上,系统调用过程中,CPU 的上下文切换还是无法避免的。

上面的文章摘自极客时间app linux 性能优化实战的第3节,上文提到的root读某个磁盘中的文件,访问磁盘这些硬件资源,root也是没有权限的,必须经过系统调用,所以理解“CPU寄存器里原来用户态的指令,需要先保存起来。”就应该不难了。

这篇关于进程的系统调用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!