admin管理员组文章数量:1602543
本文章是一篇记录性文章,讲解我在做实验过程中遇到的问题和方法,本人水平有限,如有影响读者学习、分数本人深表抱歉.
家人们 就是一个实验记录 别老是给我开盒啦
第1章前言
实验目的:通过学习相应查看计算机信息和在不同环境下用不同的方式运行和调试程序,了解计算机各项指标,为将来提高计算机性能,优化程序做铺垫。
测试机型:联想拯救者,win10系统,vmware软件-乌班图
第2章 实验环境建立
2.1 Windows下 hello程序的编辑与运行(5分)
截图:要求有Windows状态行,Visual Studio界面,源程序界面,运行结果界面。
下面有一个powershell 的终端选项 cd找出所在exe的位置 ,然后./文件名 学号 姓名就可以了
2.2 Linux下 hello程序的编辑与运行(5分)
截图:要求有Ubuntu的OS窗口,Codeblocks界面,源程序界面,运行结果界面。
由于我没有在linux安装中文输入法所以只能输入英文了
Linux下的命令
第3章 Windows 软硬件系统观察分析
3.1 查看计算机基本信息(2分)
运行Windows管理工具中的“系统信息”程序,查看CPU、物理内存、系统目录、启动设备、页面文件等信息,并截图 方法:直接在对话框中搜索系统信息
此电脑-右键属性
包括OS版本号、cpu类型与主频、内存、计算机名、OS的版本等
图3-1 Windows下计算机基本信息
3.2 设备管理器查看(2分)
按链接列出设备,找出所有的键盘鼠标设备。写出每一个设备的从根到叶节点的路径。
方法:搜索栏中搜说设备管理器
点击之后,再点击事件。
键盘同理
键盘:HID\VID_048D&PID_C101&Col02\7&3748edce&0&0001
鼠标:HID\hid&Col03\1&4784345&0&0002
3.3 隐藏分区与虚拟内存之分页文件查看(2分)
1. 我们在电脑桌面右击计算机,之后在列表中点击【管理】,如图。
2.选择磁盘管理 可以查看隐藏磁盘分区
写出计算机主硬盘的各隐藏分区的大小(MB):系统分区300MB
此电脑点击C盘,选择查看选项,再把隐藏的项目选项打勾。再点击最右侧的选项
打开之后点查看
取消红色笔的打勾。之后就会显示出pagefile.sys
右键文件-属性-查看内存大小 整完之后不要忘记恢复
写出pagefile.sys的文件大小(Byte):2.37 GB (2,550,136,832 字节)
还有一种方法是看高级系统设置
右键属性 打开电脑设置
高级系统设置-高级-设置
设置-高级 可以直接看到分页大小甚至可以更改 但要先把沟划掉
很多人不理解虚拟内存是什么,虚拟内存在物理上是一个文件,在逻辑上相当于内存,也就是说当真实的内存不够用时,会向磁盘借用一段空间来充当内存,Cpu和磁盘进行交换必须利用CPU。所以,在出厂的时候,开辟了100G的C盘存储空间,但是什么也没有存的时候显示磁盘占用2G原因是虚拟内存文件占用了2G的空间。
C盘根目录下其他隐藏的系统文件名字为: hiberfil.sys , swapfile.sys, DumpStack.log(我也不知道为啥有这三种)
3.4 任务管理与资源监视(2分)
查看方法:ctrl + shift + Esc打开任务管理器-详细信息 点击一下pid就会按升序/降序排列好
写出你的计算机的PID为“-”、最小与最大的3个任务的PID、名称、描述。
1.“-”:系统中断
2.“0”:最小: 系统空闲进程 最小任务是0
3.19216: Taskmgr.exe
3.5 CPUZ下的计算机硬件详细信息(2分)
方法1打开cmd,输入命令wmic memorychip(注意中间的空格)
方法2下载CPU-Z软件
看左下角Selection发现不能选择其他的选项说明只有一个CPU
方法3 win+r 输入cmd 再输入systeminfo
同时也可以看到虚拟内存等其他信息。
CPU个数: 1 物理核数: 8 逻辑处理器个数: 16 L3 Cache大小: 16MB
L3Cache代表三级Cache
图3-2 CPUZ下CPU的基本信息
参考文章如何查看cpu核数以及线程数_LuMaman的博客-CSDN博客
第4章 Linux软硬件系统观察分析(泰山服务器—个人电脑)
1.连接
题外话:虚拟机连接移动硬盘方法
发现无论是英文还是汉文还是日语都采用UTF8编码
top指令相当于windows下的任务管理器CPU存储器,swap
但是效果不如htop 需要自己安装一下,命令行安装是好使的Linux下htop 安装与使用_GYGY思密达的博客-CSDN博客_linux htop安装
但是这个安装完以后也不好使,于是采用他提示的方法安装
成功!! htop查看系统信息
各种查看各种复杂的控制
lscpu指令查看
linux系统把所有的硬件都按文件进行管理 也可以用命令 cat/proc/cpuinfo
也可以使用cat /proc/meminfo (注意空格一定要打对)
4.1 计算机硬件详细信息(3分)
CPU个数: 2 物理核数: 逻辑处理器个数: 4
MEM Total: 1921940kB Used: 976888kB Swap: 1941176kB
图4-1 Linux下计算机硬件详细信息截图
连上泰山服务器之后的信息
扩展一下查看磁盘信息的方法linux查看磁盘信息_码农先锋A的博客-CSDN博客_linux查看磁盘信息
查看CPU核数:
cat /proc/cpuinfo
4.2 任务管理与资源监视(2分)
写出Linux下的PID最小的两个任务的PID、名称(Command)。
1.PID=1:/sbin/init
2.PID=1405:/lib/systemd/systemd-journald
下载和使用htop工具
4.3 磁盘任务管理与资源监视(3分)
1. /dev/sda 设备的大小_________1.9*1024___________GB,类型___SAS____(AL15SEB120N)____
sda没找到wwwww
2. Units_____512 bytes_______Sector Size_______512bytes/512bytes_____
units单元 sectot size扇区大小老铁们 我只能在本地看了,泰山服务器没有权限啊wwww
4.4 Linux下网络系统信息(2分)
写出机器正联网用的网卡IPv4地址:___192.168.250.1_____________
mac地址:______________02:42:d8:d2:43:5f_________________
查看IVP4 我不理解为啥大家用的都是下面这个图
Linux下mac地址怎么查询? - 琴策网 (bufeishi)
可能是这俩吧wwww
图4-2 Linux下网络系统信息
第5章 Linux下的showbyte程序(10分)
5.1 源程序提交(8分)
showbyte.c与实验报告放在一个压缩包里
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp =NULL;
fp= fopen("hello.c","r");
int size;
if( fp == NULL)
return 0;
else
{
fseek(fp,0,SEEK_END);
size = ftell(fp);
rewind(fp);
char *buf = malloc(size*sizeof(char));
fread(buf,size,1,fp);
fclose(fp);
int asc[size];
for (int i = 0; i < size; ++i) {
asc[i]=buf[i];
}
int count= 0;
int j=0;
for (int i = 0; i < size; ++i) {
if(asc[i] ==10)
{
printf("\\n\t");
}
else if(asc[i]==9)
{
printf("\\t\t");
}
else if(asc[i]==32)
{
printf(" \t");
}
else
{
printf("%c\t", asc[i]);
}
count++;
if(count%16 ==0) {
int count1 = 0;
printf("\n");
for(j;j<size;j++)
{
printf("%d\t",asc[j]);
count1++;
if(count1%16 ==0)
{
printf("\n");
break;
}
}
j++;
}
else if(count ==size)
{
printf("\n");
for(j;j<size;j++) {
printf("%d\t", asc[j]);
}
}
}
}
}
5.2 运行结果比较(2分)
直接输入指令就行
运行od -Ax -tcx1 hello.c 以及showbyte.c,结果截图。
图5-1 OD和利用hexdump的输出结果
想要在终端上运行showbyte.c需要有管理员权限,方法
1.打开终端 cd到所要运行文件的目录
2.命令行输入su获得管理员权限,很多人第一次打开的时候明明输入了正确的密码,但是始终不能识别,这就需要设立一个密码,具体方法见这个博客 ,这篇博客告诉我们如何设置密码和在管理员和用户身份进行切换
3.接着第一步cd到文件夹之后,su一下,然后输入 chmod 777 showbyte.c(文件可能名字不一样以实际为准) 我们尝试一下./showbyte.c发现不能运行,会报错 但是我们文件的语法好像没有错误,我们来分析一下原因
chmod命令原理及用法详解_lyy14011305的博客-CSDN博客_g+rw
chmod命令详细用法_IChen.的博客-CSDN博客_chmod
因为它把这个当bash脚本读了,先编译,不要要直接运行.c文件。仔细想想chmod是干什么的。
正确的过程如下图所示:
1接着第一步cd到文件夹之后,su一下,然后输入 chmod 777 showbyte.c(文件可能名字不一样以实际为准)
2.ls一下看原来的文件是啥
3.gcc showbyte.c进行编译 再ls一下看多出的文件是啥
4.运行多出来那个文件 ./a.out就能显示如图的结果
图5-2 showbyte的输出结果
第6章 程序的生成 Cpp、Gcc、As、ld
6.1 请提交每步生成的文件(10分)
hello.i hello.s hello.o hello.out (附上hello.c)
cd操作的要点:
1.cd ..(中间一定要加空格 cd 是命令 .. 是上级目录)返回上一级目录
2.cd /(一定加空格)是返回根目录 怎么判断返回的是根目录:ls一下看文件是啥
按指导PPT的一下子找到出错了 结果发现中间的版本是11不是8,方法一层层的cd然后再 ls看下一个的文件夹是啥,通过这种方法我发现是8而不是11
到达了最后一站 发现不同的颜色 绿色代表是文件 浅蓝色代表动态库 深蓝色不知道是啥哈哈
记录下这个路径 我的电脑是
第7章 计算机数据类型的本质
7.1 运行sizeof.c填表(5分)
Win/VS/x86 | Win/VS/x64 | Linux/M32 | Linux/M64 | |
char | 1 | 1 | 1 | 1 |
short | 2 | 2 | 2 | 2 |
int | 4 | 4 | 4 | 4 |
long | 4 | 4 | 4 | 8 |
long long | 8 | 8 | 8 | 8 |
float | 4 | 4 | 4 | 4 |
double | 8 | 8 | 8 | 8 |
long double | 8 | 8 | 12 | 16 |
指针 | 4 | 8 | 4 | 8 |
7.2 请提交源程序文件sizeof.c(5分)
#include <stdio.h>
int main() {
printf("int %ld\n", sizeof(int));
printf("float %ld\n", sizeof(float));
printf("double %ld\n", sizeof(double));
printf("short %ld\n", sizeof(short));
printf("char %ld\n", sizeof(char));
printf("long %ld\n", sizeof(long));
printf("long long %ld\n", sizeof(long long));
printf("long double %ld\n", sizeof(long double));
printf("int* %ld\n", sizeof(int *));
}
Linux32和64位运行方法
具体的细节见我前一篇讲解CSAPP学习笔记---第二章 位数字及其表示开篇_卑鄙的我@v@的博客-CSDN博客
第8章 程序运行分析
8.1 sum的分析(10分)
1.截图说明运行结果,并原因分析。
函数的第二个参数len的类型为无符号整数,后面的for循环中使用i<=len-1作为循环终止条件,在这个比较中所有数都将转为无符号数,而当len参数传入0时,0-1将得到最大的无符号数,只有当i等于最大的无符号数时才能终止循环,使程序出现异常。
2.论述改进方法
将循环终止条件从i<=len-1改为i<len。
或者直接姜参数len的类型改成Int,这样就不会发生隐式转换。另外一方面需要增加一个判断条件,当len的长度大于a[]的长度时,要结束循环。
8.2 float的分析(10分)
1.运行结果截图,分析产生原因。
先下载中文输入法
注意 安装的时候一定要在一个文件夹
搜狗输入法linux-安装指导
中间一定要注意空格
计算机存储浮点数的精度有限,只能表示某些值,而其他的值则不能准确表示,只能通过舍入的方式转化成可以表示的值。越原离0能表示的精度越低,越靠近0能表示的精度越高。
2. 论述编程中浮点数比较、汇总统计等应如何正确编程。
浮点数比较时应该在可接受的精度误差范围内比较,可以使用做差结果在某个范围内来表示相等。
8.3程序优化(20分)
- 截图说明运行结果,分析问题产生原因。
问题产生原因:计算 f (100)/ f (101)时,两个数都太大了,哪怕使用 long long 类型都不能正确表示,会发生溢出,因此将两个数转化为 double 类型进行计算后 的结果会产生错误;另一方面,如果我们采用迭代的方法编写程序进行计算,计 算 f (100)/ f (101)的递归深度过大,算法的时间复杂度很高,运行非常慢,难以计算出结果,还有可能出现递归栈溢出的情况。
2. 提交初始的long/double版本的g1.c与g2.c。
3. 提交最后优化后的程序 g.c
#include<stdio.h>
int main(){
double fib[102] = {0};//初始化
fib[0] = 1;
fib[1] = 1;
long long n ,i;
printf("Input n\n");
scanf("%lld",&n);
for(i = 2; i <= n; i++)
fib[i] = fib[i-1]+fib[i-2];
double g = (fib[n-1])/(fib[n]);
printf("优化后的黄金分割值是%.8lf",g);
return 0;
}
版权声明:本文标题:HIT-CSAPP Lab1计算机系统漫游实验过程记录 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728409052a1157247.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论