高端的 Linux 系统编程技术与概念

课程简介

这门课是为创建 Linux 可编程程序库,Makefiles,内存管理,编译与链接,C 语言编程的开发者所设计的课程

课程介绍:English 繁中

从这 10.5 小时的课程,你会学到

  • 使用 C/C++ 中学习高端的编程概念
  • C/C++ 程序库的开发与集成
  • 使用 Makefile 自动建构流程
  • 使用函数指针作为 Callbacks
  • 静态和动态程序库及链接GCC 编译器的编译流程
  • 将代码组织到标头档( Header )和源文件中
  • 与计时器一起工作
  • 理解内存配置,Heap 内存管理,内存泄漏( Memory Leaks )
  • 堆栈内存,堆栈溢出,堆栈损坏,堆栈寄存器
  • 分页概念和分页表( Page Tables )

要求

  • 基本的 C/C++ 编程知识
  • 对学习和提高技能的狂热和热情
  • 良好的操作系统基础知识,但不是必须的

课程说明

本课程不适合 *绝对初学者*

互联网上已经有数不清的课程/教学,几乎教授 C 语言的所有方面。 所有这些课程听起来都一样,说起话来都一样,传授的知识也差不多一样。 这门课程与其他课程有什么不同?

本课程的目的是使您准备系统编程技术面试,面试水平-从初级到中级。 本课程适用于(未来的)开发人员,不适用于测试人员或系统管理者。

我选择创建这个课程来填补新手/初学者和中级/高端程序员之间的空白。 本课程假设你至少在编程(任何编程语言中,但使用 C/C++ 更好)方面高于平均水平,理解内存分配、各种循环、函数调用、指针等。 在本课程中,我不会教授 C/C++ ( udemy 上已经有很多关于它的课程) ,而是教授编程技术和关于 C 语言程序背后运作的底层细节——从面试的角度来看,所有的主题都非常重要。 我的目标是把这门课程发展成 Linux/C 圣经。

然而,我总是觉得,在这个激烈竞争的时代,你需要比你的同事更聪明,因此,我尝试着向你展示智能和知识,这对于一个程序员来说是至关重要的。 我已经看到尽管学生们可以编写出好的 C/C++ 程序,但是他们缺乏清晰的理解应该如何以程序库的形式编写出更好的组织、可管理、可扩展和可编程的代码( programmable codes )。 例如,学生太擅长编程竞赛,却不知道如何写一个简单的 Makefile 文件,原因是,学者不教,学生不爱学。

在本课程中,我将用高端语言无关的编程概念(第2版)讨论与创建 Linux 系统程序库(第1版)有关的主题,如果你明天碰巧成为其它语言的程序员,这些概念可以很好地应用。

多线程、线程同步、Socket 编程、 IPC 等概念要求每个主题都有单独的课程。 目前,我有一个关于 IPC 的课程,请查看。 这些主题超出了本课程的范围。

课程分为两个部分:

Release 1 建构和管理一个程序库: 这涵盖了关于如何创建和组织代码作为一个程序库的基础知识。

Release 2高端编程概念: 本课程将增加更多章节。 这涵盖了 Linux 和 C 的高端概念,请查看目录以获得更多信息。

本课程的进一步内容正在快速发展之中。 每星期最少增加一节。

为什么你不应该参加这个课程?

  1. 如果你是 C 语言编程的初学者,请不要参加这门课程! !
  2. 如果你不喜欢敲击键盘,而且懒得只看 VDOs 讲座,那么学习这门课程毫无意义
  3. 如果你只想把所有的现成东西都塞在你的盘子里。

课程先决条件:

  • C/C++ 编程初学者以上水平
  • 良好的操作系统基础知识
  • 追求卓越和编程的热情
  • 不需要第三方程序库

无论您实现什么逻辑,您都需要从头开始实现它。 像我所有的其它课程一样,这门课程并不建议你去寻求任何第三方程序库的帮助来完成这些工作。 使用外部程序库完全违背了课程的目的。

警告: 本课程有自动系统生成的字幕,可能并不完美。 请根据您的斟酌使用字幕。

课程:

**********************************************

Release 1 程序库的创建和管理

**********************************************

