《Linux内核原理与设计》

视频学习及操作

给MenuOS增加time和time-asm命令的方法:

1、更新menu代码到最新版

rm menu -rf      //强制删除menu, rm -rf 表示强制删除的意思。
git clone 网址 //克隆一个新的menu,这样就使得menu的代码更新到最新版

2、在main()函数中增加MenuConfig

3、增加对应的Time函数和TimeAsm函数(这里的函数要换成我们自己编写的使用系统调用的函数,比如mkdir和mkdirAsm)

4、make rootfs (帮我们自动编译、生成根文件系统,同时自动帮我们启动起来Menuos,这时我们发现menu支持的命令比原来多)

使用gdb跟踪系统调用内核函数sys_time

.编辑 menu 中的 text.c 文件,把上周作业写的fork和fork_asm写在menuos里面:

make rootf 打开 menu 镜像,输入help可以看到MenuOS菜单中新增了两条命令:

接下来开始用gdb调试:

cd LinuxKernel
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
水平分割
gdb
file linux-3.18.6/vmlinux //加载内核
target remote:1234 //链接到menu os里
b start_kernel //在start_kernel处设置断点
c //继续执行

接下来设置断点,启动MenuOs,输入mkdir,看gdb调试结果:

list        //查看startkernel这段代码
b sys_mkdir //在要分析的这个系统调用处设置断点
c //继续执行
c
c

b sys_time 一个 断点,按 c 继续执行 time 命令,发现进入系统调用后会停在sys_time这个函数

关于从system_call到iret之间的过程

从保存现场到恢复现场,画了一个流程图大致如下:

教材第九、十章学习

1、链表中每个结点代表一个请求。线程持有锁,而锁保护了数据。各种锁机制之间的区别主要在于,当锁已经被其他线程持有而不可用时,一些锁会执行等待,另一些会使当前任务睡眠知道锁可用。互斥锁mutex中,0意味着开锁,1意味着上锁。

2、伪并发执行是指单线程的多个进程共享文件,或者在一个程序内部处理信号,也可能产生竞争条件,但两者其实并不是同时发生的,它们相互交叉进行;真并发是指在一台支持对称多处理器的的机器上,两个进程真正的在临界区中同时执行。内核中产生并发执行的原因来自于中断、软中断和tasklet、内核抢占、睡眠及与用户空间的同步、对称多处理。

3、为什么要上锁呢?是怕其他执行线程可以访问这些数据,避免什么其他什么东西都能看到他,就要上锁,如果是局部数据,仅仅被它本身访问,它们独立存在于执行线程的栈中,纳闷就不需要给这些局部变量加锁。

4、如果有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有资源都已被占用,所有线程都在相互等待,且它们永远不会释放已占有的资源,这就是死锁。死锁的例子有很多,自死锁,ABBA死锁等,要避免死锁,就要按顺序加锁(嵌套的使用多个锁)、防止发生饥饿、不要重复请求同一个锁、设计应力求简单。恰当的加锁既要满足不死锁,可扩展,还要清晰简洁,加锁的精髓在于力求简单。

5、在内核同步方法中,主要介绍了11种内核同步方法,同步的目的就是为了保障数据的安全,其实就是保障各个线程之间共享资源的安全。其中大内核锁(BLK)是内核的原始混沌时期,应用不多,因此我们主要学习另外十种内核同步方法。

10.1 原子操作

原子操作是由编译器来保证的,用于临界区只有一个变量的情况,只有一个整数,保证一个线程对数据的执行过程不会被其他线程打断。原子操作有2类:

1、原子整数操作,有32位和64位,头文件分别为<asm/atomic.h>和<asm/atomic64.h>

2、原子位操作,头文件 <asm/bitops.h>

10.2 自旋锁

自旋锁是Linux中最常见的锁,它最多只能被一个可执行线程持有,如果一个执行线程试图获得一个已被持有的自旋锁,则该线程会一直进行忙循环-旋转-等待锁重新可用。由于处于等待状态的线程在等待锁重新可用时自旋,特别浪费CPU时间,因此自旋锁不应该被某一线程长时间持有。它的头文件为<asm/spinlock.h>

警告:

1、自旋锁是不可递归的,否则递归的请求同一个自旋锁会自己锁死自己。

2、线程获取自旋锁之前,要禁止本地中断,否则中断处理程序就会打断正持有锁的内核代码,且有可能和获取锁的线程竞争自旋锁。

自旋锁和下半部:

1、下半部处理和进程上下文共享数据时,由于下半部的处理可以抢占进程上下文的代码,所以进程上下文在对共享数据加锁前要禁止下半部的执行,解锁时再允许下半部的执行。

2、中断处理程序(上半部)和下半部处理共享数据时,由于中断处理(上半部)可以抢占下半部的执行,所以下半部在对共享数据加锁前要禁止中断处理(上半部),解锁时再允许中断的执行。

3、同一种tasklet不能同时运行,所以同类tasklet中的共享数据不需要保护。

4、对于软中断,无论同种类型,如果数据被软中断共享,那它必须得得到锁的保护,但是同一处理器上一个软中断不会抢占另一个软中断,因此不需要禁止下半部。

10.3 读-写自旋锁

读写自旋锁方面,本周四课上已经讲过,读和读是不互斥的,其余的读和写,写和写之间都是互斥的。

10.4 信号量

信号量也是一种睡眠锁,和自旋锁不同的是,线程获取不到信号量的时候,不会像自旋锁一样循环的去试图获取锁,而是进入睡眠,直至有信号量释放出来时,才会唤醒睡眠的线程,进入临界区执行,所以信号量适用于等待时间较长的临界区。信号量有二值信号量和计数信号量2种,其中二值信号量比较常用。

