目录
1、进程
进程是运行中的程序,是一个动态的过程,是操作系统管理和分配资源的基本单单位;相对于进程我们还要了解线程的概念,线程是一种轻量级的线程等,关于线程后期进一步总结。
2、操作系统对于进程的管理方式
PCB:存放进程属性信息、程序计数器、程序上下文、mm_struct
进程实体:指令+数据 数据:.data .bss .heap 指令: .text .stack
操作系统会为每一个进程维护一个PCB进程控制块,PCB里边存储进程以下的信息,以下都可以唯一标识进程:
标识符:跟这个进程相关的唯一标识,用来区别其它进程;
状态:如果进程正在执行,那么进程处于执行状态;
优先级:相对于其他进程的优先级;
程序计数器:程序中即将被执行的下一条指令的地址;
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针;
上下文数据:包括显示的I/O请求、分配给进程的I/O设备和被进程使用的文件列表等;
审计信息:可包括处理器时间总和、使用的时钟数总和、时间限制、审计号等。
简单的说操作系统是通过一个task_struct结构体记录进程的信息,每一个进程都会有这样一个PCB,32位系统上,每个PCB大概1.7k。操作系统通过一个双向循环链表管理所有的PCB。
3、进程的创建和销毁
新建一个进程时:先生成PCB,再生成进程主体;
销毁一个进程时:先销毁进程主体,再销毁PCB;
一个进程PCB释放必须满足一定的条件:主体已毁,PCB已结束;
4、五种进程状态
第一种分类:
创建状态:进程正在被创建,尚未转到就绪状态;
就绪状态:指的是所有事件都已经完成,等待系统(CPU)进行调度;
运行状态:CPU正在执行其中的指令;
阻塞状态:等待的事件未发生;也称等待状态;
终止状态:进程正从系统中消失,这可能是进程正常结束或其他原因中断退出运行;
五种进程状态的转换图:
就绪---》运行:系统进程进程调度;
运行---》就绪:分配给进程的时间片用完;
运行---》阻塞:需要某些事件的发生才能运行;
阻塞---》就绪:等待的事件已经发生,只能转到就绪态,不能直接到运行态;
第二种分类:(摘抄于《Linux内核设计与实现》)
TASK_RUNNING(运行):进程是可以执行的;它或者正在执行,或者在运行队列中等待执行;这是进程在用户空间中执行的唯一可能的状态,这种状态也可以应用到内核空间中正在执行的过程;
TASK_INTERRUPTIBLE(可中断):进程正在睡眠(也就是说它被阻塞),等待某些条件的达成。一旦这些条件达成,内核就会把进程状态设置为运行。处于此状态的进程也会因为接收到信号而提前被唤醒并随时准备投入运行;
TASK_UNINTERRUPTIBLE(不可中断):除了就算是接收到信号也不会被唤醒或准备投入运行外,这个状态与可中断状态相同。这个状态通常在进程必须在等待时不受干扰或等待事件很快就会发生时初心。由于此状态的任务对信号不做响应,所以较之可中断状态,使用的较少;
_TASK_TRCED:其他进程被跟踪的进程,例如通过ptrace对调试程序进程跟踪;
_TASK_STOPPED(停止):进程停止执行;进程没有投入运行也不能投入运行。通常这种状态发生在接收到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号的时候。此外,在调试期间接收到任何信号,都会使程序进入这种状态;
也就是说就绪态和运行态是TASK_RUNNING状态。阻塞状态可以划分为可中断和不可中断两种状态;而挂起状态指的是等待被唤醒的状态,即就是暂停状态。
5、以“分页”内存管理方案,进程的加载
(1)内存的分页管理:
系统初始化时,将内存划分成大小相等的区块(4K),可类比于大小相等的固定分区;
(2)操作系统为每一个进程维护一个页表(页面加载到内存上的哪个帧上),一个进程可以不连续的加载到内存上;
(3)逻辑地址:在程序阶段就能确定下来的地址---》只和数据或函数在程序文件中的偏移有关;
物理地址:物理内存上实际的偏移;
一般,我们将逻辑地址通过页表进行转化,得到对应到真实物理内存上的物理地址;