进程与上下文

参考:  ChinaUnix博客
1. 进程状态

进程状态有:创建状态,就绪状态(内存,换出),执行状态(内核态,用户态),睡眠状态(内存,换出),僵死状态。

2. 进程地址空间
进程地址空间:内核空间(3G-4G),用户空间(0-3G)。用户空间中划分逻辑区。
进程逻辑区:正文段(代码和常量), 数据段(全局变量),(bss段对应未初始化的全局变量,合并到了数据段),堆栈段。(区和段一个意思)

编译器在虚地址空间上生成地址,由地址映射机构将虚地址转换成物理地址。因此,它不必知道内核以后会把程序装入内存的什么地方执行。

3.进程相关结构

1) 区表
多个进程可以共享一个正文区,但其数据区和堆栈区是各自私有的。
每个进程有一个私有的本进程区表pregion,每个区表项对应一个逻辑区,并含有该区在进程中的虚地址。
2) 页目录和页表
内存管理的基本单位称为页,大小512到4k字节(典型大小)。物理页面的分配不一定是连续的,内核中有空闲内存块表用于管理内存分配和回收。
每个进程有自己的页目录和页表,所以每个进程地址空间映射的物理内存是不一样的。两个进程的同一个虚拟地址处(如果都有物理内存映射)的值一般是不同的,因为他们往往对应不同的物理页。
3) u区
每个进程除了对应一个进程表项外,还有一个u区,存储进程的私有信息。只有内核才能访问u区,内核有一个结构变量u,存放当前正在运行进程的u区信息,内核通过u识别当前进程。内核只要通过一个新地址重写u区页表地址项,就能引用另一个进程的u区。
Unix进程控制块包含:proc结构——进程表项存放进程最基本的信息,常驻内存;user结构——主要包含那些只有进程执行时才会被使用的信息,在数据段内,执行时调到内存。

数据段U区中包括核心栈和user结构。仅当进程处于运行态时,各逻辑区才被加载到内存,数据段U区会被载入专门存放当前运行进程的内存U区页面中,从而使得proc结构与user结构结合,形成一个完整的pcb结构。

进程运行时,为了便于处理机从用户态转换到内核态,Unix在每个用户进程的PCB中建立一个针对系统的核心栈,通过核心栈共享核心正文段、以及与核心进程相关的系统数据结构和系统页表等。当进程请求系统服务时,可以通过该进程的核心栈直接链接到系统内核,实现从用户态到核心态的快速切换。Unix将每个进程中的核心栈其用户栈分开,不能互相传递参数。这样既方便核心程序执行又有利于内核保护。

Linux中有关一个进程的所有信息都保存在task_struct结构(1KB)中,紧挨进程核心栈(7KB),共2个页面大小。
4. 进程上下文
进程上下文包括:
用户上下文:进程正文区、数据区、堆栈区。
寄存器上下文:程序计数器、状态寄存器、栈指针、通用寄存器。
内核上下文:进程表项、进程u区、本进程区表和页表、核心栈,进程系统级上下文动态部分。
核心栈装有进程函数的调用序列,上下文层处理中断中的context压入和弹出等。一个进程在它的当前上下文层中运行。机器所能支持的中断级数目,限制了下下文层的数目。对于支持5层中断级的系统,一个进程最多可有7个上下文层:中断级5个、系统调用一个、用户级一个。
5. 上下文切换
进程上下文即是一个运行时环境,操作系统不允许随意的进程上下文切换(想想并发的目的)。
进程调度时机:1内核态执行使自己进入睡眠状态时。2内核态执行完毕,切换到用户态时。3内核态执行exit进入僵死状态时。
6. 进程地址空间的管理
allocreg 分配一个区数据结构,返回一个上锁的、已分配的区。

attachreg 将区附接到进程。在fork,exec期间,内核要使一个区和一个进程地址空间联系起来。

7. sleep和wakeup
在一个事件上睡眠,实际上是将一组时间映射到一组虚地址上,代表这些时间的地址被编码在内核中。
sleep将睡眠地址和优先级保存在进程表中,将进程放到睡眠进程的散列队列中。
wakeup对睡眠在输入的睡眠地址上的每个进程,将其状态置为就绪,并从睡眠进程队列移除,放到调度队列中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值