计算机组成
硬件:主要由5大部件组成,CPU包含运算器和控制器两大部件
CPU:运算器、控制器、寄存器、缓存
存储器:内存,RAM(Random Access Memory) , Memory只支持平面编制,最小的存储单元为Bytes(1Bytes=8bits)
Input:下指令,提供数据等,常见的有:硬盘、键盘、鼠标等;
Output:输出数据加工的结果,常见的有硬盘、显示器等;
软件
Kernel+Application
注:CPU位数和计算机支持内存大小的关系: 32位CPU指的是CPU有32根接受输入的线,每根线都有on和off两种状态,on表示1,off表示0,因此CPU一次可接受输入的数据有2的32次方种可能,而内存的编址是平面化的,因此32位CPU支持的最大寻址为2的32次方,内存的存储单位是Bytes,故32位CPU支持的最大内存1024*1024*1024*4Bytes=4GB,而64为CPU支持最大内存为16*1024*1024*1024GB。
计算机的工作原理
程序是由指令加数据组成(或者可以说是由算法+数据结构组成),程序运行时会先将指令和数据装入内存中,CPU先读取指令,按照指令的指引找到相应的数据,再读取相应的数据进行运算,然后将运算结果存入内存,最终将运算结果保存到硬盘或通过显示器显示,程序由多条指令组成,执行程序时是按预定顺序执行各指令,为了加速执行,CPU执行完一条指令后,会将下一条指令所在存储器中位置存放在指令指针寄存器中,且运算时读取的第一条数据也需要保存在数据寄存器中,因此寄存器只是加速部件,而非必须部件,CPU的运算速度远远高于存储器的速度,为了加速,引入缓存,常见的有一级缓存、二级缓存、三级缓存等,一级缓存>二级缓存>三级缓存>存储器,缓存越大命中率越高,计算机运行速度越快,但造价越高。
kernel的作用
1) 驱动底层硬件
2) 将CPU和内存资源抽象化,将CPU的计算能力按时间分片,多个进程按时序轮流使用;将内存虚拟化,逻辑切割成多片,分配给多个进程使用,使每个进程都感觉自己在独立使用CPU和内存,感知不到其他进程的存在
3)监控多个进程的运行情况,把计算机的计算资源分配给各进程使用,使之各自独立运行,不相互影响,包括启动和终止进行进程
OS的组成
广义上的OS:kernel+application
狭义上的OS:kernel
程序
程序是由指令加数据组成 / 算法+数据接口组成,程序是静态的,存储在硬盘中,当需要运行程序时,会将程序装载到内存中,然后运行,此时叫做进程,因此进程是动态的,进程又叫task任务,程序的分类:
a. 通用程序, 只用于使用某特定硬件的程序,比如使用声卡的程序,即为驱动程序,后来演变成操作系统
b. 专用程序, 来完成某具体功能的程序,比如播放器
专用程序会调用通用程序来完成具体的功能,而不需要再包含通用程序
程序调用硬件的接口
硬件只支持2进制,其调用接口叫硬件规格;因此调用硬件的程序必须使用二进制编写,难度和工作量相当大,各CPU厂商为了减轻软件编写难度,通常生产的CPU会直接支持稍微接近人类能够理解的语言,叫汇编语言,但使用硬件的每个程序都需要包含调用硬件这一部分相同的程序,为了简化程序开发的工作量和难度,操作系统对硬件调用的过程进行封装,提供简洁的调用接口,程序开发时只需要调用此接口即可实现调用硬件,调用此接口的过程叫系统调用(System Call,简称Syscall);但实现某个专用功能的程序仍需使用多个系统调用才能完成特定功能,为了进一步简化程序开发难度,我们将完成某特定功能的多个系统调用再次进行封装,然后提供一个调用接口,此封装叫做库(libraries),调用过程叫库调用(Libraries Call,简称Libcall) 。
低级语言和高级语言
高级语言:实现效率高,执行效率低,对硬件的可控性弱,目标代码大,可维护性好,可移植性好
低级语言:实现效率低,执行效率高,对硬件的可控性强,目标代码小,可维护性差,可移植性差
越高级的语言,一条语句对应的机器指令条数越多,汇编语言和机器指令一一对应,所有语言编写的程序执行时都要翻译成二进制代码,此翻译过程由编译器完成,不管编译器多么强大,翻译时都会产生无用代码,对于汇编语言来说,由于与机器码一一对应,所以翻译后基本没有冗余,但对于高级语言,由于对机器码进行了抽象和封装,因此翻译时会产生较多的无用代码,据统计C语言编译后的无用代码为10%,此外软件的执行效率除和编程语言有关外还和程序员的编程水平有关,差的程序员即便使用汇编语言也会产生很多无用代码。
注:
1)Windows和Linux的Libraries Call不同,为了使程序在windows和linux之间具有可移植性,有了posix协定,定义Windows和Linux中库的调用接口相同,即API (Application Program Interface,程序员面对的编程接口) 相同,但软件源码编译后的二进制未必相同,即ABI (Application Binary Interface,程序应用者面对的运行程序接口) 不相同,由windows和linux中编译器的差异造成。
2)各厂商生产的各种CPU的架构、支持的硬件规格都不一样,通过汇编所提供的接口调用也不一样,因此编译操作系统时应根据特定环境进行编译,通常默认编译为当前CPU所支持的二进制,但也可以指定编译为特定的CPU类型的二进制,叫做交叉编译。
Linux的发行版
Linux指的是kernel,属于GUN组织,以源码的方式提供,但大多数使用者不具有将源码编译为二进制可执行程序的能力,因此有一些商业公司或者社区专门负责将kernel源码和一些常用开源软件一起编译成二进制代码,商业公司通过收取服务费获取利益。
Linux的发行版:Linux的发行版有数百种之多,但主要有如下几个派系
Debian:一个社区Linux发行版,包格式为deb,包管理器为 apt-get
Ubuntu:Debian的二次发行版
Mint:Ubuntu的二次发行版
Knopix:Debian的二次发行版
Slackware:
S.u.S.E:属于Attachmate公司,包格式为rpm,,包管理器为zypper,zypper参考了yum,但是对外声称比yum好用
OpenSuSE:S.u.S.E的开源版
Redhat:包格式为rpm,包管理器为yum
Redhat Enterprise Linux:RHEL, 属于Redhat公司的企业发行版
Fedora:Redhat将Redhat 9.0以前的版本贡献给Fedora社区,是个人桌面版的Linux发行版
Centos:Centos社区的发行版,RHEL源码编译而来,和RHEL完全兼容
ArchLinux:相对于前三个派系,archlinux属于轻量的linux发行版,包管理器较前三种都好用,但安装过程较复杂
Gentoo:安装过程需要边编译边安装,因此此操作系统是最适用于当前硬件平台的
LFS:Linux From Scratch,从零构建Linux,提供的不是程序,而是一本书,指引如何下载源码,如何一步步构建Linux,世上最纯Linux
Kali:早期的BT,内置各种渗透工具
Linux Kernel的版本号:
major.minor.release
主版本号.次版本号.修订号, kernel有重大更新时增加major, 一般功能更新增加minor, 为kernel漏洞打补丁时增加release。
Linux:0.99, 2.2, 2.4, 2.6, 3.0, 4.0
www.kernel.org
Linux发行版的版本号
和Linux Kernel版本号无关,只是发行商或者社区针对自己的Linux发行版指定的版本号
RHEL: 5.x, 6.x, 7.x
Debian:8.x
OpenSuSE: 13.x
程序管理
程序的组成:程序由如下四部分组成
二进制程序
配置文件
库文件
帮助文件
程序的包管理器:将程序的组成文件打包成一个或有限几个文件
安装
卸载
查找
Linux的哲学思想
1)一切皆文件:
把几乎所有资源统统抽象为文件形式,甚至是硬件设备和通信接口等
2)由众多功能单一的程序组成:
一个程序只做一件事,并且做好,组合小程序完成复杂任务
3)尽量避免跟用户交互:
目标是易于用编程的方式实现自动化任务
4)使用文本文件保存配置信息
终端设备:terminal
物理终端:console,比如鼠标键盘和显示器,设备文件目录:/dev/console
虚拟终端:tty,每套物理终端都会有一个虚拟终端与其对应,设备文件目录:/dev/tty# [1,n]
命令终端
图形终端
CentOS 6:在tty 7上,通过Ctrl+Alt+F7切换到tty 7上
CentOS 7:在哪个虚拟终端启动,即位于哪个虚拟终端
串行终端:ttyS,通过串行接口输出的终端,设备文件目录:/dev/ttyS#
伪终端:pty,比如Xme4、SecureCRT等ssh终端软件,每个窗口模拟一套终端,设备文件目录:/dev/pts/#
注:在启动终端设备之后,Linux会自动为其关联一个用户OS接口程序,即可实现与用户交互。
OS的接口
计算机只有kernel是无法为我们完成指定工作的,因为kernel不包含任何应用程序,无法完成人机交互,所以有个特定应用程序叫OS的接口,OS的接口有两类:
GUI:Graphic User Interface
GNome:c, gtk
KDE: c++, qt
CLI:Command Line Interface
bash
zsh
sh
csh
tcsh
ksh
文件和文件系统
目录:路径映射;
文件:存储空间存储的一段流式数据,对数据可以做到按名存取;
文件系统:一种存储和组织计算机数据的方法,采用层级结构,呈倒置树状结构
/: 原初起点;
文件名使用法则:
严格区分字符大小写:file1, File1, FILE1
目录也是文件,在同一路径下,两个文件不能同名;
支持使用除/以外的任意字符;
最长不能超过255个字符;
以.开头的文件为隐藏文件;
.: 当前目录;
..: 当前目录的上一级目录;
例如:
/etc/sysconfig/
.: sysconfig
..: /etc
文件的路径表示:
绝对路径:从根开始表示出的路径
相对路径:从当前位置开始表示出的路径
用户有家目录:home, 用户的起始目录;普通用户管理文件的位置;(普通用户只能管理家目录下的文件和临时目下的文件)
工作目录:working,用户登录操作系统后,任何时刻都处于某个目录下,此目录就为工作目录
路径分隔符:
最左侧/: 表示根目录
其它的/: 表示路径分隔符
inux的路径分隔符是/
Windows的是\
基名和路径名
basename:最右侧的文件或目录名;
dirname:basename左侧的路径;
命令:
~]# basename /PATH/TO/SOMEFILE
SOMEFILE
~]# dirname /PATH/TO/SOMEFILE
/PATH/TO
Linux文件系统标准
FHS:Filesystem Hierarchy Standard
/bin:所有用户可用的基本命令程序文件;
/sbin:供系统管理使用的工具程序;
/boot:引导加载器必须用到的各静态文件:kernel, initramfs(initrd), grub等;
/dev:存储特殊文件或设备文件;
设备有两种类型:
字符设备(线性设备):一个字符一个字符顺序输入或输出,比如键盘和早期显示器;
块设备(随机设备):将设备分成以1K或者其他单位的块,读取时一块一块的读取。
/etc:系统程序的配置文件,只能为静态;
/home:普通的家目录的集中位置;一般每个普通用户的家目录默认为此目录下与用户名同名的子目录,/home/USERNAME;
/root:管理员的家目录;可选;
/lib:为系统启动或根文件系统上的应用程序(/bin, /sbin等)提供共享库,以及为内核提供内核模块
libc.so.*:动态链接的C库;
ld*:运行时链接器/加载器;
modules:用于存储内核模块的目录;
/lib64:64位系统特有的存放64位共享库的路径;
/media:便携式设备挂载点,cdrom, floppy等;
/mnt:其它文件系统的临时挂载点;
/opt:附加应用程序的安装位置;可选路径;
/srv:当前主机为服务提供的数据;
/tmp:为那些会产生临时文件的程序提供的用于存储临时文件的目录;可供所用户执行写入操作;有特殊权限;
/usr:usr Hierarchy,全局共享的只读数据路径;
bin, sbin
lib, lib64
include:C程序头文件;
share:命令手册页和自带文档等架构特有的文件的存储位置
local:另一个层级目录;
X11R6:X-Window程序的安装位置
src:程序源码文件的存储位置
/usr/local:Local hierarchy,让系统管理员安装本地应用程序;也通常用于安装第三方程序;
bin Local binaries
etc Host-specific system configuration for local binaries
games Local game binaries
include Local C header files
lib Local libraries
man Local online manuals
sbin Local system binaries
share Local architecture-independent hierarchy
src Local source code
/var:/var Hierarchy,存储常发生变化的数据的目录;
cache Application cache data
lib Variable state information
local Variable data for /usr/local
lock Lock files
log Log files and directories
opt Variable data for /opt
run Data relevant to running processes
spool Application spool data
tmp Temporary files preserved between system reboots
/proc:基于内存的虚拟文件系统,用于为内核及进程存储其相关信息;它们多为内核参数,例如net.ipv4.ip_forward, 虚拟为net/ipv4/ip_forward, 存储于/proc/sys/, 因此其完整路径为/proc/sys/net/ipv4/ip_forward,这样做的目的是为了对应Linux一切皆文件;
/sys:sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径;其主要作用在于为管理Linux设备提供一种统一模型的的接口;
参考:https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/
Linux系统上的文件类型:
-:常规文件;即f;
d: directory,目录文件;
b: block device,块设备文件,支持以“block”为单位进行随机访问
l:symbolic link,符号链接文件;
p: pipe,命名管道;
s: socket,套接字文件;
c:character device,字符设备文件,支持以“character”为单位进行线性访问
major number:主设备号,用于标识设备类型,进而确定要加载的驱动程序,使用8位二进制表示;
minor number:次设备号,用于标识同一类型中的不同的设备,使用8位二进制表示。
实例:
dev]$ ls -l tty
crw-rw-rw-. 1 root tty 5, 0 Nov 11 2011 tty #第5个字段为5,0非文件大小,5即为major number,0即为minor number
查看文件类型命令:~]# file FILENAME
程序编译方式:
动态链接:程序编译时不将调用的库编译进程序,而是指明所调用库文件的接口,当执行时再将指定的库文件装载进内存。缺点是移植性差,当程序移植到另一台服务器时,要求服务器必须拥有所需库文件,否则不能执行,优点是多个程序占用内存小,当有多个应用程序调用同一个库文件时,只需将一份装入内存。
静态编译:程序编译时连同调用的库文件编译进程序,执行时库文件和程序一起装载进内存,优点是移植性强,当程序移植到另一台服务器时,无需服务器拥有所需库,而是已经自备,缺点是占用内存大,当多个程序都调用相同的库文件时,都将库文件作为自己程序的一部分,且都装入内存,这样就浪费掉很多不必要的内存空间
进程的类型:
与终端相关:通过终端启动
与终端无关:操作系统引导启动过程当中自动启动,因此shell不是操作系统必备的程序
Linux必备库:glibc(GUN libraries C)
原创文章,作者:Yurnero,如若转载,请注明出处:http://www.178linux.com/38946
评论列表(1条)
赞,抽时间可以熟悉下markdown~加油~