第1部分: 程序库简介

  • 什么是程序库
  • 程序库与应用程序之间的关系
  • 例如: 双向链表(Doubly linked list)作为一个程序库
  • 快速编译步骤
  • 摘要

第2部分: 头文件

  • 源文件和头文件之间的关系
  • 文本替换方法
  • 文本替换方法——范例与展示

第3部分: 预处理指令

  • Hdr 文件重复包含问题
  • 预处理指令
  • 重复包含 Hdr 文件的解决方案

第4部分: 正确使用结构和函数

  • 结构-定义和使用 thumb 规则
  • 函数-声明和使用 thumb 规则
  • 递归相依问题
  • 递归相依关系的解决方案

第5部分: 静态和动态程序库的创建

  • 双向链表程序库恢复运行
  • 静态和动态程序库的快速创建
  • 与静态程序库的链接
  • 与动态程序库的链接

第6部分: 使用 Makefile 建构

  • 什么是 Makefile,我们为什么需要它
  • Makefile 的功能
  • Make 文件相依树
  • 编写 Makefile 的步骤
  • 关于 Makefile 的赋值

第7部分: 运行时期( Run-time )可编程程序库

  • 什么是可编程程序库( Programmable Libraries )?
  • 编写程序库的步骤
  • 向程序库注册回呼函数( callbacks )
  • key_match 回呼函数
  • comparison_fn 回呼函数
  • 将特定于应用程序的操作委托给程序库

第8部分: 使用宏编写迭代器( Iterators )

  • 什么是迭代宏?
  • 为什么我们需要迭代宏?
  • 如何写迭代宏 – 针对 Tree 和 Linked List
  • 练习

第9部分:Glue 为基础的程序库和数据结构

  • 什么是 Glue 为基础的程序库?
  • 介绍 Glthreads – 一个 Glued Linkedlist
  • Glthreads 与传统的 Linked List 比较
  • Structure field offset
  • GL Thread 操作
  • 代码走访
  • GLThread 的好处

************************************************

Release 2 高端编程概念

************************************************

第10部分:Linux 行程的内存布局

  • 虚拟内存基础
  • Linux 行程的内存布局
  • 范例:Linux 行程的内存布局
  • siz 命令的练习

第 11 部分:堆栈内存管理

  • 堆栈内存基础和内容
  • 堆栈溢出和保护
  • 堆栈内存损毁
  • 一般的 CPU 寄存器
  • 进程调用机制 – 一步一步
  • 基底指针寄存器( ebp )的用途
  • 进程回传的机制 – 一步一步

Lab session

第 12 部分:Heap 内存管理

  • 介绍与目标
  • Malloc 如何运作
  • Heap 内存区域的顶端 – break 指针
  • Heap 内存管理系统调用 – brk 和 sbrk
  • Meta 和数据区块
  • free() 是如何运作
  • 区块分割
  • 区块合并
  • 内存出错 – 碎片的问题

第 13 部分:分页的概念

  • 分页( Paging ) 介绍
  • 比特可地址化内存
  • 32 比特和 64 比特机器架构
  • 地址信道和数据信道      
  • 实体和虚拟地址比较
  • 实体地址 Frames
  • 虚拟地址合成
  • 分页表
  • 分页的动作
  • 分享的物理内存

第 14 部分:多重层级的分页

第 15 部分 : 分页要求

第 16 部分 多线程行程的内存管理

第 17 部分:设计计时器

  • 概念和设计
  • 事件注册
  • 定期的事件触发
  • 计时器到期后的事件触发器
  • 将计时器写成程序库
  • 计时器的指定                

**主题还会再增加**

第 18 部分 理解编译的 4 个阶段

  • C/C++ 编译的 4 个阶段
  • 动态程序库是如何运作的?
  • 动态链接:与动态程序库链接
  • 比较 – 静态链接和动态链接

第 19 部分:C 语言中的 Structure Padding

  • 什么是 Structure Padding?
  • 为什么 Padding 被完成?
  • 取消 Padding

第 20 部分:C 语言中的隐藏结构

  • 什么是隐藏结构?
  • 访问隐藏结构
  • Opaque 指针

第 21 部分:字节顺序

  • Big-endian 和 Little Endian 机制
  • 主机的比特顺序
  • 网络的比特顺序
  • htonl() 与变种

