任务
知识点归纳以及自己最有收获的内容 (3分)
问题与解决思路(2分)
实践内容与截图,代码链接(3分)
...(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(2分)
知识点归纳:
学习目标:
1,为学生提供高级编程所需的背景知识和技能
程序开发步骤,包括汇编器,链接器,链接库,可执行文件内容,程序执行印象等
2,让学生能够再现实生活中应用动态数据结构
通过多层次的函数调用来显示一个程序的栈内容;
实现参数可变的类printf函数;
实现一个二叉树来模拟Unix/Linux文件系统树;
运用各种编程技术,如字符串标记化,搜索树节点等;
使用二叉树遍历算法将二叉树保存为文件,并根据保存的文件重构二叉树
3,理解进程概念和进程管理
创建进程,调度进程,切换进程,维护进程等;
fork(),exit(),wait(),exec();
4,并行计算和并发编程
Pthreads 2017;
使用用户级线程,实现线程同步工具;
5,定时器和定时功能
实现支持并发任务的间隔定时器
6,信号,信号处理和进程间通信
理解程序异常和进程间通信;
使用Linux信号和管道实现一个进程间通信机制;
7,文件系统
存储设备、Unix\Linux内核中的文件系统支持、文件操作的系统调用、库I/O函数等;
8,TCP/IP和网络编程
TCP\IP协议、套接字API、UDP和TCP套接字编程,以及网络计算中的服务器-客户机模型。
Unix发展历史
- AT&T Unix
- Berkeley Unix
- HP Unix
- IBM Unix
- Sun Unix
Linux版本
- Debian Linux
- Ubuntu Linux
- Linux Mint
- 基于RPM的Linux
- Slackware Linux
安装VMware并在虚拟机上安装虚拟机
Linux的使用
Linux内核映像
Linux内核映像位于/boot目录中,一个可启动的Linux内核映像由三部分组成: |BOOT|SETUP|linux kernel|
Linux启动程序
GRUB和LILO
Linux的启动
定位Linux内核映像文件
加载BOOT+SETUP至实模式内存的0x90000处
加载Linux内核至高端内存的1MB处
将初始ramdisk映像initrd加载到高端内存中
转移控制权,运行0x902000处的SETUP代码,启动Linux内核
Linux运行级别
Linux内核以单用户模式启动,以多用户模式运行。
登录进程
三个文件流stdin、stdout、stderr,等待用户登录。
命令执行
执行命令解释程序sh,后者将提示用户执行命令。
Unix/Linux文件系统组织
Unix/Linux文件系统采用树形组织结构
文件类型
目录文件
非目录文件(REGULAR常规文件或者SPECIAL特殊文件)
常规文件(ORDINARY普通文件)
特殊文件
字符特殊文件:字符I/O
块特殊文件:块I/O
其他类型
符号链接文件
文件路径名
Unix/Linux文件系统树的根节点称为根目录
以“/”开头的路径名为绝对路径名,反之则为相对于进程当前工作目录(CWD)的相对路径名。
Unix/Linux命令
命令实践
Linux手册页
所有手册均为压缩。gz文件,可通过满程序读取手册文件
man ls: 显示man1中ls命令的手册页。
man 2 open: 显示man2中open函数的手册页。
man strtok: 显示man3中strtok函数的手册页等。
man 3 dirname:显示man3(而非man1)中dirname函数。
Unix/Linux 系统管理
用户账户
添加新用户
sudo adduer username
第2章 编程背景
Linux中的文本编辑器
vim
命令模式:用于输人命令。
插入模式:用于输入和编辑文本
末行模式:用于保存文件并退出
要输入文本进行编辑,用户必须输入i(插入)或a(追加)命令将vim切换到插入模式:
i:切换到插入模式,插入文本。
a:切换到插入模式,追加文本。
要退出插入模式,请按ESC键一次或多次。在命令模式下,输入“;”进入末行模式。将文本保存为文件或退出vim:
:w:写入(保存)文件。
:q:退出 vim。
wq:保存并退出。
q!:不保存更改,强制退出。
gedit
Ubuntu及其他使用GNOMEGUI用户界面的Linux的默认编辑器。
程序开发
C语言程序中的变量可分为全局变量,局部变量,静态变量,自动变量和寄存器变量
gcc把源文件转成二进制可执行文件
1,编译--将源文件转换为汇编代码
2,汇编--将汇编代码转换成目标代码
.o文件包含
一个文件头,包含代码段、数据段和BSS段的大小
一个代码段,包含机器指令
一个数据段,包含初始化全局变量和初始化静态局部变量
一个BSS段,包含未初始化全局变量和未初始化静态局部变量
代码中的指针以及数据和BSS中的偏移量的重定位信息
一个符号表,包含非静态全局变量、函数名称及其属性
3,链接--将目标代码转换成二进制可执行文件
静态与动态链接
动态链接的主要优点是:
可减小每个aout文件的大小
许多执行程序可在内存中共享相同的库函数。修改库函数不需要重新编译源文件。
可执行文件
二进制可执行平面文件 仅包含可执行代码和初始化数据
a.out可执行文件
ELF可执行文件
a.out文件
文件头:包含a.out文件的加载信息和大小
tsize=代码段大小
dsize=包含初始化全局变量和初始化静态局部变量的数据段的大小
bsize=包含未初始化全局变量和未初始化静态局部变量的bss段的大小 totalsize=加载的aout文件的总大小
代码段
数据段
符号表
程序执行过程
读取a.out文件头,以确定所需的总内存大小。
sh从总大小中分配一个内存区给执行映像。
sh放弃放弃旧映像,开始执行新映像。
执行从crt0.o开始,调用main()。
程序终止
正常终止
异常终止
C语言中的函数调用
long jump
C语言程序与汇编代码的链接
gcc生成的汇编代码
入口代码
函数体代码
退出代码
链接库
静态链接库
动态链接库
makefile
make工具是一个程序,它按照顺序读取makefile,以自动有选择的执行编译链接。
一个make文件由一系列目标项、依赖项和规则组成
GDB调试工具
GDB调试工具是一个交互式调试工具,可以调试用C、C++和其他几种语言编写的程序。
在emacs IDE中使用GDB
GDB缓冲区
Gud-t:用户命令和GDB消息的GDB缓冲区。
t.c:显示执行进度的程序源代码。
栈帧:显示函数调用序列的栈帧。
本地寄存器:显示当前执行函数中的局部变量。
输入/输出:程序1/O。
断点:显示当前断点设置。
C语言结构体欸和指针
链表处理
二叉树
参考https://blog.csdn.net/chinesekobe/article/details/110874773?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166230209816782427432507%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166230209816782427432507&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-110874773-null-null.142v46pc_rank_34_default_23&utm_term=%E4%BA%8C%E5%8F%89%E6%A0%91&spm=1018.2226.3001.4187
二叉搜索树(BST)是具有以下性质的二叉树:
所有节点键值都不同,即该树不包含具有重复键值的节点节点的左子树只包含键值小于该节点键值的节点。
节点的右子树只包含键值大于该节点键值的节点。
左右子树也是二叉搜索树。
二叉树遍历算法
先序遍历
中序遍历
后序遍历
深度优先遍历
广度优先遍历