1、李 林 电子科技大学 计算机学院自我介绍姓名:李林专业:计算机系统结构学位:博士职称:副教授研究方向:操作系统及安全分布式计算计算机网络QoS自我介绍技术背景:熟悉windows内核程序设计熟悉windows API/MFC/ATL/WTL的应用开发熟悉Linux下基于API的应用开发熟悉Linux下网络应用程序开发熟悉Linux内核网络模块开发熟悉erlang应用开发Email:第一讲 前言教学目的课程主要内容及安排学习方法学习资料推荐编程环境介绍第一讲 前言教学目的课程主要内容及安排学习方法学习资料推荐编程环境介绍教学目的作为程序员,为什么要学习Linux程序设计?计算机网络越来越普及,带
2、来了巨大的经济效益单机版程序越来越弱化,各种应用将放置于云端(桌面应用web化、web中心化、SaaS、云计算?)Linux是后台系统首选的操作系统7教学目的 Linux上的程序设计涉及到的内容很多:Shell编程各种Web后台技术:PHP,Python,Ruby.数据库技术:MySql,Oracle,Sybase.各类开发语言:erlang,scalarLinux内核程序设计底层的基于操作系统API的socket编程技术 本课程的关注点?从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台四个层次从程序员视角看计算机系统硬 件 设 备操作系统API层Shel
3、lC/C+库其他库或平台硬件工程师包括固件程序微码的编写从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台内核工程师包括驱动、各类内核模块开发从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台应用开发工程师基于API的程序开发从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台应用开发工程师使用各种库进行开发从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台应用程序开发从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台
4、应用程序开发本课程关注点从程序员视角看计算机系统硬 件 设 备操作系统API层ShellC/C+库其他库或平台应用程序开发本课程关注点理清学习思路教学目的本课程以Linux操作系统为基础,通过介绍该系统的API,使同学们掌握Linux系统调用的基本使用方法。同时,也希望通过本课程的教学,使同学们初步掌握按照当代程序设计思想灵活运用API的方法,以提高学生在Linux环境下进行程序开发的能力和水平。为此,本课程开发了一个面向对象的执行体类库什么是系统调用和库过去windows使用0 x2e号中断作为系统调用入口,而linux使用0 x80号。现在仍然可以使用0 x80示例1.10编译方法:需要安
5、装nasm#nasm f elf64 hello.asm#gcc-o hello hello.o调试:gdbdisass main/段名找到地址后,b*addrr什么是系统调用和库Intel提供了sysenter/sysexit指令,可以在long mode下运行,但是在AMD上这组指令无效。Intel不支持32位中使用syscall/sysret,但和AMD相同,在64位下支持所以,为了兼容性,在64位下使用syscall/sysret示例1.11什么是系统调用和库从某种意义上将,C库实际上是对系统调用的包裹。通常,把包裹之后的函数成为API示例1.12真正的入口点如何调试C库第一讲 前言教
6、学目的课程主要内容及安排学习方法学习资料推荐编程环境介绍课程主要内容及安排总学时:20学时教材Linux程序设计实践,李林 段翰聪 著,电子科技大学出版社参考资料UNIX环境高级编程,W.Richard Stevens,人民邮电出版社考核方式考查(平时作业)有问题、错误时,随时打断提问课程主要内容 操作系统程序设计所涉及的内容过多,不可能面面俱到,只能讨论重点内容 如何组织重点内容?本课程将讨论如何设计、实现一个执行体模型的程序库,并以此为线索,覆盖重点内容 执行体模型程序库面向对象的类库封装了基本的执行体:线程、进程封装了执行体常见的创建方式、同步方式、通信方式https:/ 49周,将开设
7、Linux环境高级编程实验一课 主要内容包括:高级编程环境学习(vi的高级使用,make的使用、gdb的使用、测试驱动工具googletest使用)序列化模型实现基本网络程序框架实现通用插件框架实现第一讲 前言教学目的课程主要内容及安排学习方法学习资料推荐编程环境介绍同学们存在的普遍问题 各方的反馈意见:一些基础性的,或者核心的知识点没有吃透语言方面this指针、虚表、成员函数和一般函数异同局部对象如何影响性能在基类析构函数中调用虚函数有什么效果操作系统方面什么是进程上下文编译方面什么是编译单元、为什么会有重定义算法方面为什么时间复杂度一样的两个算法,实际执行时间会有数量级差异数据库方面怎样写
8、sql语句,才会高效 缺乏一种适合于计算机软件系统的学习方法总体的学习方法系统观 总体思想“少”量的知识+“猜测、实证、构建”=系统观高级语言底层物理模型软件架构核心课程及课程设计猜测、实证、构建站在处理器的角度,利用反汇编技术,理解使用C/C+所编写的程序的执行细节站在软件设计的角度,利用C/C+所蕴含的程序设计思想,理解架构的设计方法总体的学习方法系统观从高级语言到底层物理模型从高级语言到软件架构总体的学习方法系统观从高级语言到底层物理模型从高级语言到软件架构总体的学习方法系统观为什么高级语言到底层物理模型这么重要?问题1:struct stru1 char a;short I;请问str
9、u1的大小(Size)是多少?对齐什么是对齐?为什么要对齐总体的学习方法系统观问题2:long*p;int main()addr();loop();void addr()long k;k=0;p=&k;void loop()long i,j;j=0;for(i=0;i10;i+)(*p)-;j+;printf(“%dn”,i);总体的学习方法系统观问题3:int main()int i;int a10;for(i=0;i=10;+i)ai=0;printf(“%dn”,i);exit(0);总体的学习方法系统观问题4:void main()int*i;allocateInt(i);printf
10、(“*i=%d”,*i);void allocateInt(int*i)i=(int*)malloc(sizeof(int);*i=3;总体的学习方法系统观问题5:f和g谁快?int _tmain(int argc,_TCHAR*argv)DWORD t1 =:GetTickCount();for(int i=0;iNUM;i+)f();DWORD t2 =:GetTickCount();printf(%dn,t2-t1);DWORD t3 =:GetTickCount();for(int i=0;iNUM;i+)g();DWORD t4 =:GetTickCount();printf(%dn
11、,t4-t3);return 0;答案:f快。cache的作用void f()int aNN;for(int i=0;iN;i+)for(int j=0;jN;j+)aij=0;void g()int aNN;for(int i=0;iN;i+)for(int j=0;j 0)b=1;elseb=2;答案:右边效率高提示:CPU流水线分支预测int a=-5;int b=0;.if(a=0)b=2;elseb=1;总体的学习方法系统观同样是局部性原理:当CPU执行某条机器指令时(同样存储在内存中),很大的概率会执行该条指令下面的几条指令流水线技术会提前为这几条将要执行的指令,做好准备工作。(执
12、行这几条指令的几个阶段:如从内存中取指令、译码、准备操作数等等)当遇到条件跳转指令时,有可能提前做的准备是无用功跳转发生了,很影响效率静态分支预测:若跳转是向下的,则预测为不跳转(多为if类语句);若跳转是向上的,则预测为跳转(多为循环语句)通常,大概率发生的分支,放在if分支中,不要放在else分支中总体的学习方法系统观问题7:缓存是提高运行速度的不二法宝比如寄存器是最快的一级缓存、二级缓存次之内存SSD一般磁盘将要用的文件全部缓存到内存,一定会提高访问速度吗?为什么?页面的换入换出Windows进程的线性地址空间、映射、物理地址总体的学习方法系统观问题8:多线程一定具有比单线程更高的并发性
13、吗?为什么?考虑多线程的网络服务器模型当有客户请求到达时,就创建一个线程,让其为客户服务客户感受到的时间开销包括:创建线程的时间、完成客户请求的时间、线程销毁的时间、线程切换的时间若采用单线程模型,即只有一个线程,客户感受到的时间包括:完成客户请求的时间、在队列中排队等待的时间若完成客户请求的速度很快,快于客户到达的速度,那么就没有了排队的时间,显然比多线程快实际上只要排队的时间Add(5);当增加带权重加法器时,并不需要修改func的代码加法器例子版本4:基于接口的思想需要实现一个加法器:在这个加法器中,已经保存了被加数;现在需要传递加数给这个加法器,以让其返回加法计算结果。普通加法器的被加
14、数,必须是非负的整数,而带权重的加法器的被加数,没有任何限制思路:定义一个加法接口的抽象类,然后让普通加法器和带权重的加法器从这个抽象类派生代码1.7加法器例子版本4与版本3的比较版本4和版本3都实现了数据和操纵数据的方法的封装当引入带权重的加法器时,版本4和版本3都能做到代码的封闭性,即能封装这一变化点但当限制普通加法器被加数为非负时,版本3无法应对,而版本4可以封装这一变化点。为什么?版本4的耦合度小于版本3继承是一种强耦合的关系,耦合于基类的接口、耦合于基类的实现加法器例子加法器的架构版本4虽然也是继承,但ILAdder只是一个抽象类,只定义了接口,没有实现显然版本4的耦合度小于版本3另
15、一种说法:架构设计就是一个解耦的过程加法器例子版本5:基于接口的思想的模板实现没有虚函数,静态的多态代码1.8如何增加新的加法器?对于模板代码,模板参数演绎是比较好的阅读方法版本6:面向方面的思想靠增加基类来扩展加法器,而不是增加派生类扩展加法器代码1.9如何增加新的加法器?加法器例子何为方面?CLNormalImpl、CLWeightingImpl,以及以后可能新增的CL*Impl,实际上代表了如何进行加法运算这一方面的问题,是对加法运算的抽象假设现在需要在加法运算之前,对加法器进行安全性检查,而检查的方法又多种多样。安全性检查就代表了加法器另一方面的问题。这样一来加法器就需要两个模板参数,
16、一个代表如何进行加法运算的抽象,另一个代表如何进行安全性检查的抽象加法器的小结结构化思想实现的加法器,没有做到封装,也不能容纳变化点;基于对象的方法进了一步,它所实现的加法器做到了封装,但没有容纳变化点;而面向对象方法所实现的加法器,则做到了上述两点;基于接口的设计方法,则更进了一步,不仅实现了变化点的封装,还降低了代码的耦合度,提高了扩展性。另外,本节也给出了两种基于模板的加法器实现。它们与前面提到的几种方法孰优孰劣,则是仁者见仁智者见智了,不同的场景可能会有不同的答案。总体的学习方法系统观 两层映射的重要性高级语言底层物理模型软件架构核心课程及课程设计猜测、实证、构建第一讲 前言教学目的课
17、程主要内容及安排学习方法学习资料推荐编程环境介绍学习资料推荐学习中的困惑漫无目的、缺乏指导,不知道该怎么样学习基本的方法看书实践方向不明确72学习资料推荐 高度重视语言的学习学好C和C+,暂时不要盲目学Java等语言,限制今后的技术道路C和C+程序贴近机器(大多数操作系统都是基于C的)、高性能,将使你更能深入理解计算机系统和算法,在技术道路上走得更远语言的学习不仅仅是语法的学习,最主要的是其背后蕴藏的程序设计思想、软件架构思想的学习要知道这些思想的来龙去脉到了一定程度后,保持每年都能学种新语言,为什么?(有些思想是某种语言特有的)73书籍推荐(假定有基本C基础)深入理解计算机系统 C学习C陷阱
18、与缺陷C和指针 基本C+学习Essential C+Effective C+More Effective C+C+沉思录中面向对象的部分设计模式精解 深入C+学习深度探索C+对象模型74书籍推荐(假定有基本C基础)模版学习C+Template:Complete GuideModern C+Design 模版库学习C+标准程序库Effective STLSTL源码剖析 C+学习收工Exceptional C+More Exceptional C+C算法卷一、卷二75学习资料推荐 语言到了一定程度,可以进行系统的学习 建议首先学习Windows操作系统Windows比Linux先进(内核结构,线程
19、)学习windows能尽快熟悉先进的软件架构(各种架构库,天生的消息循环观察者)76Windows学习书籍推荐 WindowsAPI学习Programming windows(上下册)Windows核心编程 MFC学习MFC基本使用的学习深入浅出MFC COM学习COM原理与应用ATL Internals77学习资料推荐 之后,可进行Linux系统的学习 Linux系统操作鸟哥的Linux私房菜:基础学习篇鸟哥的Linux私房菜:服务器架设篇 Linux系统APIUnix环境高级编程Unix网络编程卷一、卷二C+网络编程卷1、卷2ACE程序员指南学习资料推荐Linux内核学习一定要先学Linu
20、x设备驱动编程学习内核源代码Linux内核完全剖析基于0.12内核学习内核源代码,要有方向性。文件系统网络系统79学习资料推荐 在linux内核学习到一定程度后,可深入学习操作系统80X86汇编语言程序设计教程自己动手写操作系统(第二版:oranges 一个操作系统的实现)此时,可根据需要选择性的学习.NET、Java等平台第一讲 前言教学目的课程主要内容及安排学习方法学习资料推荐编程环境介绍Linux操作系统的安装本课程代码的运行环境是Ubuntu,64位虚拟机中安装Linux系统远程登录到Linux服务器直接安装Linux系统虚拟机中安装Linux在Windows操作系统中,安装虚拟机软件
21、VMware在VMware中安装Linux操作系统无需磁盘分区,可边使用Windows,边使用Linux虚拟机中安装Linux虚拟机中安装Linux远程登录到Linux服务器使用telnet、SecureCRT等登录到远程Linux服务器无需进行磁盘分区,对原有系统无影响必须要有Linux服务器不能独占使用,可能存在干扰远程登录到Linux服务器直接安装Linux推荐直接磁盘分区安装Linux更快熟悉Linux系统的操作,为什么?对计算机硬件要求低(虚拟机内存要求高)也不要求远程服务器环境(远程登录)可方便使用集成开发环境(类似于VC开发环境)推荐安装Ubuntu强大的软件包管理工具APT,负
22、责下载安装软件,并维护软件包之间的依赖关系Ubuntu桌面版、服务器版应用比较广泛Ubuntu功能强大,使用方便(边学习边娱乐)安装方法Windows与Linux共存选择一个Windows非主分区,备份文件,删除该分区在该分区中安装Linux安装过程中,除了创建ext2或ext3文件系统分区外,还要创建swap交换分区加入学校软件源APT从预选设置好的软件源下载软件包学校提供了高速的软件下载源在/etc/apt/sources.list开头处加入学校提供的软件源http:/展示90g+的使用 Ubuntu默认没有安装编译环境#apt-get install build-essential g+
23、的基本用法#g+test.cpp#g+-o test test.cpp#g+-c test.cpp 生成目标文件test.o#g+-o test test.cpp g#g+-O-o test test.cpp 优化91g+的使用 g+的基本用法#g+-S test.cpp 产生汇编代码test.s#g+-E test.cpp my.txt 只激活预处理,将结果保存在my.txt中#g+-I./gtest/include test.cpp 指定头文件路径#g+-L./gtest-lgtest test.cpp 指定库的路径#g+test.cpp DOK=2 设宏OK为2#g+test.cpp DOK 定义宏OK第一讲 前言教学目的课程主要内容及安排学习方法学习资料推荐编程环境介绍