【读书笔记】Linux内核设计与实现(第三章)

3.1 进程

处于执行期的程序。

进程就是正在执行的程序代码的实时结果。内核需要有效而又透明地管理所有细节。

执行线程(简称线程):在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。

内和调度的对象是线程,而不是进程。

进程提供两种虚拟机制:虚拟处理器和虚拟内存。

3.2 进程描述符及任务结构

Linux通过slab分配器分配task_struct结构。

每个任务的thread_info结构在它的内核栈的尾端分配。结构中task域中存放的是指向该任务实际task_struct的指针。

内核通过一个唯一的进程标识值或PID来标识每个进程。

内核把每个进程的PID存放在它们各自的进程描述符中。

进程描述符中的state域描述了进程的当前状态。

内核调整某个进程的状态:

Set_task_state(task, state);

该函数将指定的进程设置为指定的状态。

当一个程序执行了系统调用或者触发了某个异常,它就陷入了内核空间。此时,我们称内核“代表进程执行”并处于进程上下文中。

除非在此间隙有更高优先级的进程需要执行并由调度器做出了相应调整,否则在内核退出的时候,程序恢复在用户空间会继续执行。

3.3 进程创建

Unix采用与众不同的实现方式,它把上述步骤分解到两个单独的函数中去执行:fork()、exec()。

1.fork()通过拷贝当前进程创建一个子进程。复制父进程的页表以及给子进程创建唯一的进程描述符。

Linux通过clone()系统调用实现fork()。

子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。子进程不能向地址空间写入。

3.4 线程在Linux中的实现

线程机制支持并发程序设计技术,在多处理器系统上,它能保证真正的并行处理。

创建进程在调用clone()的时候需要传递一些参数标志来指明需要共享的资源。

内核线程和普通的进程间的区别在于内核线程没有独立的地址空间。它们只在内和空间运行,从来不切换到用户空间去。

内核进程和普通进程一样,可以被调度,也可以被抢占。

3.5 进程终结

任务大部分要靠do_exit()来完成。

在调用了do_exit()之后,尽管线程已经不能再运行了,但是系统还保留了它的进程描述符。

进程终结时所需的清理工作和进程描述符的删除被分开执行。

Wait()这一族函数是通过唯一的一个系统调用wait4()来实现的。

当最终需要释放进程描述符时,release_task()会被调用。

当一个进程被跟踪时,它的临时父亲设定为调试进程。此时如果它的父进程退出了,系统会为它和它的所有兄弟重新找一个父进程。

解决办法:在一个单独的被ptrace跟踪的子进程链表中搜索相关的兄弟进程——用两个相对较小的链表减轻了遍历带来的消耗。

时间: 2024-11-08 23:36:06

【读书笔记】Linux内核设计与实现(第三章)的相关文章

《LINUX内核设计的艺术》第一章从开机家电到执行main函数之前的过程 学习笔记之一

从开机加电到实行main函数之前的过程 分为三步,目的是实现从启动盘加载操作系统程序,完成实现main函数的准备工作 启动BLOS,准备是模式下的中断向量表和中断服务程序 从启动盘加载操作系统程序到内存.加载操作系统程序就是靠第一步实现的 为实现32位的main函数做过度工作 1.1启动blos,准备实模式下的中断向量表和中断服务程序 由blos来加载软件操作系统的任务 1.1.1         BLOS的启动原理 0XFFFF0 由硬件来启动,CPU硬件设计逻辑设计为加电瞬间就强行将CS的值

linux及安全《Linux内核设计与实现》第一章——20135227黄晓妍

