期末总结
本学期内容按老师要求用途可以分为三大类:
学以致用类,考试篇
因材施教类,实践篇
学有余力类,拓展篇
第一篇,千锤百炼之题中乾坤
前1-6章合集:
man -k 填空:Linux下,检索配置(configure)网卡(网络接口:interface)的命令是(man -k config| grep interface 或ifconfig也算对)
cheat 填空:完成“Display files, sorted by size”功能的ls 命令是(ls -S)
grep 判断: open(2)中的flag O_RDWR == O_RDONLY |O_WRONLY. (x)
vi 填空:vim中,查看printf(1)和printf(3) 帮助文档的命令分别是( )
gcc 填空:gcc中 指定静态库或共享库所在路径位置的选项是(-L)
gdb 填空:想跟踪显示变量x 每一步的变化值的情况的命令是(disiplay x or disp x)
CH01填空:计算机系统中的所有信息都是位串表示的,所谓信息就是(位+上下文)。
CH01填空:操作系统中最基本的四个抽象是(虚拟机、进程、虚拟存储器、文件)。
CH03 填空:在64位机器上,要用gcc编译出32位机器码,需要使用(-m32) 选项
CH03 填空:对于机器级编程来说,两种重要的抽象是(ISA,虚拟地址)
CH03 填空:Linux中,对目标代码code.o进行反汇编的命令是(objdump -d code.o)
CH03 填空:IA32指令中,操作数的三种类型是(立即数、寄存器、存储器)
CH03 选择:栈用来(ABCD) A 传递参数 B 存储返回信息 C保存寄存器 D本地存储。
CH06 填空:根据携带信号不同,总线可分为(数据总线、地址总线、控制总线)三种。
CH06 填空:存储层次结构的中心思想是(上层作为下层的缓存)。
CH06 填空:空缓存的不命中叫(强制性不命中或冷不命中)
CH07 选择:Linux中,反汇编.text节中的二进制指令使用的工具是(d)A ar B strings C readelf D objdump
前6-12章:
判断:man -k 功能等价于 apropos(1) . (ok)
判断:man -f 功能等价于whatis(1). (ok)
CH10 填空:标准错误的文件描述符是(2)
CH10 判断:O_RDWR == O_RDONLY|O_WRONLY. (x)
CH10 填空:umask(1) 用来(查看、设置新文件的默认访问权限)
CH10 填空:写文件使用( write(2))系统调用
CH10 填空:(RIO)包提供了方便、健壮和高效的I/O.
CH10 填空:应用程序通过调用(stat(2)和fstat(2))检索文件信息(元数据)。
CH10 填空:Linux内核使用三个数据结构来表示打开的文件(描述符表,文件表,v-node表)
CH10 判断: ls > foo.txt 是输出重定向。(ok)
CH10 判断:类型为FILE的流是对文件描述符和流缓冲区的抽象。(ok)
CH08 判断: 异常是异常控制流的一种形式、是由硬件和操作系统一起实现的。(ok)
CH08 填空:处理异常的操作系统子程序叫(异常处理程序,exception handler)
CH08 填空:异常是由唯一(异常号)标识的,它是一个非负整数。
CH08 填空:异常表的起始地址放在(异常表基址寄存器)寄存器中。
CH08 填空:陷阱主要用来给用户程序提供接口,接口叫(系统调用 )
CH08 填空:stat的系统调用号是(106)
CH08 填空:IA32 汇编中,系统调用号放在(%EAX )寄存器中。
CH08 填空: IA32中,系统调用是通过(int n)的陷阱指令提供的。
CH08 选择:从程序员角度看进程状态有(ACD) A运行 B就绪 C停止 D终止
CH08 填空: execvc 中argv 指针数组必须以(null)结尾。
CH08 填空:传送一个信号包含两个步骤(发送信号、接收信号)
CH08 填空: 信号处理函数有signal 和 (sigaction)
CH11 填空:网络应用程序都是基于客户端-服务器模型的,一般有一个( 服务器 )进程。
CH11 填空:客户端-服务器模型中的基本操作是(事务 )。
CH11 判断:客户端-服务器模型中客户端和服务器都是指进程、不是指机器、主机。( ok )
CH11 填空:互联网的精髓,(封装)是关键。
CH11 填空:客户端和服务器运行在不同主机上,通过(计算机网络)的硬件和软件资源来通信。
CH12 填空:和进程中fork 等价的线程函数是(pthread_create )
CH12 填空:和进程中exit 等价的线程函数是(pthread_exit )
CH12 填空:和getpid等价的线程函数是(pthread_self)
CH12 填空:可以调用(pthread_cancel)函数终止另外一个对等线程。
CH12 填空:可以调用(pthread_join)函数等待其他线程终止。
CH12 填空:两个经典的同步问题是(生产者-消费者,读者-写者)问题。
CH12 填空:四类线程不安全的函数有(不保护共享变量的函数、保持跨越多个调用的状态的函数、返回指向静态变量的指针的函数、调用线程不安全函数的函数)
CH12 判断:可以使用互斥锁加锁顺序规则避免死锁。(ok)
第二篇,实践是检验真理的唯一标准
linux操作系统:
详见参考:
如果使用GUI,Linux和Windows没有什么区别。Linux学习应用的一个特点是通过命令行进行使用。
如ls命令,ls
或ls .
显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略。我们可以用ls -a .
显示当前目录中的所有内容,包括隐藏文件和目录。其中“-a” 就是选项,改变了显示的内容
1. 课程资料:https://www.shiyanlou.com/courses/413
2. Linux 基础入门:https://www.shiyanlou.com/courses/1
正则表达式:
基本符号表示:
1 特殊符号,表示后面的字符本身
2 [ ] 匹配其中任意字符,但每次匹配只匹配一个
3 [^ ] 匹配除其中的任意字符,每次匹配只匹配一个
4 {n} 次数修饰,重复n次,(?为0或者1次,+为1到无穷,*为0到无穷)
5 ^ 从字符串开始的地方匹配
6 $ 从字符串结束的地方匹配
7 | 可以匹配左或者右
常用消除汇编“.”语句:g/.d
C语言基础:
头文件#include<>为加载提供可执行文件
详见百度及搜狗,知乎(以下仅供参考)
http://wenku.baidu.com/view/eafa5a5f312b3169a451a429.html
http://wenwen.sogou.com/z/q138846880.htm
main()为运行提供通用入口
工具基础:
1 vim:
1 在vi中,查看scanf和printf man pages(帮助文档)的命令分别是:K 3K 2 编译和运行以上代码的命令gcc *.c -o main ;./main
操作格式:(1)vim xxx (2):wq 保存,退出 (3)dd 2d 3d 删除 (4)p 复制 ,y粘贴 v可以编辑视图
2 GCC:编译工具
基本参数:
-c 只编译不链接,生成目标文件.o -S 只编译不汇编,生成汇编代码 -E 只进行预编译,不做其他处理 -g 在可执行程序中包含标准调试信息 -o file 将file文件指定为输出文件
格式:gcc -x xxx
3 GDB:gcc -g 编译成GDB可调用文件
1 使用GDB调试以上代码:编译代码的命令是?main.c中如何给main函数设置断点?如何在第六行设置断点? gcc -g *.c -o main b main b 6
2 基本操作: info b 查看断点情况 run 开始运行程序 bt 打印函数调用堆栈 p 查看变量值 c 从当前断点继续运行到下一个断点 n 单步运行(不进入) s 单步运行(进入) quit 退出GDB
4 静态/动态库以及make makefile:
1 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a? gcc -c add.c sub.c mul.c div.c ar rcvs libmymath.a add.o sub.o mul.o div.o
gcc main.c -o main -L. -lmymath (or gcc main.c ./libmymath.a -o main)
2 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so? gcc -fPIC -c add.c sub.c mul.c div.c gcc -shared -o libmymath.so add.o sub.o mul.o div.o
gcc -o main main.c -L. -lmymath
libmymath.so 要拷贝到/lib or /usr/lib
3 编译上面代码的makefile,编译出来的目标文件为testmymath(GCC前加tab)
testmymath: main.o add.o sub.o mul.o div.o gcc main.o add.o sub.o mul.o div.o -o testmymath main.o: main.c head.h gcc -c main.c add.o: add.c head.h gcc -c add.c sub.o: sub.c head.h gcc -c sub.c mul.o: mul.c head.h gcc -c mul.c div.o: div.c head.h gcc -c div.c
堆栈结构:
栈帧:为单个过程分配的那部分栈称为栈帧
两个指针:
寄存器%ebp-帧指针
寄存器%esp-栈指针
栈指针可移动,所以信息访问多相对于帧指针。
堆栈的先进先出以及了解跳转运算流程(详见第三章家庭作业)
linux下基本命令的C版本以及进程函数等:
提供多种C版本的函数实现的基本命令功能,大致为
基本命令:ls等
管道方式,grep等
进程调用:fork等
详见各章实践
第三篇,没有最好只有更好
老师三种知识理论:软,硬知识,元知识
老师传达的主要思想:活到老学到老,读书不能停,博客不能丢
老师概括的主要内容:深入了解计算机系统,何为内存,何为进程,何为系统
家庭作业:详见家庭作业汇总 http://www.cnblogs.com/chuishi/p/4984171.html
智能小车:详见智能小车汇总 http://www.cnblogs.com/chuishi/p/4948580.html
汇总链接:
学习笔记汇总:
http://www.cnblogs.com/chuishi/p/4927575.html
实验汇总:
实验5:http://www.cnblogs.com/chuishi/p/5023913.html
实验4:http://www.cnblogs.com/chuishi/p/5023909.html
实验3 http://www.cnblogs.com/chuishi/p/5023909.html
实验2 http://www.cnblogs.com/chuishi/p/4985992.html
实验1 http://www.cnblogs.com/chuishi/p/4966656.html
家庭作业汇总:
http://www.cnblogs.com/chuishi/p/4984171.html
实践链接:
http://www.cnblogs.com/chuishi/p/4948580.html
总结:
通过本学期的不断学习,深入了解计算机系统这本在原来曾经是不可能的神话现如今也已被收入囊中,只是可惜,其中的知识没能很好的消化并加以运用,这在以后的学习与生活中会不断地去完善,通过老师独特的教学方式确实在一定的程度上调动了学生的积极性,在学期开始阶段,由于各种原因没能很好地认识到这一点,在学习上无作为地被动学习没能很好地跟上步伐,老师的话确实对,今天落下的,明天就得补回来,知识是靠积累的,生命不息,学习不止,谢谢老师这一学期的教诲,实在受益匪浅。