#2023-2024-1 20231408《计算机基础与程序设计》第六周学习总结

发布时间 2023-11-05 22:06:40作者: 20231408徐钰涵

作业信息

这个作业属于哪个课程 <2023-2024-1-计算机基础与程序设计>
这个作业要求在哪里 <2023-2024-1计算机基础与程序设计第六周作业>
这个作业的目标 < 《计算机科学概论》第七章,《C语言程序设计》第五章,上周测试题>
作业正文

教材学习内容总结

  • Polya的“如何解决它列表
  • 分治法及其思想的应用
  • 各种算法,有简单变量的算法,(包括带有选择的算法和带有循环的算法)复杂变量的算法(有数组和记录),搜索算法,(包括顺序搜索和二分检索),排序算法,(包含选择排序,冒泡排序和插入排序)和递归算法(包含以它为基础的快速排序)。其中快速排序和二分检索都用到了分治法的思想。
  • 几个思想:信息隐蔽,抽象,事物命名和测试。其中抽象和信息隐蔽就像一个硬币的两面,信息隐蔽是隐藏细节的做法,抽象则是隐藏细节后的结果

教材学习中的问题和解决过程

  • 问题1:没理解教材对平方根算法的讲解中为什么要测量差距的正负。
  • 问题1解决方法:经过上网搜查并再次思索,我认为可能是因为需要通过把差距赋给abs(即绝对值)变量来保证差距是正的。
  • 问题2:书上说大多数计算系统都有一个计时器,所以一直执行循环的程序不会真的一直运行下去。这是什么原理?
  • 问题2解决方法:我查到了一下资料

我们有时需要得到程序的运行时间,但我们也要知道,根本不可能精确测量某一个程序运行的确切时间­[3],文献[4]中说的很明白,现摘录如下。
我们平时常用的测量运行时间的方法并不是那么精确的,换句话说,想精确获取程序运行时间并不是那么容易的。也许你会想,程序不就是一条条指令么,每一条指令序列都有固定执行时间,为什么不好算?真实情况下,我们的计算机并不是只运行一个程序的,进程的切换,各种中断,共享的多用户,网络流量,高速缓存的访问,转移预测等,都会对计时产生影响。
文献[4]中还提到:对于进程调度来讲,花费的时间分为两部分,第一是计时器中断处理的时间,也就是当且仅当这个时间间隔的时候,操作系统会选择,是继续当前进程的执行还是切换到另外一个进程中去。第二是进程切换时间,当系统要从进程A切换到进程B时,它必须先进入内核模式将进程A的状态保存,然后恢复进程B的状态。因此,这个切换过程是有内核活动来消耗时间的。具体到进程的执行时间,这个时间也包括内核模式和用户模式两部分,模式之间的切换也是需要消耗时间,不过都算在进程执行时间中了。
那么有哪些方法能统计程序的运行时间呢?通过查找一些资料并结合自己的实践体会,摘录和总结了下面几种方法。
一、Linux的time命令
Linux系统下统计程序运行实践最简单直接的方法就是使用time命令,文献[1, 2]中详细介绍了time命令的用法。此命令的用途在于测量特定指令执行时所需消耗的时间及系统资源等资讯,在统计的时间结果中包含以下数据:
(1) 实际时间(real time):从命令行执行到运行终止的消逝时间;
(2) 用户CPU时间(user CPU time):命令执行完成花费的系统CPU时间,即命令在用户态中执行时间的总和;
(3) 系统CPU时间(system CPU time):命令执行完成花费的系统CPU时间,即命令在核心态中执行时间的总和。
其中,用户CPU时间和系统CPU时间之和为CPU时间,即命令占用CPU执行的时间总和。实际时间要大于CPU时间,因为Linux是多任务操作系统,往往在执行一条命令时,系统还要处理其他任务。另一个需要注意的问题是即使每次执行相同的命令,所花费的时间也不一定相同,因为其花费的时间与系统运行相关。
二、间隔计数[4]
上面介绍的time命令能测量特定进程执行时所消耗的时间,它是怎么做到的呢?
操作系统用计时器来记录每个进程使用的累计时间,原理很简单,计时器中断发生时,操作系统会在当前进程列表中寻找哪个进程是活动的,一旦发现进程A正在运行立马就给进程A的计数值增加计时器的时间间隔(这也是引起较大误差的原因)。当然不是统一增加的,还要确定这个进程是在用户空间活动还是在内核空间活动,如果是用户模式,就增加用户时间,如果是内核模式,就增加系统时间。这种方法的原理虽然简单但不精确。如果一个进程的运行时间很短,短到和系统的计时器间隔一个数量级,用这种方法测出来的结果必然是不够精确的,头尾都有误差。不过,如果程序的时间足够长,这种误差有时能够相互弥补,一些被高估一些被低估,平均下来刚好。从理论上很难分析这个误差的值,所以一般只有程序达到秒的数量级时用这种方法测试程序时间才有意义。
这种方法最大的优点是它的准确性不是非常依赖于系统负载。
实现方法之一就是上面介绍的time命令,之二是使用tms结构体和times函数。

从这段高深的话中我大致明白了计算系统的计时器功能是用一些特定命令实现的,它们能计算各个线程的运行时间。

上周考试错题总结


基础知识掌握不牢。

理解有误。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时 优秀
第一周 2/3 20/20 合格
第二周 20/20 1/4 15/35 终于理解了一些概念,能看懂一些话了
第三周 20/40 1/5 20/55
第四周 50 /90 2/7 20/75
第五周 80/170 1/8 30/105 会编写一些简单程序了
第六周 30/200 2/10 30/135 编程水平提升了