南大PA0

南大PA0

Thu Apr 03 2025
3335 字 · 16 分钟
tech 未分配标签

南大PA

课程链接

(南大PA)

为什么要学计算机系统基础

CPP
volatile double d[ 1 ] = { 3.14 }; volatile long int a[ 2 ];

volatile (容易变化的)是 C 和 C++ 编程语言中的一个类型修饰符。它用于告诉编译器,变量的值可能会在程序的执行过程中被意外地改变,因此编译器不应对这些变量进行优化。 硬件寄存器:在直接操作硬件时,寄存器的值可能会在程序运行时由外部设备改变。 多线程编程:当多个线程同时访问某个变量时,一个线程对该变量的修改可能会影响其他线程的读取。 信号处理:在信号处理函数中,信号处理程序可能会改变某些变量的值,导致主程序中的值不一致。

课程介绍

鸡汤

小百合系版”有像我一样不会写代码的cser么?”回复节选.

我们都是活生生的人, 从小就被不由自主地教导用最小的付出获得最大的得到, 经常会忘记我们究竟要的是什么。我承认我完美主义, 但我想每个人心中都有那一份求知的渴望和对真理的向往, “大学”的灵魂也就在于超越世俗, 超越时代的纯真和理想。我们不是要讨好企业的毕业生, 而是要寻找改变世界的力量.
jyy

教育除了知识的记忆之外, 更本质的是能力的训练, 即所谓的training. 而但凡training就必须克服一定的难度, 否则你就是在做重复劳动,
能力也不会有改变. 如果遇到难度就选择退缩, 或者让别人来替你克服本该由你自己克服的难度, 等于是自动放弃了获得training的机会,
而这其实是大学专业教育最宝贵的部分.
etone

这种”只要不影响我现在survive, 就不要紧”的想法其实非常的利己和短视:
你在专业上的技不如人, 迟早有一天会找上来, 会影响到你个人职业生涯的长远的发展;更严重的是, 这些以得过且过的态度来对待自己专业的学生, 他们的survive其实是以透支南大教育的信誉为代价的—如果我们一定比例的毕业生都是这种情况, 那么过不了多久, 不但那些混到毕业的学生也没那么容易survive了, 而且那些真正自己刻苦努力的学生, 他们的前途也会受到影响.
etone

计算机架构

PLAINTEXT
x86、MIPS32 和 RISC-V32 都是不同的计算机架构,主要用于不同类型的处理器。它们的关系可以从它们的用途和发展历史来看:

x86:

x86 是一种由英特尔(Intel)开发的指令集架构(ISA),广泛用于个人电脑和服务器中。它的历史可以追溯到1978年,最初是针对16位处理器设计的,现在已经发展到64位(例如 x86-64)。
MIPS32:

MIPS(Microprocessor without Interlocked Pipeline Stages)是一种RISC(Reduced Instruction Set Computing)架构,MIPS32 是其32位版本。MIPS 处理器常用于嵌入式系统、路由器和一些高性能计算环境。MIPS 技术于1980年代首次推出,相比x86结构较为简洁。
RISC-V:

RISC-V 是一种开放源代码的指令集架构,旨在促进研究和教学。和MIPS一样,RISC-V也是RISC架构,但它是近年来新发展起来的,具有可扩展性和灵活性的优势。
这三者之间的关系在于它们都是计算机体系结构,提供不同的指令集和设计理念。它们分别在不同的应用场景中使用,比如x86主要用于桌面计算,MIPS常用于嵌入式系统,而RISC-V则是为了适应现代计算需求的开放架构。

linux入门教程

命令行

总览
PLAINTEXT
ls:list
pwd:print working directory
cd:change directory
touch:create a file
cp:copy a file
mv:move a file
rm:remove a file
mkdir:create a directory
manual

如果觉得下面内容太复杂,可以先跳到后面的“man 命令简明用法”部分快速入门!

