从第三章开始吧,前面都是Overview的介绍:
第三章:进程管理
进程的概念:
处于执行期的程序+其他占用的资源(打开的文件,挂起的信号...)
Linux中线程是一种特殊的进程,区别于其他系统。
fork-->exec->exit
进程描述符及任务结构:
每个进程对应一个数据结构:task_struct,称为进程描述符。
重要的元素:state(进程状态),parent(父进程描述符指针),pid(不用解释了),prio(进程的优先级)...
slab分配器分配task_struct,这地方会在12章继续研究,Mark一下。
进程的唯一标识符:pid,可以通过修改/proc/sys/kernel/pid_max来提高上限。
通过current宏获得task_struct,中间需要thread_info.
进程状态:
TASK_RUNNING :进程是可执行的--运行中或等待被运行
TASK_INTERRUPTIBLE :进程是休眠的,等待被唤醒。
TASK_UNINTERRUPTIBLE:进程是休眠的,不能被唤醒。用的较少。
_TASK_TRACED:被其他进程跟着,如ptrace(gdb的基础)。
_TASK_STOPPED:进程停止运行,受到SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU等信号。
设置当前进程状态:
就是修改task_struct中state的值,需要考虑SMP.
进程上下文:
用户空间运行的进程“陷入”到内核空间,内核空间会”代表进程执行“。在内核退出后悔继续在用户空间执行。
系统调用和异常处理是陷入内核的唯一两种方式。
进程家族树:
通过current->parent访问父进程
双向链表存储进程的子进程
进程的创建:
Linux不同于其他系统(spawn),而是采用fork+exec的方式创建新进程。
写时拷贝:
新进程需要写入时才会复制数据,其他都是以只读方式共享。可以大大提高效率。
fork():
fork,vfork._clone----系统调用--->clone
vfork():
不copy页表项,不建议使用。
线程在Linux中的实现:
线程被称为”轻量级进程“,他与父进程共享地址空间,文件系统只有,文件描述符和信号处理程序。
创建线程:
clone的参赛与普通进程不同加上了CLONE_VM.
内核线程:
以后章节会讲,为什么内核中以线程方式实现?
进程终结:
exit->do_exit
孤儿进程定义:
父进程在子进程之前退出。会寻找新的父进程。
上面是第三章进程管理的学习笔记,下一节开始进程调度的学习。