0%

CPU- The Central Processing Unit

计算机的心脏是“中央处理单元”, 简称“CPU”.

CPU用来运行程序, 程序由一个个操作组成, 这些操作叫做“指令”(instruction). 指令指示计算机所做的行为. 例如算数运算指令, CPU会让ALU进行算数运算, 又例如内存指令, CPU会和内存通信, 然后读写值.

CPU组件

从高层次视角, CPU组件之间组合的方式叫做“微体系架构”, 简称“架构”, 如AMD今年10月份发布的zen3架构锐龙5000桌面处理器. 其实不只CPU, 芯片都有架构, 大家9月份听到更多的架构肯定源自于NVIDIA(英伟达)的30系显卡的安培架构等. 架构如此重要, 以至于先进的架构早已经成为了衡量芯片的一项重要指标.

gitlab 克隆仓库前的操作

https://blog.csdn.net/Alvin_Lam/article/details/90513353

通过SSH克隆远程仓库(GitLab)到本地

由于不是任何用户都能从远程仓库克隆到本地的,也是需要鉴别的,因此本地需要用git bash 创建一个公钥,而远程仓库也要把这个公钥保存下来,进而本地才可以从远程download。主要步骤如下:

1.首先需要下载一个git for windows,成功安装。

2.在github或者gitlab上有自己的账户。

3.打开git bash.exe 输入ssh-keygen -t rsa -C “your_email@example.com“ 使用你的邮箱用ssh-keygen命令创建密码对。注意ssh-keygen命令中间没有空格,如果在ssh后面加上空格,会得到Bad escape character ‘ygen’.的错误。

4.在目录C:\Users\your_name.ssh 目录下找到生成的公钥文件id_rsa.pub,记事本打开,将里面的内容复制到剪贴板。

5.打开新建的github或者gitlab账户,找到SSH Keys选项如图:


将剪贴板内容粘贴到内容框中,title可以用默认的邮箱名字,最后点击add。这就代表这个用户被远程仓库所承认了,接下来就可以克隆仓库了。

6.可以先选择一个空文件夹用来储存克隆下来的项目,然后鼠标右键选择git bash here,然后输入命令 git clone + 自己Git库的地址,如图

Receiving objects :100% Resolving deltas:100% 代表远程仓库项目已经下载到本地。

创建SSH的目的:

创建SSH KEY(这个作用是来识别你的电脑,相当于人的身份证号),在你的c盘用户目录下面(我的目录–C:\Users\LX)看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:$ ssh-keygen -t rsa -C “youremail@example.com“,
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

F12从定义和调用之间跳转

可以自己制作头文件, 在‘resource files’中, 后缀为.h, 在Source file中调用需要#incude "header_file_name"

黄色箭头可以用鼠标左键来改变位置.

只有拥有源代码生成的进程才可以调试.

Hexo + Github Pages博客配置总结

博客主题及其选择原因

