趣谈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操作系统
登录|注册

05 | 学会几个系统调用:咱们公司能接哪些类型的项目?

刘超 2019-04-05
上一节我们讲了几个重要的 Linux 命令行,只有通过这些命令,用户才能把 Linux 系统用起来,不知道你掌握得如何了?其实 Linux 命令也是一个程序,只不过代码是别人写好的,你直接用就可以了。你可以自己试着写写代码,通过代码把 Linux 系统用起来,这样印象会更深刻。
不过,无论是别人写的程序,还是你写的程序,运行起来都是进程。如果你是一家外包公司,一个项目的运行要使用公司的服务,那就应该去办事大厅,也就是说,你写的程序应该使用系统调用。
你看,系统调用决定了这个操作系统好用不好用、功能全不全。对应到咱们这个公司中,作为一个老板,你应该好好规划一下,你的办事大厅能够提供哪些服务,这决定了你这个公司会被打五星还是打差评。

立项服务与进程管理

首先,我们得有个项目,那就要有立项服务。对应到 Linux 操作系统中就是创建进程
创建进程的系统调用叫fork。这个名字很奇怪,中文叫“分支”。为啥启动一个新进程叫“分支”呢?
在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(Child Process)。
前面我们说过,一个进程的运行是要有一个程序的,就像一个项目的执行,要有一个项目执行计划书。本来老的项目,按照项目计划书按部就班地来,项目执行到一半,突然接到命令,说是要新启动一个项目,这个时候应该怎么办呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《趣谈Linux操作系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(80)

  • TinnyFlames
    关于操作系统,有一本国外的教材叫做OSTEP(Operating System Three Easy Picies) 虽然貌似没有中文版的,但里面的内容讲的相当通俗易懂,强烈推荐给大家作为理论层面的补充

    作者回复: 推荐给大家

    2019-04-05
    3
    86
  • 青石
    用strace跟踪"ls -al"的系统调用,大体流程如下:
    1. 先执行execve,调用ls命令;
    2. 调用open、read、fstat、mmap、mprotect、mmap、close读取动态链库和系统配置文件;
    3. 读取passwd、group文件,获取用户信息,lstat、lgetxattr、getxattr获取文件属性,同时判断权限;
    4. 调用write输出内容;
    5. munmap释放内存,close关闭。

    作者回复: 赞

    2019-04-05
    80
  • sotey
    学习笔记+作业+提问,知识点真多啊,老师这文章货太干了。
    一、 创建进程
    #### 创建进程的总结:
    1、Linux中父进程调用fork创建子进程。
    2、父进程调用fork时,子进程拷贝所有父进程的数据接口和代码过来。
    3、当前进程是子进程,fork返回0;当前进程是父进程,fork返回子进程进程号
    4、如果返回0,说明当前进程是子进程,子进程请求execve系统调用,执行另一个程序。
    5、如果返回子进程号,说明当前进程是父进程,按照原父进程原计划执行。
    6、父进程要对子进程负责,调用waitpid将子进程进程号作为参数,父进程就能知道子进程运行完了没有,成功与否。
    7、操作系统启动的时候先创建了一个所有用户进程的“祖宗进程”,课时1,第3题A选项:0号进程是所有用户态进程的祖先
    ##### 创建进程的系统调用:fork
    ##### 执行另一个程序的系统调用:execve
    ##### 将子进程的进程号作为参数传给它,父进程就能知道子进程运行完了没有,成功与否:waitpid

    二、 内存管理
    ##### 内存管理总结
    1、每个进程都有独立的进程内存空间,互相之间不干扰。(隔离性)
    2、进程内存空间,存放程序代码的部分,称为代码段(Code Segment)。
    3、存放进程运行中产生数据的部分,称为数据段(Data Segment)。
    4、进程写入数据的时候,现用现分物理内存给进程使用。
    5、分配内存数量比较小时,使用brk调用,会和原来的堆数据连在一起。
    6、需要分配的内存数据量比较大的时候,使用mmap,重新划分一块内存区域。
    ##### 分配较小内存数量,和原来堆内数据连在一起:brk
    ##### 分配较大内存数量,重新划分一块内存区域:mmap

    三、 文件管理
    ##### 文件的操作六个最重要系统调用:
    ##### 打开文件:open
    ##### 关闭文件:close
    ##### 创建文件:creat
    ##### 打开文件后跳到文件某个位置:lseek
    ##### 读文件:read
    ##### 写文件:write
    ##### Linux一切皆文件
    ##### 一切皆文件的优势即使统一了操作的入口,提供了极大的便利。

    四、 信号处理(异常处理)
    进程执行过程中一旦有变动,就可以通过信号处理服务及时处理。

    五、 进程间通信
    #### 有两种方式实现进程间通信
    #### 消息队列方式
    ##### 创建一个新的队列:msgget
    ##### 发送消息到消息队列:msgsnd
    ##### 取出队列中的消息:msgrcv

    六、 共享内存方式
    ##### 创建共享内存块:shmget
    ##### 将共享内存映射到自己的内存空间:shmat

    #### 利用信号量实现隔离性
    ##### 占用信号量:sem_wait
    ##### 释放信号量:sem_post
    伪代码:
    假设信号量为1
    signal = 1
    sem_wait伪代码
    while True {
    if sem_wait == 1;
        signal -=1;
        break;
    }
    code.code;
    sem_post伪代码
    signal +=1;

    七、 网络通信
    ##### 网络插口:socket
    ##### 网络通信遵循TCP/IP网络协议栈
    #####

    八、 glibc
    ##### glibc是Linux下开源标准C库
    ##### glibc把系统调用进一步封

    ##### sys_open对应glibc的open函数
    ##### 一个单独的glibcAPI可能调用多个系统调用
    ##### printf函数调用sys_open、sys_mmap、sys_write、sys_close等等系统调用

    ### 课后作业
    strace ls -la
    查看有如下系统调用
    execve
    brk
    mmap
    access
    open
    fstat
    mmap
    close
    read
    stat
    write
    lseek
    lstat
    getxattr
    socket
    connect
    mprotect

    ##### 疑问:局部变量,在当前函数执行的时候起作用,就是说当前函数执行中产生的局部变量是存放在内存中的。为什么不是暂存在CPU缓存或者寄存器,进入另一个函数时,丢掉局部变量,而不写入内存,提升效率。

    作者回复: 哪有这么多寄存器

    2019-04-09
    5
    68
  • rocedu
    文件,虚存,进程三大核心概念都谈到了。学习系统调用,专栏可以作为学习地图进行之路,下面还有下极大的功夫。给大家推荐一本非常棒的入门图书Unix/Linux编程实践教程(Understanding UNIX/LINUX Programming),绝版了,但是网上能搜到电子版,看到这本书真是相见恨晚。我的博客https://www.cnblogs.com/rocedu/p/6016880.html就是对这本书的核心方法的总结,供大家参考。

    作者回复: 赞

    2019-04-05
    35
  • 刘強
    所有把socket翻译成套接字的文章,我一律不看。原因是socket的本意已经很清楚的说明了它的作用,我们翻译成套接字,平白无故的给读者增加了理解的难度。我觉得这个词除了能装逼,别于他用。作者是明白人,是现在读者的角度考虑的。这是真大牛!

    作者回复: 谢谢啦

    2019-04-05
    30
  • gwwwwt
    刘老师,您好,我想问一下,Linux内核源代码下载后需要编译么? 另外,您能推荐一个Mac上读kernel源码的软件么?感谢。。

    作者回复: 看源码不用编译,但是改代码需要,后面实验环节有这部分

    2019-04-05
    23
  • fy
    在留言区能够看到分享好书的人,多谢!

    作者回复: 是的,很感谢他们

    2019-04-05
    7
  • 不专注的linuxer
    老师、各位同学,大家好!
    “fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号” 这句话到意思是不是说,父进程调用fork创建子进程之后,得到CPU执行权的可能是父进程叶可能是子进程,所以要从返回值区分一下?
    不是很理解这个具体的过程,有谁可以解释一下吗?

    作者回复: 既然fork是复制,就说明父进程和子进程在用户态的代码段是一模一样的,如果fork这个系统调用后面的语句都是A,则无论是父进程,还是子进程都是接下来要执行A的。好在fork是一个系统调用,刚从内核返回的时候,由于内核是能够区分父进程和子进程的,因而用户态的程序代码里面,往往通过这个返回值来判断自己是父进程还是子进程,因为子进程如果不判断一下,是不知道自己是子进程的。这和CPU执行权也没有关系。就是代码执行完fork以后,由于父子进程的代码是一模一样的,父进程和子进程都不知道自己是哪一个,但是判断返回值就知道了。

    2019-08-14
    6
  • qpm
    我自己比较擅长Java并发编程,对于系统调用其实不是特别熟悉。不过今天老师讲解的内容非常容易能听懂,很多的通用数据结构像消息队列,信号量,共享内存在其他领域的编程里面都有涉及,计算机的设计果然是一通百通的。这样我有信心更好的学习这个课程

    作者回复: 是的,一通百通

    2019-04-05
    6
  • twelve
    用strace跟踪”whoami"命令,执行的系统调用有:
    (1)execve执行/usr/bin/whoami程序
    (2)brk、mmap 内存映射,mprotect内存权限更改
    (3)access、openat、fstat、read、lseek、close 文件权限、属性查看、打开、跳到文件某个位置,关闭等操作
    (4)geteuid 获取用户id
    (5)socket、connect网络通信
    (6)write 文件写入
    (7)arch_pctcl、exit_group 设计架构的进程或线程状态和退出进程中的所有线程
    2019-04-14
    5
  • williamcai
    项目大了,会被拆分成项目组,项目理解为进程,那么项目组可以理解为进程下的线程么

    作者回复: 子团队

    2019-04-05
    5
  • cronusqiu
    一直有一个疑问,fork一个进城,会返回两次,这个是怎么做到的,原理是什么?

    作者回复: 不会返回两次呀

    2019-04-11
    4
  • Loner
    可以自己搭个opengork服务器,教程百度有,很方便的看linux 源代码

    作者回复: 赞

    2019-04-07
    4
  • 爷爷刘大
    另外还有一点,文件描述符不是面向操作系统的,而是针对进程的,所以同一个文件在不同的进程里可能会有不同的fd。其实换个理解方式就好懂了:因为操作系统里有太多的文件,一个进程大概率不需要知道所有的文件,所以每当进程用到文件的时候,就像系统要来这个文件,对进程来说,一个类似于数组的东西就可以管理到所有系统分配给他的文件,所以fd就是按照自然数顺序依次排列的,0表示标准输入,1是标准输出,2是标准错误,这三个是固定的,后面的用到就依次往后加。相当于是个下标index的概念。

    作者回复: 是的

    2019-05-05
    3
  • 美美
    上面推荐的国外的教材叫OSTEP(Operating System Three Easy Picies) 已经有中文版了,顶上去让大家知道:https://book.douban.com/subject/33463930/

    作者回复: 好书

    2019-08-23
    2
  • 逆流的鱼
    发送信号是kill😂,这和kill -9是一个吧?

    作者回复: 是的

    2019-04-09
    2
  • Jamin
    如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号?父进程返回了子进程号?

    作者回复: 对啊,如果当前进程是父进程,返回的是子进程的进程号。

    2019-04-09
    2
  • 秉心说
    对于进程的内存空间来讲,放进程运行中产生数据的这部分,我们称为数据段(Data Segment)。

    语音里面这句好像读错了,数据段说成代码段了。

    作者回复: 哦,读的时候紧张了

    2019-04-09
    2
  • Liam
    1 execve 执行二进制文件 ls -al
    2 brk, mmap, mprotect, munmap 内存分配,访问和释放
    3 access,open, openat, close, read, write 文件操作
    4 lstat, fstat, stat 获取文件相关信息
    5 getxattr, lgetxattr 获取文件属性
    6 socket, connect 网络相关
    7 futex 同步机制
    2019-04-07
    2
  • dancer
    day5打卡!这种类比日常概念的讲解非常有助于记忆,并且一下就把几大重要部分串起来了!赞!

    作者回复: 谢谢

    2019-04-06
    2
收起评论
80
返回
顶部