进程
- 进程并不仅仅局限于一段可执行程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间,一个或多个执行线程,存放全局变量的数据段。
- 每个线程都拥有一个独立的线程栈,线程寄存器和程序计数器。
- 一般会在栈顶创建一个结构体struct Thread_Info,该数据结构中保存指向进程描述符task_struct的指针。
- 内核通过一个唯一的进程标识符PID来 标识每个进程
- 一个进程必然处于五种进程状态中的一种:TASK_RUNNING,RASK_INTERRUPTIBLE,TASK_UNINTERRUPTIBLE,_TASK_TRACED,TASK_STOPPED
- 当一个程序执行系统调用陷入了内核空间时,此时内核是在"代表该用户进程执行"并处于进程上下文中。与之相对的,当程序执行过程中发生了异常中断,中断处理程序并"不会代表任何进程执行",此时不存在进程上下文。
- Linux系统中所有进程都是PID为1的Init进程的后代。Init进程的进程描述符是作为init_task的静态变量分配的。
进程创建
- 与其他的操作系统提供的产生(spawn)进程的机制不同。Linux将创建进程和执行分解到了两个单独的函数fork()和exec()去执行。
- fork()通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅在于PID,PPID和某些资源和统计量(例如刮起的信号)。
- exec()函数负责读取可执行文件并将其载入地址空间开始运行。

本文是《Linux内核设计与实现》的读书笔记,主要探讨了Linux中的进程管理,包括进程的概念、状态、创建、终结,以及独特的线程实现机制。通过fork()和exec()创建进程,内核通过PID标识进程,线程在Linux中被视为共享资源的进程。进程终结由do_exit()完成,涉及地址空间、信号、记账等资源的释放。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



