openKylin论坛

 找回密码

Linux 进程控制 [复制链接]

1.程序是一个可执行的文件,而进程( process )是一个执行中的程序实例
2.利用分时技术,在 Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把 CPU 的运行时间划分成一个个规定长度的时间片,让每个进程在一个时间片内运行
3.当进程的时间片用完时系统就利用调度程序切换到另一个进程去运行。因此实际上对于具有单个 CPU 的机器来说某一时刻只能运行一个进程。但由于每个进程运行的时间片很短(例如 15 个系统滴答 =150 毫秒),所以表面看来好象所有进程在同时运行着
4.Linux 0.11 内核,系统最多可有 64 个进程同时存在
5.第一个进程是“手工”建立以外,其余的都是进程使用系统调用 fork 创建的新进程,被创建的进程称为子进程( child process ),创建者,则称为父进程( parent process )
6.内核程序使用进程标识号( process ID , pid )来标识每个进程
7.进程由可执行的指令代码、数据和堆栈区组成。进程中的代码和数据部分分别对应一个执行文件中的代码段、数据段。每个进程只能执行自己的代码和访问自己的数据及堆栈区
8.进程之间相互之间的通信需要通过系统调用来进行。对于只有一个 CPU 的系统,在某一时刻只能有一个进程正在运行。内核通过调度程序分时调度各个进程运行
9.Linux 系统中,一个进程可以在内核态( kernel mode )或用户态( user mode )下执行,内核堆栈和用户堆栈是分开的。用户堆栈用于进程在用户态下临时保存调用函数的参数、局部变量等数
据。内核堆栈则含有内核程序执行函数调用时的信息。
10.内核程序通过进程表对进程进行管理,每个进程在进程表中占有一项
11.在 Linux 系统中,进程表项是一个 task_struct 任务结构指针
12.任务数据结构定义在头文件 include/linux/sched.h 中
13.任务数据结构保存着用于控制和管理进程的所有信息,主要包括进程当前运行的状态信息、信号、进程号、父进程号、运行时间累计值、正在使用的文件和本任务的局部描述符以及任务状态段信息
14.struct task_struct {
long state//任务的运行状态(-1 不可运行,0 可运行(就绪),>0 已停止)。
long counter// 任务运行时间计数(递减)(滴答数),运行时间片。
long priority// 运行优先数。任务开始运行时 counter=priority,越大运行越长。
long signal// 信号。是位图,每个比特位代表一种信号,信号值=位偏移值+1。
struct sigaction sigaction[32] // 信号执行属性结构,对应信号将要执行的操作和标志信息。
long blocked// 进程信号屏蔽码(对应信号位图)。
int exit_code// 任务执行停止的退出码,其父进程会取。
unsigned long start_code// 代码段地址。
unsigned long end_code// 代码长度(字节数)。
unsigned long end_data// 代码长度 + 数据长度(字节数)。
unsigned long brk// 总长度(字节数)。
unsigned long start_stack// 堆栈段地址。
long pid// 进程标识号(进程号)。
long father// 父进程号。
long pgrp// 父进程组号。
long session// 会话号。
long leader// 会话首领。
unsigned short uid// 用户标识号(用户 id)。
unsigned short euid// 有效用户 id。
unsigned short suid// 保存的用户 id。
unsigned short gid// 组标识号(组 id)。
unsigned short egid// 有效组 id。
unsigned short sgid// 保存的组 id。
long alarm// 报警定时值(滴答数)。
long utime// 用户态运行时间(滴答数)。
long stime// 系统态运行时间(滴答数)。
long cutime// 子进程用户态运行时间。
long cstime// 子进程系统态运行时间。
long start_time// 进程开始运行时刻。
unsigned short used_math// 标志:是否使用了协处理器。
int tty// 进程使用 tty 的子设备号。-1 表示没有使用。
unsigned short umask// 文件创建属性屏蔽位。
struct m_inode * pwd// 当前工作目录 i 节点结构。
struct m_inode * root// 根目录 i 节点结构。
struct m_inode * executable // 执行文件 i 节点结构。
unsigned long close_on_exec // 执行时关闭文件句柄位图标志。(参见 include/fcntl.h)
struct file * filp[NR_OPEN] // 文件结构指针表,最多 32 项。表项号即是文件描述符的值。
struct desc_struct ldt[3] // 任务局部描述符表。0-空,1-代码段 cs,2-数据和堆栈段 ds&ss。
struct tss_struct tss// 进程的任务状态段信息结构。
};
15.当一个进程在执行时, CPU 的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文
16.当内核需要切换( switch )至另一个进程时,它就需要保存当前进程的所有状态,也即保存当前进程的上下文,以便在再次执行该进程时,能够恢复到切换时的状态执行下去
17.在 Linux 中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中断服务结束时能恢复被中断进程的执行

楼主
发表于 2013-11-21 14:18:38
回复

使用道具 举报

openKylin

GMT+8, 2024-5-14 21:10 , Processed in 0.033259 second(s), 17 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表