Linux设计与实现学习笔记

来源:互联网 发布:盘古mac版 编辑:程序博客网 时间:2024/04/29 08:21

从第三章开始吧,前面都是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

孤儿进程定义:

父进程在子进程之前退出。会寻找新的父进程。



上面是第三章进程管理的学习笔记,下一节开始进程调度的学习。





0 0
原创粉丝点击