一、gdb部分基础知识
1、打断点
放一下全部代码
int Add(int n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
sum += i;
}
return sum;
}
int main()
{
int n = 100;
int m = 0;
m = Add(n);
printf("m:%d\n", m);
return 0;
}
用b打断点也可以标明文件名和函数名来打。
断点会出现在15行,因为实际上函数是在15行开始执行的。
也可以冒号后面跟行号。
退出的时候quit即可,如果正在调试,会问操作者是否退出。
断点删除时,d breakpoints就可以删除全部断点。
2、逐语句过程
在vs中,有逐语句和逐过程两个功能。在linux中,next是逐过程
如图,在17行打了一个断点,到这里停下后,按next就会直接运行完ADD函数,来到18行,再按next,就会来到19行。可以简写为n。
在17行打一个断点,按r运行后,来到17行,s键就会进入函数,并且显示出来传入的数据。如果想要查看调用的信息,bt即可。
n和s,我们就可以想象vs的功能实现,一次次按s,就会一个个往下走,也可以按回车来代替按n或者s。
3、监视,内存
int Add(int n)
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
sum += i;
}
return sum;
}
int main()
{
int n = 100;
int m = 0;
m = Add(n);
printf("m:%d\n", m);
return 0;
}
Linux中,p 后面跟要查询的东西即可。比如p sum,就可以看到当前sum的值。vs可以实时看到每个变量的值的变化,Linux也可以。
display 跟查看的内容,那么程序每次前进的时候就会实时展示值的变化,常显示指令。查看的内容包含内置类型,结构体等自定义类型。
想要取消的话,undisplay 编号。
4、部分功能指令
在Linux中,有个特别的功能,它支持只运行到某一个指定的行,until后面跟行号,程序就会运行到这一行,在这一行之前应形成的变量也会展示出来。
如果只想运行一个函数,那么在进入这个函数后,finish即可执行完整个函数,但是不会继续走,执行完就停。
这里运行完函数就出来了,还在17行。
如果从一个断点处直接运行到下一个断点处,continue,简写c即可。
遍历一个循环时,想快速结束时,可以设置其中的变量的值,比如i <= 100,那么可以设置i = 100,再运行,循环就结束了。set var。
二、进程概念的初级理解
1、冯-诺依曼体系结构
看一个形象的图
结构中有输入/出设备,内存,CPU。输入/出设备统称外部设备,简称外设。
输入和输出设备是必要的,键盘敲入的符号,显示器可以显示出来。我们都知道给到电脑的信息,也就是输入设备中提取到信息,电脑会在CPU里计算,然后再给到输出设备里去显示,那么这个内存在中间有什么用处?
输入/出设备和CPU的速率是有很大差距的,如果只存在这三个,那么电脑整体的运算速率就不会很快,被输入/出设备拖累了。所以为了能够提升整体的速率,就有了内存这个中间物体。内存的速度相对于输入/出设备是快的,但又慢于CPU;在冯-诺依曼结构中,输入设备把信息给到内存,CPU从内存中拿到信息,经过运算后,再返还给内存,输出设备从内存中拿到数据,再显示出来。
经过这样的过程,在数据层面,CPU只从内存中获取信息,而不和外设沟通。
这样的结构确实大大提升了运算速率。但是可能会发现一个问题,为什么不在CPU里弄一个中间设备,这样不是更快吗?因为CPU里搞存储太贵了,内存尚且有高价,但内存作为商品普及,民用是没有问题的,如果是CPU里的存储设备,价格高得多,普通人不敢多做换存储的打算,这种内存的普及就很困难,进而影响计算机的普及。
有了内存,当输入数据的时候,就会放到内存进行预加载,然后再给到CPU去运算。这也就是为什么形成的可执行文件会先写到内存中,然后我们./ + 文件名的时候就会从内存中拿到文件,直接运算。
基于这种硬件结构,数据是如何流动的?
比如A和B聊天,A给B发信息,这时候我们从手机键盘输入字,输入设备得到了数据,然后给到内存,内存预加载一下,CPU从内存里拿过来计算,然后给到内存,内存再给到输出设备,也就是屏幕;点击发送后,信息给到了网卡,B从网卡那里得到数据,这时候网卡也就是B的输入设备,然后再重复这一套流程,最终B的屏幕上显示出A发来了消息。
我们可以发现,外设只和内存沟通。
在冯-诺依曼结构基础上,进程也是这样流通,在内存中加载,然后给CPU运算,CPU再还给内存,但进程有自己的方式,本篇并不说这个。
冯-诺依曼结构是一个硬件结构,接下来看操作系统这个软件结构。
2、操作系统的初级理解
操作系统本质上是一个进行软硬件资源管理的软件。
硬件结构有了,我们如何能很好地利用硬件?这也就是操作系统存在的意义,正如片上系统一样,除了有精密的硬件,也要有合理的系统。
我们暂且分成三部分,操作系统,硬件驱动,软硬件。操作系统通过驱动来管理硬件和软件。驱动激活软硬件后,计算机才能正常使用,这也就是操作系统的管理方式。软硬件上传自己的数据给驱动,驱动再给到操作系统,操作系统有自己的方法去把所有的数据整理成特定的数据结构,以此来更高效地管理数据。
上面所写的是操作系统对软硬件进行管理的方式。操作系统之所以要管理软硬件资源是因为要给用户提供更好的执行环境。虽然给用户提供服务,但是操作系统不相信用户。用户想要使用操作系统的功能,就得按照系统规则来操作,这也就是系统调用。比如在Linux写C语言代码,Linux就会给用户C语言相关文件,环境等等,然后具体怎么给的,里面都是什么内容可不会展现给用户。系统有很多接口,连接着相应的功能,以及还有一个问题,就是如何更方便地使用接口。Linux中,我们看到的是命令行,但是如果不是程序员,Linux是绝对不会用的,所以也就出现了改变人类的发明——窗口化操作,windows。
从最一开始确定系统的作用,之后为了更好地给用户提供服务,系统逐步升级,才有了我们现在看到的熟知的操作系统。
结束。