《Linux内核设计与实现》第3章读书笔记
2016-03-31 10:36
471 查看
[b]第三章 进程管理[/b]
[b]一、进程[/b]
1.进程就是处于执行期的程序,但并不局限于可执行代码。实际上,进程是正在执行的程序代码的实时结果。
2.执行线程是在进程中活动的对象
每个线程拥有一个独立的计数器、进程栈、一组进程寄存器
内核调度的对象是线程
3.在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。
4.进程是调用fork()系统的结果,最后程序通过exit()系统调用退出执行。
[b]二、进程描述符及任务结构[/b]
内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项都是类型为task_struct、称为进程描述符的结构。
1.分配进程描述符
Linux通过slab分配器分配task struct,以达到对象复用和缓存着色的目的
2.进程描述符的存放
内核通过一个唯一的进程标识值或PID来标识每个进程,内核把每个进程的PID存放进它们各自的进程描述符中。
3.进程状态
进程描述符中的state域描述了进程的当前状态
TASK_RUNNING(运行)-进程可执行,进程正在或者等待执行
TASK_INTERRUPTIBLE(可中断)-进程被阻塞
TASK_UNINTERRUPTIBLE(不可中断)-对信号不做响应
_TASK_TRACED-被其他进程跟踪
_TASK_STOPPED(停止)-进程停止执行
4.进程上下文
当一个程序执行了系统调用或者触发了某个异常,它就陷入内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中。
三、进程创建
1.UNIX的进程创建方式
fork()通过拷贝当前进程创建一个子进程
exec()负责读取可执行文件并将其载入地址空间开始运行
2.写时拷贝
写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而让父进程子进程共享同一个拷贝。
fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述
[b]四、线程在Linux中的实现[/b]
1.线程机制提供了在同一进程内共享内存地址空间运行的一组线程,这些线程可以共享打开的文件和其他资源。Linux系统中并没有专门的线程机制,线程仅视为与其他进程共享某些资源的进程。
2.创建进程
与普通进程创建类似,在调用clone()的时候需要传递一些参数标志来指明需要共享的资源
传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类。
3.内核线程
内核线程和普通进程区别在于内核线程没有独立的地址空间,只在内核空间运行,从来不切换到用户空间去。
[b]五、进程终结[/b]
1.该任务大部分依赖于do_exit(),该函数永不返回
2.删除进程描述符
该任务是和清理工作分开进行的,因为这样在进程终结之后系统仍然可以获得它的信息
通过release_task()实现进程描述符的删除
3.解决孤儿进程
概述:父进程在进程之前退出,就会遗留下子进程,也就是孤儿进程
解决方法:在当前的线程组内给孤儿进程寻找新的父进程;否则直接以init作为其父进程
调用顺序:do_exit()-->forget_original_parent()-->find_new_parent()-->ptrace_exit_finish()(这一函数是为被跟踪的进程寻找父进程,因为被跟踪的进程会以调试程序作为临时父亲)
[b]一、进程[/b]
1.进程就是处于执行期的程序,但并不局限于可执行代码。实际上,进程是正在执行的程序代码的实时结果。
2.执行线程是在进程中活动的对象
每个线程拥有一个独立的计数器、进程栈、一组进程寄存器
内核调度的对象是线程
3.在现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存。
4.进程是调用fork()系统的结果,最后程序通过exit()系统调用退出执行。
[b]二、进程描述符及任务结构[/b]
内核把进程的列表存放在叫做任务队列的双向循环链表中。链表中的每一项都是类型为task_struct、称为进程描述符的结构。
1.分配进程描述符
Linux通过slab分配器分配task struct,以达到对象复用和缓存着色的目的
2.进程描述符的存放
内核通过一个唯一的进程标识值或PID来标识每个进程,内核把每个进程的PID存放进它们各自的进程描述符中。
3.进程状态
进程描述符中的state域描述了进程的当前状态
TASK_RUNNING(运行)-进程可执行,进程正在或者等待执行
TASK_INTERRUPTIBLE(可中断)-进程被阻塞
TASK_UNINTERRUPTIBLE(不可中断)-对信号不做响应
_TASK_TRACED-被其他进程跟踪
_TASK_STOPPED(停止)-进程停止执行
4.进程上下文
当一个程序执行了系统调用或者触发了某个异常,它就陷入内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中。
三、进程创建
1.UNIX的进程创建方式
fork()通过拷贝当前进程创建一个子进程
exec()负责读取可执行文件并将其载入地址空间开始运行
2.写时拷贝
写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而让父进程子进程共享同一个拷贝。
fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述
[b]四、线程在Linux中的实现[/b]
1.线程机制提供了在同一进程内共享内存地址空间运行的一组线程,这些线程可以共享打开的文件和其他资源。Linux系统中并没有专门的线程机制,线程仅视为与其他进程共享某些资源的进程。
2.创建进程
与普通进程创建类似,在调用clone()的时候需要传递一些参数标志来指明需要共享的资源
传递给clone()的参数标志决定了新创建进程的行为方式和父子进程之间共享的资源种类。
3.内核线程
内核线程和普通进程区别在于内核线程没有独立的地址空间,只在内核空间运行,从来不切换到用户空间去。
[b]五、进程终结[/b]
1.该任务大部分依赖于do_exit(),该函数永不返回
2.删除进程描述符
该任务是和清理工作分开进行的,因为这样在进程终结之后系统仍然可以获得它的信息
通过release_task()实现进程描述符的删除
3.解决孤儿进程
概述:父进程在进程之前退出,就会遗留下子进程,也就是孤儿进程
解决方法:在当前的线程组内给孤儿进程寻找新的父进程;否则直接以init作为其父进程
调用顺序:do_exit()-->forget_original_parent()-->find_new_parent()-->ptrace_exit_finish()(这一函数是为被跟踪的进程寻找父进程,因为被跟踪的进程会以调试程序作为临时父亲)
相关文章推荐
- linux 块设备驱动(五)——块设备应用层的操作
- linux命令(8)kill命令
- Linux下面安装Mysql说明
- 在linux中访问virtualbox的共享文件夹
- liunx文件权限
- CentOS7搭建NAS,包括NFS、ISCSI
- 日常碰到的linux一些问题个人备忘随笔
- liunx 通配符
- linux内核设计与实现一书阅读整理 之第三章
- linux 头文件
- linux第十八章学习笔记
- Linux下Loadrunner建立socket连接方法
- linux命令(7)killall
- 如何区分Linux下的几种终端类型:tty、pty和pts
- Linux如何创建一个新进程
- linux 块设备驱动(四)——简单的sbull实例
- Linux中系统时间的修改
- Linux Netlink
- windows 和 linux 互传文件 的简单 方法
- linux下mysql连接问题