*******

本课程的目的是让你准备好系统编程技术面试,从初学者到有 8-9 年的经验。

问:。 当你在自己的履历中注明有使用 C/C++ 系统编程语言时,面试官常问的问题是什么?

答: 如果我是面试官,我会问什么样的问题取决于他是否有多年的 C语言方面的经验。

1-3年的经验ー我会问:

  1. Double pointers
  2. 设计一个宏返回结构的大小
  3. 二维数组,从一个函数传入和回传数组
  4. C 语言程序编译的不同阶段
  5. Fork ()是如何工作的
  6. 调试内存损坏的各种方法有哪些。
  7. 各种 IPCs
  8. 基于 Heap 和堆栈内存的问题

4-6年的经验——我会问:

  1. 操作系统如何分配内存
  2. 内部和外部的碎片( fragmentation ),可以做什么来避免它
  3. 系统调用,strace ()
  4. 一个 IPC 相对于其它 IPC 的取舍
  5. 与核心和比较的各种通信方式
  6. C 语言中的数据(反)串行化
  7. C 语言中的 RPC
  8. callbacks 高端应用程序
  9. typedef 与 #define 比较
  10. 在 C 语言中使用宏泛型
  11. 线程同步
  12. 基于 Heap 和堆栈内存的问题

7年以上的经验-我会问

  1. 你有没有设计任何系统模块来解决任何问题
  2. 从头开始设计线程程序库你会加入哪些功能,如何加入?
  3. 写一个健壮和灵活的程序库什么是要做的和不要的?
  4. 如何使用 C 语言编写泛型代码
  5. 在 C 语言中实现计时器的各种方法,以及各种方法的比较
  6. 中断是如何运作的?
  7. 不同的 IPCs和比较
  8. 如何将 C 代码转换为 C++ ,反之亦然
  9. 如何编写检测内存泄漏或垃圾收集的工具
  10. 设计自己的内存配置工具。 为什么要编写自己的内存配置方案呢?
  11. 何时进行多行程设计而不是多线程设计,反之亦然
  12. ValGrind 工具是如何运作的
  13. 在生产代码中,你喜欢简单的递归逻辑,还是复杂的非递归逻辑,为什么?

如果你分析这个模式

有1-3年经验的候选人,我会选择问更直接和单刀直入的问题。

具有4-6年经验的候选人,我会选择问更高端的技术 C 语言问题加上一些比较的方法为基础的问题

有7年以上经验的候选人,我会选择问更多的设计和分析为基础的问题。

注意,因为问题涉及 C 和系统编程,所以我没有提到数据结构和算法。

目标受众

  • 具有 C/C++ 编程基础知识的学生
  • 警告: 不适合编程初学者
  • 想把自己的编程技能从初学者提高到专业水平
  • 最后一年的学生希望破解关于操作系统,C语言编程的面试问题

讲师简介

Abhishek Sagar 在 Juniper 担任网络通信协定开发者 ( 更多讲师主讲课程介绍 )

你好,我是孟买理工学院的毕业生,目前在网络跨国公司从事网络通信协定开发。

我有6年以上的业界经验,从事网络编程和开发已超过8年的经验。

我曾经在的跨国网络公司- Brocade 通信公司工作,现在在 Juniper Networks 工作。

我精通 Linux 开发环境,我借此机会通过 Udemy 在 Linux 网络开发领域培训世界各地的人。 我热爱并鼓励知识共享。

Shiwani Nigam 数字行销主管

嗨,我是市场行销学博士 Shivani Nigam。 我擅长研究消费者在网上购买产品时的行为。 我负责在这个平台上销售在线内容(Udemy 课程)。

我还确保课程由技术指导员以完美的音频 / 视频质量授课,并确保学生的疑问和问题并由技术指导员优先处理。

英文字幕:有

  • 想要了解如何将英文字幕自动翻译成中文? 请参考这篇 How-To

优惠信息

如何购买这门课程比较划算?可以参考课程合购优惠方案


报名参加课程

Sponsored by Udemy

也许你会有兴趣

 欢迎使用e-mail订阅 Soft & Share 

发表评论

Powered by WordPress.com.

Up ↑

%d 博主赞过: