趣谈Linux操作系统
刘超
网易杭州研究院云计算技术部首席架构师
立即订阅
19393 人已学习
课程目录
已完结 72 讲
0/4登录后,你可以任选4讲全文学习。
入门准备篇 (3讲)
开篇词 | 为什么要学习Linux操作系统?
免费
01 | 入学测验:你究竟对Linux操作系统了解多少?
02 | 学习路径:爬过这六个陡坡,你就能对Linux了如指掌
核心原理篇:第一部分 Linux操作系统综述 (3讲)
03 | 你可以把Linux内核当成一家软件外包公司的老板
04 | 快速上手几个Linux命令:每家公司都有自己的黑话
05 | 学会几个系统调用:咱们公司能接哪些类型的项目?
核心原理篇:第二部分 系统初始化 (4讲)
06 | x86架构:有了开放的架构,才能打造开放的营商环境
07 | 从BIOS到bootloader:创业伊始,有活儿老板自己上
08 | 内核初始化:生意做大了就得成立公司
09 | 系统调用:公司成立好了就要开始接项目
核心原理篇:第三部分 进程管理 (10讲)
10 | 进程:公司接这么多项目,如何管?
11 | 线程:如何让复杂的项目并行执行?
12 | 进程数据结构(上):项目多了就需要项目管理系统
13 | 进程数据结构(中):项目多了就需要项目管理系统
14 | 进程数据结构(下):项目多了就需要项目管理系统
15 | 调度(上):如何制定项目管理流程?
16 | 调度(中):主动调度是如何发生的?
17 | 调度(下):抢占式调度是如何发生的?
18 | 进程的创建:如何发起一个新项目?
19 | 线程的创建:如何执行一个新子项目?
核心原理篇:第四部分 内存管理 (7讲)
20 | 内存管理(上):为客户保密,规划进程内存空间布局
21 | 内存管理(下):为客户保密,项目组独享会议室封闭开发
22 | 进程空间管理:项目组还可以自行布置会议室
23 | 物理内存管理(上):会议室管理员如何分配会议室?
24 | 物理内存管理(下):会议室管理员如何分配会议室?
25 | 用户态内存映射:如何找到正确的会议室?
26 | 内核态内存映射:如何找到正确的会议室?
核心原理篇:第五部分 文件系统 (4讲)
27 | 文件系统:项目成果要归档,我们就需要档案库
28 | 硬盘文件系统:如何最合理地组织档案库的文档?
29 | 虚拟文件系统:文件多了就需要档案管理系统
30 | 文件缓存:常用文档应该放在触手可得的地方
核心原理篇:第六部分 输入输出系统 (5讲)
31 | 输入与输出:如何建立售前售后生态体系?
32 | 字符设备(上):如何建立直销模式?
33 | 字符设备(下):如何建立直销模式?
34 | 块设备(上):如何建立代理商销售模式?
35 | 块设备(下):如何建立代理商销售模式?
核心原理篇:第七部分 进程间通信 (7讲)
36 | 进程间通信:遇到大项目需要项目组之间的合作才行
37 | 信号(上):项目组A完成了,如何及时通知项目组B?
38 | 信号(下):项目组A完成了,如何及时通知项目组B?
39 | 管道:项目组A完成了,如何交接给项目组B?
40 | IPC(上):不同项目组之间抢资源,如何协调?
41 | IPC(中):不同项目组之间抢资源,如何协调?
42 | IPC(下):不同项目组之间抢资源,如何协调?
核心原理篇:第八部分 网络系统 (7讲)
43 预习 | Socket通信之网络协议基本原理
43 | Socket通信:遇上特大项目,要学会和其他公司合作
44 | Socket内核数据结构:如何成立特大项目合作部?
45 | 发送网络包(上):如何表达我们想让合作伙伴做什么?
46 | 发送网络包(下):如何表达我们想让合作伙伴做什么?
47 | 接收网络包(上):如何搞明白合作伙伴让我们做什么?
48 | 接收网络包(下):如何搞明白合作伙伴让我们做什么?
核心原理篇:第九部分 虚拟化 (7讲)
49 | 虚拟机:如何成立子公司,让公司变集团?
50 | 计算虚拟化之CPU(上):如何复用集团的人力资源?
51 | 计算虚拟化之CPU(下):如何复用集团的人力资源?
52 | 计算虚拟化之内存:如何建立独立的办公室?
53 | 存储虚拟化(上):如何建立自己保管的单独档案库?
54 | 存储虚拟化(下):如何建立自己保管的单独档案库?
55 | 网络虚拟化:如何成立独立的合作部?
核心原理篇:第十部分 容器化 (4讲)
56 | 容器:大公司为保持创新,鼓励内部创业
57 | Namespace技术:内部创业公司应该独立运营
58 | CGroup技术:内部创业公司应该独立核算成本
59 | 数据中心操作系统:上市敲钟
实战串讲篇 (9讲)
60 | 搭建操作系统实验环境(上):授人以鱼不如授人以渔
61 | 搭建操作系统实验环境(下):授人以鱼不如授人以渔
62 | 知识串讲:用一个创业故事串起操作系统原理(一)
63 | 知识串讲:用一个创业故事串起操作系统原理(二)
64 | 知识串讲:用一个创业故事串起操作系统原理(三)
65 | 知识串讲:用一个创业故事串起操作系统原理(四)
66 | 知识串讲:用一个创业故事串起操作系统原理(五)
67 | 期末测试:这些操作系统问题,你真的掌握了吗?
结束语 | 永远别轻视任何技术,也永远别轻视自己
免费
专栏加餐 (2讲)
学习攻略(一):学好操作系统,需要掌握哪些前置知识?
“趣谈Linux操作系统”食用指南
免费
趣谈Linux操作系统
登录|注册