二值信号量表示信号量只有2个值:信号量为1时,表示临界区可用;信号量为0时,表示临界区不可访问。

10.5 读-写信号量

读写信号量都是二值信号量(互斥信号量),即计数值最大为1,增加读者时,计数器不变,增加写者,计数器才减一,也就是说读写信号量保护的临界区,最多只有一个写者,但可以有多个读者。

10.6 互斥体

内核中唯一允许睡眠的锁是信号量。mutex在内核中对应的数据结构mutex,其行为和使用计数为1的信号量相似,但操作接口更简单,实现也更高效,且使用限制更强,因此首选mutex,除非不能满足其约束条件。

10.7 完成变量

完成变量是使两个任务得以同步的简单方法,完成变量的机制类似于信号量,如果一个线程要执行工作时,另一个线程会在完成变量上等待;当线程完成了工作之后,使用完成变量来唤醒等待的任务。

完成变量的头文件:<linux/completion.h>

10.9 顺序锁

通常简称seq锁,与自旋锁和读写信号量不同,顺序锁用于读写共享数据。

10.10 禁止抢占

自旋锁虽然可以防止内核抢占,但是有时候仅仅需要禁止内核抢占,不需要像自旋锁那样连中断都屏蔽掉,这时可以使用禁止内核抢占的方法。禁止抢占的头文件为<linux/preempt.h>

10.11 顺序和屏障

对于一段代码,编译器或者处理器在编译和执行时可能会对执行顺序进行一些优化,从而使得代码的执行顺序和我们写的代码有些区别。在并发条件下,可能会出现取得的值与预期不一致的情况,因此为了保证代码的执行顺序,引入了一系列屏障方法来阻止编译器和处理器的优化。

参考网址:内核同步处理方法

问题与思考

教材第九章提到要给数据加锁而不是给代码加锁,而第九章P140的总结却说要加锁的是代码?我的理解是通过编代码的方式,给数据进行加锁,P140的说法是不是不太准确

2017-2018-1 20179205《Linux内核原理与设计》第六周作业的更多相关文章

  1. 2017-2018-1 20179205《Linux内核原理与设计》第九周作业

    <Linux内核原理与设计>第九周作业 视频学习及代码分析 一.进程调度时机与进程的切换 不同类型的进程有不同的调度需求,第一种分类:I/O-bound 会频繁的进程I/O,通常会花费很多 ...

  2. 2017-2018-1 20179205《Linux内核原理与设计》第二周作业

    <Linux内核原理与分析>第二周作业 本周视频学习情况: 通过孟老师的视频教程,大致对风诺依曼体系结构有了一个初步的认识,视频从硬件角度和程序员角度对CPU和Main Memory(内存 ...

  3. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  4. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  5. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  6. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  7. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  8. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  9. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  10. 2017-2018-1 20179205《Linux内核原理与设计》第四周作业

    <Linux内核原理与分析> 视频学习及实验操作 Linux内核源代码 视频中提到了三个我们要重点专注的目录下的代码,一个是arch目录下的x86,支持不同cpu体系架构的源代码:第二个是 ...

随机推荐

  1. opencv里vector的内存的申请和释放的问题

    改成: ); CvSeq * m_contour=; cvFindContours( &IPlImage(img), m_storage, &m_contour, ,)); //释放内 ...

  2. c/c++中的关键字(static、const、inline、friend)

    static:1.a.c语言中static修饰的局部变量在编译时赋初始值,只赋初始值一次,在函数运行时已有初值,每次调用函数时不用重新赋值,指示保留上次 函 数调用结束时的值. 如果定义局部变量不赋初 ...

  3. BZOJ4821 SDOI2017相关分析(线段树)

    纯粹的码农题.维护x的和.y的和.xy的和.x2的和即可.可能会炸long long. #include<iostream> #include<cstdio> #include ...

  4. CF498D:Traffic Jams in the Land——题解

    https://vjudge.net/problem/CodeForces-498D http://codeforces.com/problemset/problem/498/D 题面描述: 一些国家 ...

  5. LOJ6276:果树——题解

    https://loj.ac/problem/6276#submit_code NiroBC 姐姐是个活泼的少女,她十分喜欢爬树,而她家门口正好有一棵果树,正好满足了她爬树的需求.这颗果树有N 个节点 ...

  6. [bzoj] 1040 骑士 || 基环外向树dp

    原题 给出n个点n条边和每个点的点权,一条边的两个断点不能同时选择,问最大可以选多少. //图是一张基环外向树森林 是不是很像舞会啊- 就是多了一条边. 所以我们考虑一下对于一棵基环外向树,拆掉一条在 ...

  7. BZOJ [Ctsc2002] Award 颁奖典礼 解题报告

    [Ctsc2002] Award 颁奖典礼 Description IOI2002的颁奖典礼将在YONG-IN Hall隆重举行.人们在经历了充满梦幻的世界杯之后变得更加富于情趣.为了使颁奖典礼更具魅 ...

  8. POJ.3172 Scales (DFS)

    POJ.3172 Scales (DFS) 题意分析 一开始没看数据范围,上来直接01背包写的.RE后看数据范围吓死了.然后写了个2^1000的DFS,妥妥的T. 后来想到了预处理前缀和的方法.细节以 ...

  9. YBT 2.4 AC自动机

    其实这个专题NOIP几乎不考 AC自动机,就是能让题自动AC的东西,是不是十分神奇 对的,就是这么神奇 AC自动机是解决多模式串与文本串匹配的问题 是KMP+Trie树的结合,也是一个毒瘤算法 Key ...

  10. cmder 添加到右键菜单

    管理员权限打开cmde 输入: cmder /register all 回车,OK