每天理解一点Linux内核之进程的四个要素

1.程序

程序是静态的代码,而进程是运行的程序。程序好比是剧本,而进程就是戏,戏是按照剧本演的。

2.私有财产

每个进程都有自己专有的系统堆栈空间

3.户口

在内核中有一个task_struct数据结构,操作系统里面通常叫做进程控制块PCB,有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核调度,并且它记录进程所占用的各项资源

4.独立存储空间

拥有专有的用户空间,意味着进程不仅拥有系统空间堆栈,还有用户空间堆栈。
我们先解释一下进程的堆栈
每个进程都有自己的堆栈,内核在创建一个新的进程时,在创建进程控制块task_struct的同时,也为进程创建自己堆栈。一个进程 有2个堆栈,用户堆栈和系统堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。当进程在用户态运行时,CPU堆栈指针寄存器指向的 用户堆栈地址,使用用户堆栈,当进程运行在内核态时,CPU堆栈指针寄存器指向的是内核栈空间地址,使用的是内核栈;
当进程由于中断或系统调用从用户态转换到内核态时,进程所使用的栈也要从用户栈切换到内核栈。系统调用实质就是通过指令产生中断,称为软中断。进程因为中断(软中断或硬件产生中断),使得CPU切换到特权工作模式,此时进程陷入内核态,进程进入内核态后,首先把用户态的堆栈地址保存在内核堆栈中,然后设置堆栈指针寄存器的地址为内核栈地址,这样就完成了用户栈向内核栈的切换。
当进程从内核态切换到用户态时,最后把保存在内核栈中的用户栈地址恢复到CPU栈指针寄存器即可,这样就完成了内核栈向用户栈的切换。

如果只具备前两条而没有第四条,那就是线程,如果完全没有用户空间那就是内核线程,譬如kswapd,如果共享用户空间叫做用户线程,这里的线程其实并不是像go语言里面实现的协程,还不是一个概念,那种线程是在一个程序内部实现的线程,在内核中是没有系统堆栈的,也就是对于内核是不可见的,这种利弊我们我们以后再说。我们拿JAVA举例子
Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一对应的关系。线程的调度完全交给了操作系统内核,当然jvm还保留一些策略足以影响到其内部的线程调度,举个例子,在linux下,只要一个Thread.run就会调用一个fork产生一个线程。

猜你喜欢

转载自blog.csdn.net/u010278923/article/details/79894834