文章概要:
1.进程概念的简单普及
2.进程控制块(PCB)中成员信息
一、操作系统:管理软硬件资源
1.操作系统必须支持交替执行多个进程,在合理的响应时间范围内使处理器的利用率达到最大。
2.操作系统必须按照特定的策略(例如某些函数或者应用程序具有较高的优先级)给进程分配资源,同时避免死锁。
3.操作系统可以支持进程间的通信和用户创建进程,它们对构造应用程序很有帮助。
小贴士:一个计算机平台包括的硬件资源:
处理器、内存、I/O模块、定时器和磁盘驱动器等。
4.操作系统是计算机硬件和应用程序之间的一层软件。
5.操作系统可以想象为资源的统一抽象表示,可以被应用程序请求和访问。
资源包括内存、网络接口和文件系统。
二、进程:
进程的定义:
①正在执行的程序;
②正在计算机上执行的实例;
③能分配给处理器并由处理器可以执行的实体。
④具有以下特征的活动单元:
一组指令序列的执行、一个当前状态和相关的系统资源。
进程的两个基本元素是:程序代码(可能被执行相同程序的其他进程共享—–>因为是只读的)和代码相关联的数据集。
可以说:进程是由程序代码和相关数据还有程序控制块组成。
三、Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。
它定义在linux-2.6.38.8/include/linux/sched.h文件中。
task_struct都可能包含哪些成员信息?
1.进程状态,记录进程在等待,运行,或死锁
2.调度信息,由哪个调度函数调度,怎样调度等
3.进程的通讯状态
4.因为要插入进程树,必须有联系父子兄弟的指针,当然是tast_struct型
5.时间信息,比如计算好执行的时间 以便cpu分配
6.标号,决定进程归属
7.可以读写打开的一些文件信息
8.进程上下文和内核上下文
9.处理器上下文
10.内存信息
因为每一个PCB都是这样的,只有这些结构,才能满足一个进程的所有要求,它定义在linux2.6.38.8/include/linux/sched.h文件中。
1.进程状态:
volatile long state;
int exit_state;
2.state成员的可能取值如下:
#define TASK_RUNNING 0
#define TASK_INTERRUPTIBLE 1
#define TASK_UNINTERRUPTIBLE 2
#define __TASK_STOPPED 4
#define __TASK_TRACED 8
/* in tsk->exit_state */
#define EXIT_ZOMBIE 16
#define EXIT_DEAD 32
/* in tsk->state again */
#define TASK_DEAD 64
#define TASK_WAKEKILL 128
#define TASK_WAKING 256
系统中的每个进程都必然处于以上所列进程状态中的一种。
对上述信息进行简要描述:
TASK_RUNNING表示进程要么正在执行,要么正要准备执行。
TASK_INTERRUPTIBLE表示进程被阻塞(睡眠),直到某个条件变为真。条件一旦达成,进程的状态就被设置为TASK_RUNNING。
TASK_UNINTERRUPTIBLE的意义与TASK_INTERRUPTIBLE类似,除了不能通过接受一个信号来唤醒以外。
__TASK_STOPPED表示进程被停止执行。
__TASK_TRACED表示进程被debugger等进程监视。
EXIT_ZOMBIE表示进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息。
EXIT_DEAD表示进程的最终状态。
EXIT_ZOMBIE和EXIT_DEAD也可以存放在exit_state成员中。
2、进程标识符(PID)
pid_t pid;
pid_t tgid;
在CONFIG_BASE_SMALL配置为0的情况下,PID的取值范围是0到32767,即系统中的进程数最大为32768个。
/* linux-2.6.38.8/include/linux/threads.h */
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000)
在Linux系统中,一个线程组中的所有线程使用和该线程组的领头线程(该组中的第一个轻量级进程)相同的PID,并被存放在tgid成员中。只有线程组的领头线程的pid成员才会被设置为与tgid相同的值。注意,getpid()系统调用返回的是当前进程的tgid值而不是pid值。
3、进程内核栈
void *stack;
进程通过alloc_thread_info函数分配它的内核栈,通过free_thread_info函数释放所分配的内核栈。
/* linux-2.6.38.8/kernel/fork.c */
static inline struct thread_info *alloc_thread_info(struct task_struct *tsk)
{
#ifdef CONFIG_DEBUG_STACK_USAGE
gfp_t mask = GFP_KERNEL | __GFP_ZERO;
#else
gfp_t mask = GFP_KERNEL;
#endif
return (struct thread_info *)__get_free_pages(mask, THREAD_SIZE_ORDER);
}
static inline void