我是在三年前, 也就是大一入学不久就建立了我的这个博客(https://zhangchunxian.github.io/),当时我看了一些本校学长的博客,建立Hexo博客也是受到了Godweiyang学长的这篇博客的影响。( https://godweiyang.com/2018/04/13/hexo-blog/)。 在这篇文章中Godweiyang就是使用Hexo框架配置的个人博客。

至于Hexo与github pages的好处, 比起自己搭建博客,这两个结合在一起可以省去购买域名和服务器的成本,不需要考虑定期维护,对于不使用全栈的人(比如我),非常省力

为什么选择Hexo框架的next主题呢? 主要是因为在翻阅Hexo主题时, 最中意的就是这篇博客(https://blog.ahao.moe/)的样式了, 里面使用的样式就是next, 所以我就选择了next主题.

博客页面及其设计思路

博客页面布局如下:

  • 页面菜单栏: 包含主页, 标签, 分类, 归档, 关于, 搜索等选项
  • 页面菜单栏: 包含个人联系方式, 博客信息, 友情链接等信息.
  • 内容栏: 包含最近发布的缩略的博客文章.

image-20230510192257469

博客功能实现及其技术选择

Hexo + github的搭建网上已经有很多文档了, 简单来说可以分为三步

  • 在github上建立公开仓库, 名字必须为 自己的Github用户名.github.io, readme初始化的选项也要选择.

  • 在本地安装npm包hexo-deployer-git, 使用hexo new post "article title" 新建一篇文章, 在source/_posts/文件夹下会看到新建的.md文件, 在md文件里面编辑即可.

  • 编写完markdown文件后,根目录下输入hexo g生成静态网页,然后输入hexo s可以本地预览效果,最后输入hexo d上传到github上。这时打开你的github.io主页就能看到发布的文章啦.

选择markdown作为编辑语言

博客渲染本质上是将markdown转化为html渲染在静态页面上.

Markdown是一种轻量级的标记语言, 非常简单易学. Markdown其实就是用一些简单符号来起到排版作用,因为纯键盘操作,写作时少调用鼠标,效率能提升很多,不必多花时间在排版上。对于博客来说, 写作本身就是最重要的.

博客样式及其美学考量

文章的分类与整理

每个博客文章都有对应的时间, 标签, 分类.

  • 在菜单栏点击标签页面可以根据标签查看博客

  • 在菜单栏点击归档, 可以按照时间顺序查看博客.
    • image-20230511163338541
  • 在菜单来点击分类, 可以按照分类查看博客.
    • image-20230511163418490

最后, 可以根据文字内容搜索博客相关内容.

image-20230511163448915

博客制作过程中遇到的问题及其解决方法

问题1 Failed to connect to github.com port 443:connection timed out

这个问题可能是因为在本地使用了代理, 我们使用git取消代理一般就可以解决问题

1
2
3
4
取消全局代理:
git config --global --unset http.proxy

git config --global --unset https.proxy

问题2 推送新文章到博客后还需要手动重新生成Github pages

这个问题说小不小, 每当我们辛苦写完一篇博客文章后, 推送到github上, 万一忘记了重新部署Hexo静态页面. 我们写完的文章是不会出现在博客网页上的

这里的解决方案是使用Travis CI(持续集成)

Travis CI(持续集成)是一个在软件开发过程中提供自动化构建、测试和部署的在线平台。它与GitHub等代码托管服务紧密集成,可以轻松地为您的项目设置持续集成流程。

我们只需要以下步骤:

  • 配置文件:需要在项目的根目录下创建一个名为.travis.yml的配置文件,该文件用于定义构建和测试的步骤。
  • 触发构建:每当您向代码库提交新的更改或推送到GitHub仓库时,Travis CI将自动检测到这些更改,并触发构建过程。

因为Travis CI灵活的配置和能够自动化部署的特性, 我们只需要配置好Travis CI后直接push文章就可以了.

travis.yml内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 使用语言
language: node_js
# node版本
node_js:
- 10
# 设置只监听哪个分支
branches:
only:
- source
# 缓存,可以节省集成的时间,这里我用了yarn,如果不用可以删除
cache:
apt: true
yarn: true
directories:
- node_modules
- theme
before_install:
# 配置git
- git config --global user.name "ZhangChunXian"
- git config --global user.email "1836891291@qq.com"
# 由于使用了yarn,所以需要下载,如不用yarn这两行可以删除
- curl -o- -L https://yarnpkg.com/install.sh | bash
- export PATH=$HOME/.yarn/bin:$PATH
# npm模块安装
- yarn global add hexo-cli
# - yarn remove hexo-renderer-marked
- yarn add hexo-renderer-kramed
- yarn add hexo-asset-image
- yarn add hexo-generator-searchdb
- yarn add hexo-generator-feed
#- yarn add hexo-related-popular-posts
- yarn add hexo-symbols-count-time
- yarn add hexo-generator-sitemap
- yarn add hexo-generator-baidu-sitemap
- yarn add hexo-deployer-git
- yarn add hexo-helper-live2d
- yarn add theme-next/next-util

# 将 GitHub Token 替换到 next.yml 中
- sed -i "s/REPO_TOKEN/${REPO_TOKEN}/" source/_data/next.yml
# next主题下载
- git clone https://github.com/theme-next/hexo-theme-next themes/next
- cd themes/next && git checkout v7.7.2 && cd -
# next主题依赖下载
- git clone https://github.com/theme-next/theme-next-pdf themes/next/source/lib/pdf
- git clone https://github.com/theme-next/theme-next-pace themes/next/source/lib/pace
install:
# 不用yarn的话这里改成 npm i 即可
- yarn
script:
- hexo clean --config source/_data/next.yml
- hexo g --config source/_data/next.yml
- hexo d --config source/_data/next.yml

Chapter 6 存储器层次结构

1. cache存储块的抖动问题

中文版本 P431 6. 直接映射高速缓存总的冲突不命中

虽然书上的实例针对的是直接映射高速缓存的抖动问题, 但这些也同样适用于组相联映射高速缓存.

2. 编写对高速缓存友好的代码

中文书P440 6.5

C 语言: 用EOF代替回车作为终止输入的符号

EOF 知识链接:

What is EOF in the C programming language?

用EOF终止输入需要保证EOF在回车后输入, 否则EOF不会被识别到

1
2
3
4
5
// 用EOF终止字符的输入
if ( (str = getchar()) != EOF ) // 继续输入
{
/*语句*/
}else /*终止语句*/

题目:

http://oj.kfcoding.com/contest/24/problem/6-1

答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>

void StringCount(char s[])
{
int English_char = 0, Space_and_Enter = 0,
num_char = 0, other_char = 0;

for (int i = 0; i < 100; i++)
{
if ((s[i] = getchar()) != EOF)
{
if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
English_char++;
else if (s[i] >= '0' && s[i] <= '9')
num_char++;
else if (s[i] == ' ' || s[i] == '\n')
Space_and_Enter++;
}else break;
}
printf("%d %d %d %d", English_char, Space_and_Enter, num_char
, strlen(s) - English_char - Space_and_Enter - num_char - 1);
}

int main()
{
char str[100];

StringCount(str);

return 0;
}

C语言: 消除输出的最后一位空格

1
printf("%c",8);

上面这里是输出ASCII码为8的字符,这是一个Backspace控制符。于是可以往回消去一个字符。

PS: 经过验证, 该方法有效, 但是在学校的oj平台上无用, 且会被判定为未知字符.

Git & Github

How to clone all remote branches in Git?

VSCODE: 输出中文乱码解决方法

https://www.w3xue.com/exp/article/20203/80007.html

https://zhuanlan.zhihu.com/p/30127242)

C语言: strrev() function

strrev() function

It is used to reverse the given string expression.

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>

int main()
{
char s1[50];

printf("Enter your string: ");
gets(s1);
printf("\nYour reverse string is: %s",strrev(s1));
return(0);
}
1
2
3
// output
Enter your string: studytonight
Your reverse string is: thginotyduts

C语言: scanf输出输出一行包括空格的字符串

String Input and Output

Input function scanf() can be used with %s format specifier to read a string input from the terminal. But there is one problem with scanf() function, it terminates its input on the first white space it encounters. Therefore if you try to read an input string “Hello World” using scanf() function, it will only read Hello and terminate after encountering white spaces.

However, C supports a format specification known as the edit set conversion code %[..] that can be used to read a line containing a variety of characters, including white spaces.

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<string.h>

void main()
{
char str[20];
printf("Enter a string");
scanf("%[^\n]", &str); //scanning the whole string, including the white spaces
printf("%s", str);
}

C语言: 动态分配数组(一维)

数组元素个数为变量

1
2
3
4
5
6
7
8
int *a = NULL;								// 声明数组头指针	
int N = 0; // 声明变量并初始化
scanf("%d", &N); // 变量赋值
a = (int *) malloc(N * sizeof(int)); // 动态分配内存
/*
之后a的用法与a[N]无异
*/
free(a); //!!!i使用结束后必须释放内存空间

C语言: 动态分配数组(二维)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>

int main()
{
int nrows, ncolumns;
int i = 0;

scanf("%d %d", nrows, ncolumns);

// 为数组分配行数 注意分配的是整形指针的数量 每行元素是个整形指针
int **array = malloc(nrows * sizeof(*array));

// 对每行分配数组的个数(二维数组列数)
for(i = 0; i < nrows; i++)
{
// 为每行申请内存空间
array[i] = (int *)malloc(ncolumns * sizeof(int));
}

/*接下来等于对 a[nrows][ncolumns] 进行操作
*/

free(array); // 一定要在最后讲内存空间释放!!

return 0;
}

C语言: Problem with scanf() when there is fgets()/gets()/scanf() after it

article_links

C语言: fgets函数的一些注意事项

1
char *fgets(char *str, int n, FILE *stream);
  1. fets函数中的第二个参数为字符串的允许输入个数, 实际上这个个数是要算上字符串的结尾‘\0’, 除去‘\0’, 有效输入字符为 n-1个.

  2. 当fgets函数以换行符号作为最后的终止符, 如果当前输入的字符个数小于n-1, 那么换行符\n也会作为输入字符记载到字符串中.

3.7.1 过程调用

过程对应于c 语言中就是指的函数。函数相当于是对一系列工作流程所进行的一个抽象, 那么函数调用在高级语言中是一个再常见不过的事情。

在这一部分主要讨论一下函数调用,也就是对应到汇编语言中的过程在机器级是如何实现的. 如下有两段代码

一个是P 函数,一个是Q 函数。我们可以看到在P 这个函数中, 调用了Q 这样的一个函数, 实现了一个函数的嵌套调用。在这样的一个嵌套调用中。计算机, 底层主要完成了哪些工作呢?

阅读全文 »