PLAINTEXT
man:manual
    - 按键	说明
            Space	空格键,向下翻一页
            Page Down	向下翻一页
            Page Up	向上翻一页
            Home	跳转到首页
            End	跳转到尾页
            /	从上到下搜索某个关键字,例如 /help
            ?	从下到上搜索某个关键字,例如 ?help
            n	定位到下一个搜索到的关键字
            N	定位到上一个搜索到的关键字
            q	退出帮助文档
    - man ls
    - man 配置文件路径
    - man 3 freopen 
        --因为 man 是按照手册的章节号顺序进行搜索的,因此可以在 man 命令的后面加上一个数字表示查看的具体的范围,各数字的说明如下:

            1:表示用户在 shell 环境可操作的命令或执行文件。
            2:表示是系统内核可调用的函数与工具。
            3:一些常用的函数和函数库,大部分为 C 的函数库。
            4:设备文件说明,通常是 /dev 下的文件。
            5:配置文件或某些文件格式。如 etc/passwd 等。
            6:游戏。
            7:混杂的宏、包等。
            8:系统管理相关的命令。
            9:跟内核相关。 
    -
    你阅读这个例子的解释: 搜索和printf相关的manual page. 你还是不太明白这是什么意思, 于是你退出man, 在命令行中输入
    man -k printf
    并运行, 发现输出了很多和printf相关的命令或库函数, 括号里面的数字代表相应的条目属于manual的哪一个大类. 例如printf (1)是一个shell命令, 而printf (3)是一个库函数. 要访问库函数printf的manual page, 你需要在命令行中输入
    man 3 printf
    当你想做一件事的而不知道用什么命令的时候, man的-k参数可以用来列出候选的命令, 然后再通过查看这些命令的manual page来学习怎么使用它们.
统计代码行数
PLAINTEXT
find . | grep '\.c$\|\.h$' | xargs wc -l
正则表达式

正規表示法就是處理字串的方法。 但是系統的資料量太大了,要身為系統管理員的你每天去看這麼多的訊息資料, 從千百行的資料裡面找出一行有問題的訊息,呵呵~光是用肉眼去看,想不瘋掉都很難! 這個時候,我們就可以透過『正規表示法』的功能,將這些登錄的資訊進行處理, 僅取出『有問題』的資訊來進行分析,哈哈!如此一來,你的系統管理工作將會 『快樂得不得了』啊!當然,正規表示法的優點還不止於此,等你有一定程度的瞭解之後,你會愛上他喔!

(哈哈哈哈这段好可爱)

记录一下一个很好的网站 (鸟站)

bash vim shell等知识都有(计算机系统概论,上学期学的aaa居然没发现这个网站)

例子:grep

BASH
[dmtsai@study ~]$ grep [-acinv] [--color=auto] '搜寻字串' filename
选项与参数:
-a :将binary 档案以text 档案的方式搜寻资料
-c :计算找到'搜寻字串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有'搜寻字串' 内容的那一行!
--color=auto :可以将找到的关键字部分加上颜色的显示喔!

范例一:将last 当中,有出现root 的那一行就取出来; 
[dmtsai@study ~]$ last | grep 'root'

范例二:与范例一相反,只要没有root 的就取出! 
[dmtsai@study ~]$ last | grep -v 'root'

范例三:在last 的输出讯息中,只要有root 就取出,并且仅取第一栏
[dmtsai@study ~]$ last | grep 'root' |cut -d ' ' -f1 
# 在取出root 之后,利用上个指令cut 的处理,就能够仅取得第一栏啰!

范例四:取出/etc/man_db.conf 内含MANPATH 的那几行
[dmtsai@study ~]$ grep --color=auto 'MANPATH' /etc/man_db.conf 
....(前面省略).... 
MANPATH _MAP /usr/games /usr/share/man
 MANPATH _MAP /opt/bin /opt/man
 MANPATH _MAP /opt/sbin /opt/man
 # 神奇的是,如果加上--color=auto 的选项,找到的关键字部分会用特殊颜色显示喔!
