CPU内部已经含有一些小的指令集,我们所使用的软件都要经过CPU内部的微指令集来达成。因此CPU可分为RISC(精简指令集)和CISC(复杂指令集)两种,前者有sun公司的SPARC,IBM的PowerPC系列及ARM系列等。后者有Intel、AMD等x86架构处理器,广泛用于个人计算机上。
CPU与其他设备集成到一块主板上协调工作,对于Intel处理器,主板设计成南北桥结构,南桥沟通CPU及周边运算速率较快的设备,北桥连接其他速率较慢的外围设备。
由于CPU和外部组件运行速率不同,所以我们称CPU内部运行速率为主频,与外部组件数据传输时的统一速度为外频,主频/外频=倍频,一般倍频由厂商设定好,如果玩家想提高CPU性能,可人为提高主板上外频,此即超频。
系统总线是主存与CPU数据传输的通道,分32/64位;I/O总线主要连接硬盘、USB、网卡等设备。注意区分总线宽度和CPU字组大小,通常所说的32/64位CPU指CPU字组大小,即CPU每次能处理的数据量。32位CPU最多支持4GB内存。(2^32=4G,32位最多寻址4G个地址,每个内存地址对应一个Byte数据)。
主存是动态随机存储内存(DRAM),通电时记录和使用,掉电后数据消失。适配主存的外频最好与CPU外频相同,如DDR2-800的内存条,其外频为400MHZ。
为提升数据传输速率,可采用双通道设计,2^n个内存并行传输,若每个64位,则总线宽度扩展为64×2^n位。为了提高数据传输速率,CPU内部嵌入了基于SRAM(静态随机存储内存)的L2 cache高速缓存,其频率与CPU主频相同。主板上都有一块固定的ROM(只读存储器),内部数据永久保存,一般用于记录BIOS信息。
显示适配器(VGA:Video Graphic Array)用于计算机数据可视化显示。每个像素的显示需要占用内存,因此显示适配器上会有一个内存容量。另外,显示3D图形的相关运算早期由CPU完成,如今为减轻CPU负担,显卡也承担此部分运算任务,即所谓GPU。
前面提到:CPU具有微指令集,它实际上是一系列二进制数(机器语言),告知CPU执行特定的操作。编程语言通过编译程序转化为机器语言,实现操控计算机硬件的目的。但为了避免考虑整体硬件系统来设计程序,人类使用操作系统核心(operation system kernel)来管理计算机硬件活动及驱动系统中所有硬件。操作系统核心本质上也是一组程序。
Ken Thompson:1969年用汇编语言写成Unix原型
Bill Joy:1977年伯克利大学的Bill Joy在取得Unix源码后,修改成适合自己机器的版本,命名为BSD,后创立sun公司。
Richard Mathew Stallman:1984年发起GNU计划,并成立FSF(Free Software Foundation)。后开发了一些重要软件GCC、Bash Shell、glibc等,引发了开源软件风潮。
Linus Torvolds:1991年以bash、gcc等工具撰写了linux核心。
注意区分Linux核心版本和distribution版本。Linux核心版本编号格式为类似:2.6.18-92.el5。2是主版本,6是次版本,偶数是稳定版,奇数是测试版。
Linux的distribution众多,由套件管理的方式可分为RedHat系统的RPM方式及Debian系统的dpkg方式。Ubuntu使用dpkg方式。
ubuntu 下载的软件包一般放在/var/cache/apt/archives里,以.deb为后缀名,
欲安装该包,执行dpkg -i ×××.deb
dpkg -L libmysqlclient //查看libmysqlclient各个文件的安装位置
ubuntu shell绿色字体代表可执行文件,红色代表压缩文件(通常是安装包),蓝色代表目录
sudo 后续命令 //以根权限操作,主要用于修改文件,sudo是ubuntu自己的脚本语言
sudo su //切换为根用户
cd /home //cd用于打开home目录
cp /etc/group . //拷贝etc目录下group文件到当前目录
rm group //删除当前目录下group文件
ls -l //列出当前目录下所有文件的详细信息
(-a:列出当前目录所有文件包括以 . 开头的项目;-i:列出当前目录下所有文件的索引号inode)
如该文件信息开头为drwxr-xr-x ,d表示是目录,后面9项表示owner、group、world三类用户的使用权限,r读、w修改、x执行、-无此权限。
注:Linux共四种用户,除以上三种还有root用户。
查询命令:
find /usr/lib -name interfaces //查询该目录中所有名为interfaces的文件,此方法较慢
locate interfaces //对/var/lib/locatedb检索
(包含本机所有文件信息的数据库),找出所有名为interface的文件,较快
whereis grep //搜索linux上二进制文件grep的位置
,只能搜索可执行文件/二进制文件
type grep //查看命令是否为系统命令
file /bin/bash //查看bash的文件类型和格式
,此处bash是elf类型的可执行文件格式,elf类型包括共享目标文件(.so),可执行文件(linux中一般不加后缀名),可重定位文件(.a,.o),核心转储文件等。
ln passwd passwd.2 //对已存在的passwd建立硬连接passwd.2
passwd.2与passwd共享同一个索引号
ln -s passwd passwd.2 //对已存在的passwd建立软连接
,passwd.2 是passwd的符号连接:passwd -> passwd.2
注:连接是指文件名与索引号的对应
mv passwd.2 godown.b //移动passwd.2为同一目录下并更名为godown.b
,实际上是原地搬移,实现了更名,索引号不变。
man ls //查阅手册,了解ls命令的用法
ls --help // 获取ls的帮助文档
mount /dev/cdrom /mnt/cdrom //将cdrom的文件挂到mnt/cdrom目录下
,默认mnt为接受外挂文件系统的目录
mkdir test //在当前目录下创建新目录test
touch a.txt //在当前目录下创建新文件a.txt
cat -n /etc/passwd //查看passwd文件并以行编号输出
,passwd记录用户帐号信息,账号信息中UID若为0,则为root用户,享有最高权限。
chown root /home/zhengfeng/Music
chgrp root /home/zhengfeng/Music //更改文件的所有者及所有组
chmod +x install.sh //更改install.sh的访问权限为允许所有人执行,+x增加执行权限
。
echo $PATH //显示当前搜索路径
,若$PATH
加单引号,则显示该字符串,若$
前加转义字符\则同样显示该字符串,若$PATH
加双引号则显示当前搜索路径,即保留$
的特殊用义。$
用来标志系统环境变量。
echo $BASH_VERSION //显示当前bash版本
,bash是一种shell,作为命令语言解释器。
ls -l /dev/hd* &
ls -l /dev/hd*
cp /dev/stdin a.txt //将键盘输入内容保存在a.txt内
,键入时按CTRL+D结束。
cp a.txt /dev/stdout //将a.txt内容输出到屏幕,与cat等价
。
ls -l /dev|more //将dev目录下文件信息分页显示
|是管道操作符,表示前后命令并列执行。
history //列出本次登录后所有操作历史,并编号
;!12 将第12条历史命令重新执行一次;!! 将最近的命令重复执行一次。
dir() { ls -ld $*;} //建立一个shell函数dir(),功能是花括号内命令
,$*用于提取参数 因此dir /home 即显示hom目录信息,注意左花括号后有一空格,如多个命令则依次写在花括号内,以分号分隔。
alias lm = ‘ls -al’ //令lm为别名
Linux在命令行输入时也有命令补全功能,例如在输入一个文件名到一半时,按下tab键,系统会自动补全名字,若存在相似文件名,则需要继续输入。
ps //process situation 显示当前进程状态
kill -9 1841 //向进程发值为9的信号,终止PID为1841的进程
,信号是一种机制,进程通过信号了解系统中发生的事件。
top //实时监视系统运行状况,按q退出监视返回shell
。
ping IP或网站名 //检查与目标主机或网站的连接是否连通,但不能作为评判标准
Telnet是Internet提供的一项基本服务,用来将本地计算机作为远程计算机的终端机使用。
telnet 主机名或IP地址
exit或logout命令退出
telnet以明文传输不安全,因此禁止root身份登录
SSH 主机名或IP地址
//作为telnet的替代,以公开密钥算法加密数据,允许root登录
scp 本地文件路径 远程用户名@主机:文件路径
//用于本地与远程计算机之间安全拷贝文件 如:
scp [email protected]:a.txt
sftp 远程用户名@主机
//以安全模式进入ftp状态,此时可执行该状态下的命令:
get 远程路径 本地路径
//下载
put 本地路径 远程路径
//上传
quit
退出
? //列出该状态可使用的命令清单,其中不少同Linux Bash命令如mkdir、cd、ls等,都是针对被登录机操作,若对本地机操作,则在命令前加字母l,如lmkdir、lls等
NFS(Network File System):通过网络将远程主机的文件系统挂载到本地主机目录下,以便于使用,它基于客户机/服务器模式,建立在TCP/IP协议的表示层协议与会话层协议机制之上。
vim是vi文本编辑器的进阶版,在所有linux系统上均可使用,被称为“编辑器之神”。
vi分为三种模式:一般模式,编辑模式和指令列命令模式
vi hello.c //进入hello.c文件,此时为一般模式,若hello.c不存在则自动新建
一般模式下执行vi定义的键盘上转义字符操作,del为删除光标上字符,dd为删除一整列,退格键及上下左右键移动光标,i进入插入光标前编辑模式,a进入插入光标后编辑模式,r进入改写编辑模式;
编辑模式下键盘上所有按键除ESC外都可输入字符,如上下左右键分别代表ABCD大写字母,按ESC退出编辑;
在一般模式下按:进入指令列模式,最下面一行为指令列,wq保存并退出。
gcc中库的链接顺序是从右往左进行,所以要把最基础实现的库放在最后,这样左边的lib就可以调用右边的lib中的代码。同时,当一个函数的实现代码在多个lib都存在时,最左边的lib代码最后link,所以也将最终保存下来。
objdump -T libmysqlclient.so
//打开当前目录下的动态链接库libmysqlclient.so查看其中的API。objdump命令用来查看各种目标文件(elf文件)内部的结构
obidump -h hello.o
//参数-h把hello.o各个段的基本信息打印出来,elf文件是分段的,通常分为Header、.data(数据段包括局部静态变量和全局变量)、.text(代码段)、.rodata、.bss、.comment等
readelf -s hello.o //查看详尽段信息
gcc错误:undefined reference to function 该函数具体实现没有找到
info gcc
//显示gcc的所有信息
SQL:Structured Query Language
netstat -tap|grep mysql
//检查系统有没有已安装mysql,若socket显示listen则表示就绪。
mysql中unique key(唯一键)指除主键外确保某一列唯一性的约束,该列可包含NULL(空值);primary key为主键
apt-get install mysql-server
//安装mysql
mysql -u root -p
//以root用户登录mysql server,之后需输入密码
show databases; show tables;
//查看数据库和数据表单,注意在mysql server中输入指令以;结尾。
use mysql;
//使用数据库mysql也可以在登录时输入指令:
mysql -D mysql -u root -p
quit;
//退出
insert into students(id,name,sex) value(1,zhengfeng,man);
//向students表中插入zhengfeng的信息
select * from students
//输出students的所有信息,*是通配符,可指定为列名称
create table students(
id int(8) not null auto_increment,
name varchar(255) not null,
sex char(4) not null,
tel char(13) not null default “-”,
primary key(id),
unique key unique_name(name)
);
//创建表
describe students
//输出表结构信息
mysql_config --libs
//使用mysql_config工具确定MySql程序的链接参数,同理,若需确定编译参数,使用mysql_config –include
注:redis是一个高性能的key-value数据库,由ANSI C编写,支持网络,它支持的value类型包括string、list(字符串链表)、set(字符串集合)、zset(字符串有序集合)、hash(字符串哈希类型)。
竞态条件和原子操作的概念:原子操作指该命令在执行过程中不会被其他插入命令打断,是“一气呵成”的;
竞态条件:指一个系统或进程的输出,依赖于不受控制事件出现的顺序或时机,若多个客户端连接到redis,同时执行多项命令时有可能出现竞态条件,关于此问题的深入讨论在《链接、装载和库》中详细提及。
apt-get install redis-server
//安装redis
netstat -nlt grep|6379
//查看系统中redis运行状态,listen为就绪
redis-cli
//进入redis命令行客户端,cli:command line interface 此为进入交互模式,可自由输入命令。
select 1
//选择1号数据库,redis实例默认自带16个数据库,以数字编号,可通过配置文件更改。