概述
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产生一个线程。
最后
以上就是高兴乐曲为你收集整理的每天理解一点Linux内核之进程的四个要素的全部内容,希望文章能够帮你解决每天理解一点Linux内核之进程的四个要素所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复