进程的一些基本概念
随着操作系统发展到分时系统,为了开发同一道作业中不同作业步之间的并发,引入了进程机制。在现在的操作系统中,程序以进程的方式使用系统资源,进程的出现实现了操作系统的并发性。
进程定义
进程可以理解为程序对数据或请求的处理过程。进程有以下特点:
- 进程至少运行一个可执行程序,含有代码和初始数据。
- 进程包括一个独立的进程用户空间。
- 进程包括系统资源。
- 进程包括一个执行栈区。
进程至少运行一个可执行程序,含有代码和初始数据
以 Linux 0.11 为例,Linux 0.11中的可执行文件格式为a.out,包括:
(1) 执行头部分。这其中包含一些参数,内核使用这些参数把执行文件加载到内存中并执行。
struct exec {
unsigned long a_magic; /* 目标文件魔数*/
unsigned a_text; /* 代码长度,字节数 */
unsigned a_data; /* 数据长度,字节数 */
unsigned a_bss; /* 文件中的未初始化数据区长度,字节数 */
unsigned a_syms; /* 文件中的符号表长度,字节数 */
unsigned a_entry; /* 执行开始地址 */
unsigned a_trsize; /* 代码重定位信息长度,字节数 */
unsigned a_drsize; /* 数据重定位信息长度,字节数 */
};
(2) 代码段部分。含有程序执行时被加载到内存中的指令代码的相关数据。
(3) 数据段部分。这部分含有已经初始化过的数据,总是被加载到可读写的内存中。
(4) 数据重定向部分。
(5) 代码重定向部分。
(6) 符号表部分。
(7) 字符串表部分。
进程包括一个独立的进程用户空间
每个进程都有其独立的地址空间,其中存放着程序与数据,当不同的进程执行同一个程序时,由于不同进程的地址空间是相互独立的,所以它们处理的数据是不同的。
进程包括系统资源
程序运行有时会需要一些必须的系统资源,例如I/O设备,文件等等。
进程包括一个执行栈区
操作系统必须为进程分配一个栈区,用来保存过程调用时的现场或在栈中分配的局部变量。
以上讨论进程时,涉及到了程序、数据、用户栈,为此引入进程映像的概念,进程映像为程序、数据、用户栈的集合。
进程控制块
进程控制块(PCB),包括进程标识信息,处理机状态信息,进程控制信息。
Linux 0.11的PCB结构如下:
struct task_struct {
/* these are hardcoded - don't touch */
long state; /* -1 unrunnable, 0 runnable, >0 stopped ,进程的状态*/
long counter;
long priority;
long signal;
struct sigaction sigaction[32];
long blocked; /* bitmap of masked signals */
/* various fields */
int exit_code;
unsigned long start_code,end_code,end_data,brk,start_stack;
long pid,father,pgrp,session,leader;
unsigned short uid,euid,suid;
unsigned short gid,egid,sgid;
long alarm;
long utime,stime,cutime,cstime,start_time;
unsigned short used_math;
/* file system info */
int tty; /* -1 if no tty, so it must be signed */
unsigned short umask;
struct m_inode * pwd;
struct m_inode * root;
struct m_inode * executable;
unsigned long close_on_exec;
struct file * filp[NR_OPEN];
/* 局部描述符表,进程的地址空间 */
struct desc_struct ldt[3];
/* tss for this task ,即任务状态段*/
struct tss_struct tss;
};
总结
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源。一个进程实体由进程控制块、程序段、相关数据段组成。