
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了程序员在学习Java编程语言的时候需要掌握的一些基础知识等内容,而本文我们就继续来学习一下,进程内存分布与调度方法分享。
一、进程的内存分布
为了更加高效地使用内存,Linux系统采用了虚拟内存的方案,将物理内存和磁盘都映射为虚拟内存地址,为进程提供统一的地址空间。
虚拟内存有三个优点:
1)将内存当作磁盘的缓存,在内存中只保留常用数据,必要时从内存和磁盘之间交换数据。
2)简化内存管理,为每个进程提供统一的地址空间。
3)保护进程的内存空间不受其他进程影响。
每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,要使用进程间通信,比如管道、文件、套接字等。
进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,每个进程有独立的用户虚拟地址空间。以32位Linux系统为例,共有4G的寻址能力。默认将高地址的1G空间分配给内核,称为内核空间,剩下的3G空间分配给进程使用,称为用户空间。用户空间从低地址到高地址空间包含5个部分:
代码段(textsegment):存放程序的可执行二进制代码。
数据段(datasegment):存放程序中已经初始化且初值不为0的全局变量和静态局部变量,数据段属于静态内存分配。
BSS段:存放未初始化的全局变量和静态局部变量;初值为0的全局变量和静态局部变量。
堆(heap):用于存放程序运行时动态分配的内存段,可动态扩张或者缩减。
栈(stack):由编译器自动分配释放,它存放函数内部声明的非静态局部变量,以及记录函数调用过程的相关维护信息(称为栈帧)。
二、进程的调度
每个CPU(或核心)在一个时间点上只能处理一个进程。操作系统调配CPU时间和其他资源,为进程分配一个状态,进程的状态随着环境要求而改变。进程运行的整个生命周期划分为六种状态:
Running:表示进程处在CPU的就绪队列中,运行态或者就绪态的进程
DiskSleep:不可中断状态睡眠,一般表示进程正在跟硬件发送交互,并且交互过程中不允许被其他进程或中断打断
Zombie:僵尸进程,表示进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符,PID等)
InterruptibleSleep:可中断状态睡眠,表示进程因等待某个事件而被系统挂起(阻塞态)。当进程等待的事件发生时,就会被唤醒并进入Running状态
Idle:空闲状态。用在不可中断睡眠的内核线程上。硬件交互导致的不可中断进程用D表示,但对某些内核线程来说,处在不可中断睡眠时有可能实际上并没有任何负载。
StoppedORTraced:表示进程处于暂停或者跟踪状态。向一个进程发送SIGSTOP信号,它就会因响应这个号变成暂停状态(Stopped);向它发送SIGCONT信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要用fg命令恢复到前台运行)。当用调试器调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也是一种特殊的暂停状态,只不过可以用调试器来跟踪并按需要控制进程的运行。
EXIT:进程已经消亡
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。