进程管理
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()来检查其子进程,清除所有与其相关的僵死进程。
进程(任务
从内核观点所看到的进程
)
正在执行的程序代码的实时结果,处于执行期的程序及相关资源的总称
包括程序代码【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)
进程上下文: | 系统调用和异常处理程序是对内核明确定义的接口,进程只有通过这些接口才能陷入内核执行 |
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()来检查其子进程,清除所有与其相关的僵死进程。
相关文章推荐
- Android Studio安装插件Genymotion
- Ubuntu 当黑屏解决方案安装
- 使用LocationManager来获取移动设备所在的地理位置信息
- 知与谁同
- Spring SpringMVC Mybatis整合
- 队列(三):链式存储队列
- linux信号
- Javascript 中的 && 和 || 使用小结
- actors角色模型系列之一 actors介绍以及akka 框架的使用入门
- 跳跃表的实现
- Fragment生命周期及其与activity的关系
- 第十四周 项目1-小玩文件(3)
- XSS auditor bypass
- Java线程(篇外篇):线程本地变量ThreadLocal
- Hibernate学习笔记之简单Demo
- X265
- 筛选法
- Mongoose即使是简单的表查询
- PHP 页面跳转到另一个页面的多种方法方法总结
- 关于Memcached的CAS和Set方法造成Socket泄漏的问题