20 | 内存管理(上):为客户保密,规划进程内存空间布局

刘超 2019-05-13
平时我们说计算机的“计算”两个字,其实说的就是两方面,第一,进程和线程对于 CPU 的使用;第二,对于内存的管理。所以从这一节开始,我们来看看内存管理的机制。
我之前说把内存管理比喻为一个项目组的“封闭开发的会议室”。很显然,如果不隔离,就会不安全、就会泄密,因而,我们说每个进程应该有自己的内存空间。内存空间都是独立的、相互隔离的。对于每个进程来讲,看起来应该都是独占的。

独享内存空间的原理

之前我只是简单地形容了一下。这一节,我们来深入分析一下,为啥一定要封闭开发呢?
执行一个项目,要依赖于项目执行计划书里的一行一行指令。项目只要按这些指令运行就行了。但是,在运行指令的过程中,免不了要产生一些数据。这些数据要保存在一个地方,这个地方就是内存,也就是我们刚才说的“会议室”。
和会议室一样,内存都被分成一块一块儿的,都编好了号。例如 3F-10,就是三楼十号会议室。内存也有这样一个地址。这个地址是实实在在的地址,通过这个地址我们就能够定位到物理内存的位置。
使用这种类型的地址会不会有问题呢?我们的二进制程序,也就是项目执行计划书,都是事先写好的,可以多次运行的。如果里面有个指令是,要把用户输入的数字保存在内存中,那就会有问题。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈Linux操作系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • lfn
    cat /proc/$pid/map
    2019-05-13
    28
  • why
    - 内存管理(上)
    - 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射
    - 除了内存管理模块, 其他都使用虚拟地址(包括内核)
    - 虚拟内存空间包含: 内核空间(高地址); 用户空间(低地址)
    - 用户空间从低到高布局为: 代码段; DATA 段; BSS 段(未初始化静态变量); 堆段; 内存映射段; 栈地址空间段
    - 多个进程看到的用户空间是独立的
    - 内核空间: 多个进程看到同一内核空间, 但内核栈每个进程不一样
    - 内核代码也仅能访问内核空间
    - 内核也有内核代码段, DATA 段, 和 BSS 段; 位于内核空间低地址
    - 内核代码也是 ELF 格式

    内核空间和进程的关系有点像进程和多线程的关系啊.
    2019-05-14
    8
  • Linuxer
    pmap pid
    2019-05-13
    5
  • 雪人
    老师,我想问一下,所有进程的内核空间是共用一块内存吗?还有就是,是不是可以这样理解,用户空间是负责办事情的,内核空间是负责管理所有进程的资源,以及负责与内核一些不公开的资源进行交互的?

    作者回复: 是的

    2019-05-13
    3
  • aiter
    cat /proc/22528/maps
    00400000-00406000 r-xp 00000000 08:03 2886947 /usr/bin/sleep
    00606000-00607000 r--p 00006000 08:03 2886947 /usr/bin/sleep
    00607000-00608000 rw-p 00007000 08:03 2886947 /usr/bin/sleep
    01ecc000-01eed000 rw-p 00000000 00:00 0 [heap]
    7fef2bb48000-7fef3206f000 r--p 00000000 08:03 2888013 /usr/lib/locale/locale-archive
    7fef3206f000-7fef32225000 r-xp 00000000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef32225000-7fef32425000 ---p 001b6000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef32425000-7fef32429000 r--p 001b6000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef32429000-7fef3242b000 rw-p 001ba000 08:03 269589 /usr/lib64/libc-2.17.so
    7fef3242b000-7fef32430000 rw-p 00000000 00:00 0
    7fef32430000-7fef32451000 r-xp 00000000 08:03 269280 /usr/lib64/ld-2.17.so
    7fef32640000-7fef32643000 rw-p 00000000 00:00 0
    7fef32650000-7fef32651000 rw-p 00000000 00:00 0
    7fef32651000-7fef32652000 r--p 00021000 08:03 269280 /usr/lib64/ld-2.17.so
    7fef32652000-7fef32653000 rw-p 00022000 08:03 269280 /usr/lib64/ld-2.17.so
    7fef32653000-7fef32654000 rw-p 00000000 00:00 0
    7fff81aa3000-7fff81ac4000 rw-p 00000000 00:00 0 [stack]
    7fff81b8d000-7fff81b8f000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    2019-05-13
    3
  • 有铭
    请问,老师的意思是,内核空间其实是完全共享的吗?大家看到的数据都是相同的,如果修改数据,会影响到所有进程?也就是说,其实内核空间其实只占用一份物理内存?另外,既然都是相同的,所谓“内核栈是各用各的”是啥意思?

    作者回复: 是完全共享的。内核的代码是有权限修改所有进程的,但是内核代码的书写者写的代码不会这样做,会很小心。也即内核是能为而不为。只占用一份物理内存。只不过这一块是进程A的内核栈,那一块是进程B的内核栈,作为内核代码,我都能动,但是我不随便动。

    2019-05-13
    2
  • 嘉木
    个人觉得三个相同的程序写同一个物理内存地址的例子不是太妥当
    因为内存管理的提供虚拟地址,每个进程才能有一致的地址空间,没有内存管理的话,多个相同的进程不会在运行到同一个地方写内存的时候写同一个地址吧。。。

    作者回复: 如果实模式下,写汇编,就会冲突的

    2019-06-18
    1
  • 活的潇洒
    配合《深入浅出计算机组成原理》和《Linux性能优化实战》一起学
    感觉《趣谈Linux操作系统》难度最大,希望自己能坚持把笔记做到最后
    day20笔记:https://www.cnblogs.com/luoahong/p/10919317.html

    作者回复: 加油

    2019-05-29
    1
    1
  • 铁皮
    @ CHEN
    你的程序有问题,如果sleep在malloc之前调用,那么是看不到[heap]的,是因为还没有程序在heap上分配空间。
    如果你在malloc之后调用sleep,就可以看到。

    作者回复: 赞

    2019-05-23
    1
    1
  • sam
    请问一下,分析的是linux kernel那个版本?

    作者回复: 4.13

    2019-05-13
    1
  • neohope
    编译器在静态编译的时候,是比较容易将代码的内存空间做好规划的,也比较好映射到内存中。
    但如果用dlopen 或 loadlibrary这样的函数,动态加载so或dll是如何做到的,一直不很清楚。
    希望后面能老师能讲到。
    2019-12-10
  • 陈志恒
    要抓住三点:
    1.为什么要使用虚拟内存?有什么好处
    2.既然使用的是虚拟内存,如何找到对应的物理内存?
    3.程序的运行分为用户态和内核态!
    2019-11-25
  • Geek_853778
    虚拟内存其实是为了避免多个进程运行时直接使用物理内存时可能会造成数据覆盖的问题,为每一个进程分配一块独立的内存,互不干扰
    2019-11-12
  • 坚持坚持在坚持
    pmap
    2019-10-28
  • 天王
    20 内存管理 1 计算机进行计算,包括2方面,一是进程和线程对cpu的使用,二是内存管理 。2 独享内存空间的原理 ,每个进程都有自己独立的内存空间,如果直接使用物理空间,多个程序同时执行会有占用冲突。所以程序使用虚拟地址,系统负责把虚拟地址和物理地址映射起来。2 操作系统的内存管理,包括3个方面,一是物理内存的管理,二是 虚拟地址的管理三 物理地址和虚拟地址做好映射。3 程序对内存使用,一代码会放到内存 二全局变量放到内存,三字符串放到内存,四是局部变量会放到栈 五malloc会分到堆 六glibc代码会放到内存,进入到内核,一是内核代码放到内存里 二是内核中也有全局变量 三 每个进程都有一个task_struct,四每个进程都有一个内核栈,五 内核栈里有动态分配的内存 ,六 虚拟内存和物理内存的映射 4 内存的排列 4.1 内存先分为用户态空间和内核态空间,用户态占用0到29号,内核态占用30到39号。4.2 用户态从0号到29号,依次是text segement(存放二进制可执行代码的位置段),data segment(存放初始化的静态常量),bss segment(存放未初始化的静态变量),heap(动态分配内存的区域),接下来是Memory Mapping segment,把文件映射进内存使用。接下来是栈地址段,4.3 内核态是共享的,无论哪个进程进入到内核,看到的空间和进程列表都是一样的,如果要访问公共资源需要加锁。
    2019-10-11
  • 无名
    老师,字符串常量是存储在Data Segment中吗?
    2019-09-18
  • williamcai
    老师,多个用户进程调用内核请求,如果内核处理不过来,是不是排队处理啊?还有内核怎么把执行结果返回给用户进程
    2019-09-12
  • 超超
    请问下超哥,在写驱动时,比如DMA操作的内存地址,也是虚拟内存地址吗?还是虚拟内存地址只是在用户态界面而言的?

    作者回复: 也是虚拟地址

    2019-07-03
  • Yayu
    请问,用户态 和 内核态 是用来限定什么的?这两个的区分标准是什么?

    作者回复: DPL

    2019-06-06
    1
  • 烈日融雪
    ```
    <?php
    if(time()%10==5) {
        echo "I got it".PHP_EOL;
    }
    sleep(mt_rand(1,6));
    ?>
    ```
    php sleep.php &

    cat /proc/$pid/maps

    可以看到分了很多段,但是
    7fffc2822000-7fffc2843000 rw-p 00000000 00:00 0 [stack]
    7fffc294b000-7fffc294d000 r--p 00000000 00:00 0 [vvar]
    7fffc294d000-7fffc294f000 r-xp 00000000 00:00 0 [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
    [stack]和[vsyscall]之间的也是属于syscall么?

    作者回复: vsyscall和vDSO是用于加速某些系统调用的两种机制。

    2019-05-23
收起评论
21
返回
顶部