<linux内核设计与实现>第一章 第一章Linux内核简介: 1.3操作系统和内核简介 操作系统:系统包含了操作系统和所有运行在它之上的应用程序.操作系统是指整个在系统中负责完成最基本功能和系统管理的那些部分.这些部分包括内核.设备驱动程序.启动应到程序.命令行shell或者其他种类的用户界面.基本的文件管理系统工具. 内核:如果说用户界面是操作系统的外在表像,那么内核就是操作系统的内在核心. 内核空间:系统态和保护起来的内存空间. 内核的组成: 1.中断服务程序(响应中断) 2.调度程序(

Linux内核设计与实现 第十七章

1. 设备类型 linux中主要由3种类型的设备,分别是: 设备类型 代表设备 特点 访问方式 块设备 硬盘,光盘 随机访问设备中的内容 一般都是把设备挂载为文件系统后再访问 字符设备 键盘,打印机 只能顺序访问(一个一个字符或者一个一个字节) 一般不挂载,直接和设备交互 网络设备 网卡 打破了Unix "所有东西都是文件" 的设计原则 通过套接字API来访问 除了以上3种典型的设备之外,还有"伪设备",即一些虚拟的设备,仅提供访问内核功能而已,没有物理设备与之关联

Linux内核设计与实现 第五章

1. 什么是系统调用 系统调用就是用户程序和硬件设备之间的桥梁. 用户程序在需要的时候,通过系统调用来使用硬件设备. 系统调用的存在意义: 1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,这样大大简化了用户程序的开发. 比如:用户程序通过write()系统调用就可以将数据写入文件,而不必关心文件是在磁盘上还是软盘上,或者其他存储上. 2)系统调用使得用户程序有更好的可移植性. 只要操作系统提供的系统调用接口相同,用户程序就可在不用修改的情况下,从一个系统迁移到另一个操作系统. 3)

《Linux内核分析》之第三章读书笔记

进程管理 进程是处于执行期的程序以及相关的资源的总称,也称作任务.执行线程,简称线程,是在进程中活动的对象. 可以两个或两个以上的进程执行同一个程序 也可以两个或两个以上并存的进程共享许多资源 内核调度的对象是线程,而不是进程. 进程描述符及任务结构 内核把进程的列表存放在任务列表(task list)的双向循环链表中. 链表中每一项都是类型为task_struct的进程描述符的结构. 进程描述符中包含的数据能完整地描述一个正在执行的程序: 打开的文件 进程的地址空间 挂起的信号 进程的状态 m

《linux内核设计与实现》第二章

第二章 从内核出发 一.获取内核源码 1.使用Git(linux创造的系统) 使用git来获取最新提交到linux版本树的一个副本: $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 下载代码后,更新分支到Linux的最新分支: $ git pull 这两个命令可以获取并随时保持与内核官方的代码树一致. 2.安装内核源代码 压缩形式是bzip2,则运行: $ tar xvjf linu

读书笔记----《windows核心编程》第三章 内核对象1(句柄与安全性)

最近一直没有更新博客,因为一直在想一个问题,内核对象这一章内容很多很重要,自己没有掌握好也没有把握写好这一章,最后还是决定能写多少写多少,一面写一面学,后续学到新的再更新吧; <windows核心编程>提了几种内核对象: 访问令牌对象:与windows的安全性有关,目前不是很懂,了解后再写; 事件对象: Event对象,可跨进程同步; 由CreateEvent创建; 文件对象: File对象,比较常见; 由CreateFile创建; 文件映射对象: 通过文件映射可以方便的操作文件(如同文件数据

【读书笔记】《深入浅出nodejs》第三章 异步I/O

1. 为什么要异步I/O (1)用户体验上: 并发的优势: M+N+... -> max(M,N,...)  --> 使后端能够快速的响应资源 *并发的劣势:... (2)资源分配: 单线程同步编程模型会因阻塞I/O导致硬件资源得不到更优的使用. -> 硬件使用效率低     ----- | -----> Node:利用单线程,远离多线程死锁,状态同步等问题:利用异步I/O,让单线程远离阻塞,以更好的使用CPU. 多线程编程模型会因为编程中的死锁.状态同步等问题让开发人员头疼. -

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

《Linux内核设计与实现》Chapter 2 读书笔记

<Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 更新分支到Linux的最新分支 $ git pull 可以获取并随时保持与内核官方的代码树一致 2.安装内核源代码 压缩形式为bzip2 $ tar xvjf linux-x.y.z.tar.bz2 压缩