统计磁盘使用情况
BASH
du -sc /usr/share/* | sort -nr
PLAINTEXT
du是磁盘空间分析工具, du -sc将目录的大小顺次输出到标准输出, 继而通过管道传送给sort. sort是数据排序工具, 其中的选项-n表示按照数值进行排序, 而-r则表示从大到小输出. sort可以将这些参数连写在一起.
BASH
du -sc /usr/share/* | sort -nr | more
PLAINTEXT
more工具使用空格翻页, 并可以用q键在中途退出. less工具则更为强大, 不仅可以向下翻页, 还可以向上翻页, 同样使用q键退出.

To help remember the difference between less and more, a common joke is to say, “less > more,” implying that less has greater functionality than more. A similar saying is that “less is more, more or less”.

在Linux下编写Hello World程序

这部分学过了 懒得写了

unix哲学
  • 每个程序只做一件事, 但做到极致
  • 用程序之间的相互协作来解决复杂问题
  • 每个程序都采用文本作为输入和输出, 这会使程序更易于使用

GNU名字来源很有趣:

GNU是一个自由操作系统,其软件内容完全采用GPL(通用公共许可证)发布。

GNU项目的主要目标是开发一个类Unix的操作系统。GNU这个名字是一个递归缩写,表示“GNU’s Not Unix!”。

GNU项目的开发始于1984年,包括多个应用程序、系统库、开发工具等。

简单来说,GNU是一个自由软件运动的核心组成部分,它与Linux内核结合使用,形成了广泛使用的GNU/Linux操作系统。

The Missing Semester of Your CS Education

内容好多 准备单开一篇blog嘞。

(课程链接)

计算机系统基础课

数组和指针

一个非常经典的问题,如何区分:

int *a[3]; int (*a)[3];

因为设定的优先级([] 比指针符号 * 的优先级更高)

前者其实是int *(a[3])

a是什么?a是一个数组。有几个元素?3个元素。a的元素类型是什么? 是int *

而对于后者int (*a)[3]

a是什么?a是一个指针。指向什么?一个数组(int [3])。数组的元素类型是什么?int.

还有一个需要注意的:int **a

a是什么?a是一个指针。指向什么?指向另一个指针。这个另一个指针指向什么?指向一个int类型的数据。

PLAINTEXT
## 常用 vim 指令

1. **进入 vim**  
   在命令行输入:  

vim 文件名

PLAINTEXT
进入 vim 编辑器。

2. **基本模式切换**  
- 普通模式(默认):可以移动光标、删除、复制等。
- 插入模式:按 `i` 进入,可以输入文本。
- 命令模式:按 `:` 进入,可以保存、退出等。

3. **常用操作**  
- `i`:进入插入模式(在光标前插入)
- `a`:进入插入模式(在光标后插入)
- `Esc`:回到普通模式
- `:w`:保存文件
- `:q`:退出 vim
- `:wq` 或 `ZZ`:保存并退出
- `dd`:删除当前行
- `yy`:复制当前行
- `p`:粘贴
- `/关键字`:搜索关键字
- `n`:下一个搜索结果
- `u`:撤销
- `Ctrl + r`:重做

4. **移动光标**  
- `h`:左
- `j`:下
- `k`:上
- `l`:右
- `gg`:到文件开头
- `G`:到文件结尾

---

### man 命令简明用法

man 是 Linux/Unix 下的“说明书”命令,可以查各种命令、函数、配置文件的详细用法。

- `man 命令名`:查命令的详细说明  
例:`man ls`
- `man 章节号 命令名`:查特定类型(如 C 函数)  
例:`man 3 printf`
- `man -k 关键词`:模糊搜索相关命令  
例:`man -k print`

**man 界面常用操作:**
- `q` 退出
- `Space` 向下翻页
- `/关键字` 搜索内容
- `n` 跳到下一个搜索结果

---

### 正则表达式入门

正则表达式(regex)是一种用来描述“字符串模式”的工具,常用于查找、筛选文本。

**常见符号:**

| 符号   | 作用                  | 示例           |
|--------|-----------------------|----------------|
| .      | 匹配任意一个字符      | a.c 匹配abc、acc |
| ^      | 匹配行的开头          | ^abc 匹配abc开头的行 |
| $      | 匹配行的结尾          | abc$ 匹配abc结尾的行 |
| *      | 匹配前面内容0次或多次 | ab* 匹配a、ab、abb |
| []     | 匹配括号内任意字符    | [abc] 匹配a或b或c |
| [0-9]  | 匹配0到9的任意数字    | [0-9]匹配任意数字 |
| \      | 转义符                | a\.b 匹配a.b |

**grep 结合正则的例子:**

假设 file.txt 内容如下:
apple
banana
abc
a1c
acc

---
 

Thanks for reading!

南大PA0

Thu Apr 03 2025
3335 字 · 16 分钟
tech 未分配标签

© SixdayC | CC BY-NC-SA 4.0

Comment

留下QQ邮箱,可以使用QQ头像~
或者在 Gravatar 设置头像~
(看不到评论试试刷新一下~)