您的位置:首页 > 其它

进程管理

2015-06-10 16:02 218 查看
进程管理是所有操作系统的心脏所在

进程(任务
从内核观点所看到的进程


正在执行的程序代码的实时结果,处于执行期的程序及相关资源的总称
包括程序代码【text section】和资源,如挂起的信号内核内部数据处理器状态具有内存映射的内存地址空间执行线程(thread
of execution)、存放全局变量的数据段

线程进程中的活动对象,拥有独立的程序计数器进程栈和一组进程寄存器,线程是内核调度的对象
Linux的线程实现非常特别:对线程和进程并不特别区分,线程只不过是一种特殊的进程,在线程之间可以共享虚拟内存(包含在同一个进程中的线程),在Linux中线程就是与其他进程共享某些资源的进程,只是进程间共享资源的手段

fork()系统调用从内核返回两次:一次回到父进程,另一次回到新产生的子进程
调用exec()这组函数,可以创建新的地址空间,并把新的程序载入其中
exit()系统调用退出执行,这个函数会终结进程并释放资源

wait4()
系统调用查询子进程是否终结
使得进程拥有了等待特定进程执行完毕的能力
退出后僵死状态,直到父进程调用wait()或waitpid()为止

2.
进程描述符 task_struct
任务队列 task list,进程的列表
双向循环链表,struct task_struct包含一个具体进程的所有信息(32位机器有1.7kB)

Slab动态分布 struct thread_info
内核栈的尾端分配,通过栈指针计算它的位置,避免使用额外的寄存器专门记录

http://blog.chinaunix.net/uid-22548820-id-2125152.html
3.进程描述符的存放
PID
pid_t
为了与老版本的Linux兼容,PID的最大默认值为32768,但也可以修改来提高上限:
4.进程的状态

TASK_RUNNING

TASK_INTERRUPTIBLE

TASK_UNINTERRUPTABLE

__TASK_TRACED

__TASK_STOPPED SIGSTOP SIGTSTP SIGTTIN SIGTTO

Set_task_state(task,state)

进程上下文:

系统调用和异常处理程序是对内核明确定义的接口,进程只有通过这些接口才能陷入内核执行
5.进程的创建

Fork()/Vfork() -> Clone() -> copy_process

传递给clone()的参数的标志决定了新创建进程的行为方式和父子进程之间共享资源的种类:

6.内核线程

没有独立的地址空间,只在内核空间运行,后台任务如flush任务等
内核线程只能由其他内核线程创建:
kthraed_create
新创建的线程不可运行状态
kthraed_run =
简单调用 kthraed_create + wake_up_process:

#define kthread_run(threadfn,data,namefmt,…)\

({

Struct task_struck *k;\

k=kthread_create(threadfn,data,namefmt,##__VA_ARGS__);\

If(!IS_ERR(k))\

wake_up_process(k);\

k;\

})

kthraed_stop

7.进程的终结

显示、隐式、被动 exit()->do_exit()

exit_files() exit_fs()

exit_notify() forget_original_parent () find_new_reaper()
向父进程发送信号,给子进程重新找养父,并把进程的状态设为EXIT_ZOMBIE,不会再被调度,永不返回

调用schedule()切换到新的进程

在父进程获得已终结的子进程的信息后,或者通知内核它并不关注哪些信息后,子进程的task_struct结构才被释放

wait() wait4() release_task()

init进程会例行调用wait()来检查其子进程,清除所有与其相关的僵死进程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: