多进程与多线程:进程是系统资源分配的最小单位,线程是程序执行的最小单位,即CPU调度的基本单位。
-
进程是执行中的目标码( executable object code),正在运行中的程序。进程是由数据、资源、状态及虚拟的一个计算机 组成的。
-
可执行格式包括:元数据(meta data)及多个代码和数据段(sections of code and data)。这些段是会被加载进内存的线性块的目标码( linear chunk)。
- 最重要和最常用的段是text段(也就是code段)、 data段和bss段。
text段 包含可执行的代码及只读数据(const),通常被标识成只读或可执行
data段 包含已经初始化的数据(例如定义过初始值的C 变量 ),通常被标识成可檫写
bss段 包含尚未初始化的全局变量,内核会将此段映射成zero page (填满零的页面)。
- 最重要和最常用的段是text段(也就是code段)、 data段和bss段。
-
进程还会涉及由内核仲裁和管理的各种系统资源,进程通常只能通过系统调用来请求和操作资源(包括定时器、未决信号、已打开的文件、网络连接、硬件以及IPC机制)。
-
在内核中,一个进程所配的资源会随着进程相关的数据及统计值,一同被存入进程中的进程描述符(process descriptor)。
- 进程是一个虚拟的抽象对象,内核支持抢占式多任务处理(preemptive multitasking)和虚拟内存(virtual memory),并为进程提供虚拟化的处理器及内存的虚拟化视图。多个进程可能同时参加调度,但在运行时,每个进程都好像在独自掌控整个系统一样。事实上:内核会无间隙且透明的抢占和重新调用进程(preempts and reschedule process),与正在运行的所有进程共享处理器。因为每个进程被分配单一的线性地址空间,给出每个进程在独自控制系统中所有内存的假象。举例:电表程序可以看成是一个进程。
- 内核通过现代处理器所提供的硬件支持,来管理虚拟内存和页面调度(paging)机制,让每个进程各自运行在不同的地址空间中,允许多个进程并存在系统中。
-
进程与程序:
- 程序是包含可执行代码及执行代码需要的数据等信息的文件,存放在磁盘等介质上。
- 当程序被操作系统装载到内存并分配给它一定的资源后,此时可以称为进程。
- 程序是静态概念,进程是动态概念。
-
进程在内核中的组织形式:进程控制块
-
linux进程控制块:task_struct结构
pid_t pid; struct list_head children,sibling;
uid_t uid,euid; struct fs_struct *fs;
gid_t gid,egid; struct files_struct *files;
volatile long state; struct mm_struct *mm;
int exit_state; struct signal_struct *signal;
unsigned int rt_priority; struct sighand_struct *sighand;
unsigned int policy; cputime_t utime,stime;
struct list_head tasks; struct timespec start_time;
struct task_struct *real_parent; struct timespec real_start_time;
struct task_struct *parent;- task_struct :进程状态:
进程状态 state成员的可能取值如下
volatile long state; #define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define TASK_ZOMBIE 4 #define TASK_STOPPED 8- 进程状态切换:
- 进程状态切换:
- task_struct :进程状态:
- <