第二章 进程管理
进程和文件是Unix系统最基本的两个抽象
进程:执行期的程序以及它包含的资源的统称
程序:存储在某种介质中的代码。
线程:进程中活动的对象
进程
创建fork()----退出执行exit(),退出后为僵死态,直至父进程调用wait
()或waitpid()为止
PID
pid_t类型
可以通过修改/proc/sys/kernel/pid_max来提高上限
进程状态:
#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
#define TASK_STATE_MAX 512
设置进程状态:
set_current_state(state);
进程上下文:
一般程序在用户空间执行,若有系统调用,进入上下文中(内核空间),此时
current有效。
每个进程必有一个父进程
所有的进程都是init(pid=1)的后代
一个进程可有多个子进程
进程的创建:
分两步
1、通过fork()复制当前进程创建一个子进程
2、exec()负责读取可执行文件并载入地址空间运行
写时拷贝:
上述第一步中不立即就拷贝,等到执行写操作时再拷贝,此前一直与父进程只
读方式共享
线程在linux中的实现:
内核中并没有线程的概念,它是一种进程间共享资源的手段
创建线程:
在调用clone()的时候传递一些参数标志指明要共享资源
内核线程:
内核在后台执行的一些操作
进程的终结:
do_exit()执行后,进程处于僵死态,还要系统调用wait4()来彻底终结进程
关于孤儿进程:
如果父进程先于子进程退出
1、在当前线程组中寻找一个作为父亲,不行,让init收留他
相关例子
2、内核模块用于打印进程信息
#include <linux/kernel.h> #include <linux/module.h> #include <linux/sched.h>
int task_init( void ) { /* Set up the anchor point */ struct task_struct *task ; /* Walk through the task list, until we hit the init_task again */ for_each_process(task)
{
printk( KERN_INFO "*** %s [%d] parent %s\n", task->comm, task->pid, task->parent->comm ); printk( KERN_INFO "*** Current task is %s [%d]\n", current->comm, current->pid);
}
return 0;
}
void cleanup_task( void ) { printk(KERN_ALERT"Cleanup task!\n"); } module_init(task_init); module_exit(cleanup_task);
|
阅读(1298) | 评论(0) | 转发(0) |