一、系统概述
1、什么是操作系统
操作系统就是把计算机硬件管理起来,让硬件和整个系统正常运行
2、计算机的主要组成
CPU 内存(主存) 硬盘(光盘,移动硬盘和U盘) 鼠标和键盘 显示器
3、计算机程序的运行过程
从内存中取一条指令
通过控制器译码
从内存中把数据取到CPU
CPU逻辑和数据运算
把计算的结果返回到内存
取址 译码 运算
4、CPU的组成
运算器 控制器 寄存器组
寄存器组分2种,通用寄存器组和专有寄存器组,用户的可见的是通用寄存器组
外设中也有寄存器,
寄存器分类:
控制寄存器
数据寄存器
状态寄存器
5、计算机总线
地址总线:计算机可以寻址的内存空间,32位系统2^32=4G 64位系统2^64=2^32*2^32=4G*2^32
数据总线:计算机同时发送数据的位数,并发发送的位数,比如有24位
控制总线:发送控制信号
中断信号 时钟 复位 IO读写 存储器读写 总线请求允许
6、计算机指令的格式
http://192.168.109.151/LinuxNetwork.tar.gz
http://192.168.109.151/sysnetbooks.tar.gz
操作码和地址码
4地址指令
OP A1 A2 A3 A4
3地址指令
OP A1 A2 A3 下一条指令隐含在程序计数器PC
2地址指令
OP A1 A2
1地址指令
OP A1 另一个数据在ACC累加器
0地址指令
OP 数据隐含在堆栈指针SP中
7、程序指令取值的方式
1)立即数寻址
add r0,r1,#2
2)直接寻址
3)隐含寻址
4)间接寻址
5)寄存器寻址
6)寄存器间接寻址
7)基址寻址
8)变址寻址
9)相对PC寻址
10)堆栈寻址 SP
8、控制器
MAR 内存地址寄存器
NBR 内存缓冲寄存器
IO AR IO地址寄存器
IO BR IO地址缓冲寄存器
PC 程序计数器
PSW 程序状态寄存器
CPU主要是通过控制器和内存进行数据的传输,为了避免CPU和内存速度不匹配,引入了cache
9、冯.诺伊曼架构
1)二进制思想
2)程序顺序存储
计算机中的一切信息=二进制+上下文
10、计算机的发展过程
1、单通道计算机系统
2、多通道计算机系统
3、分时系统
时间片(time slice)
1)如何保证多个任务正确的同时运行
2)如何多个任务同时读写一个文件
3)如何实现任务的并发和竟态
4)如何为上层应用程序提供统一的接口
在分时系统的基础上,如果实现了上面的4个问题,那么就成为了现在的操作系统
4、现在操作系统
多用户、多任务的
通用的操作系统
Windows
Linux
Unix
MAC OS
嵌入式操作系统
IOS
android
移植裁剪过的Linux系统
VxWorks
UCOSII
嵌入式操作系统要求有更高的实时性,响应速度更快,通过抢占式中断(进程的优先级)的方式
11、现在操作系统的组成
现在操作系统分6部分?
任务管理:任务在操作系统体现为进程或者线程
内存管理:MMU 我们程序中使用的内存是逻辑内存地址,逻辑内存地址映射到物理内存地址的;逻辑地址连续的内存,物理地址不一定连续;链表不一定是连续的内存空间,但数组是连续的内存空间
网络管理:ifconfig ping route netstat
文件管理:ext4 fat32 ntfs yaffs2(android)
设备管理:计算机的核心硬件和各种外设硬件
系统(启动)管理:shutdown init reboot halt
12、系统调用
操作系统分为应用层和内核层
应用程序发送数据给操作系统的内核,发送数据的过程是通过系统调用。换句话说,应用程序通过系统调用发送数据给内核,内核把发送过来的数据进行逻辑运算,然后把计算的结果通过系统调用返回给应用程序
系统调用类似于 客户端-服务器架构
13、系统调用和glibc库的区别
glibc是封装的系统调用函数,但是只是封装了大部分系统调用,并不是所有的。
为什么封装成glibc代码库,是因为封装以后,函数更方便使用和移植,可读性更好
举例子:
fopen() fclose() fread() fwrite() fseek()是glibc库函数
open() close() read() write() lseek()是系统调用函数
exit()函数是glibc库函数
_exit()函数是系统调用函数
int exit(int num)//glibc函数
{
_exit(num);//系统调用函数
printf("\n");
}
14、C程序的内存布局
代码区:存放程序源代码的内存空间
数据区:普通变量(函数局部变量,函数参数) static const 全局变量
栈区:函数局部变量,函数参数
堆区:malloc() free()
堆栈是一块连续的内存空间,栈空间从高地址向低地址增加,堆空间从低地址向高地址增加
15、硬盘
盘面,扇区,磁头
磁盘在旋转的同时,磁头按照扇区寻找数据的
扇区:512字节
组:多个扇区组成组,1K 2K 4K
分区:多个组成为分区
16、阻塞 非阻塞 异步
阻塞:scanf() fgets() getchar()
非阻塞:中断原来的程序,更高优先级的程序先运行,原来的程序在循环查询中断向量表,等中断的返回
异步:DMA(直接的内存访问)是异步。刚开始的时候cpu通知磁盘控制器拷贝数据,然后磁盘控制器开始拷贝数据,拷贝完了以后,磁盘控制器通知cpu。
异步,只关注开始和结束,中间数据运行过程各自忙各自的。
二、标准文件IO
1、按照字符读写
getchar() putchar()
2、按照行读写
fgets() fputs()
3、按照块读写
fread() fwrite()
4、循环读写文件
while(fread()>0)
{
......
}
5、文件拷贝的例子
diff命令比较2个文件是否相同
6、把ini文件转化为html文件
1)ini文件
;stu
[stu]
wangwu = 123456
lisi = 123456
;teac
[teac]
zhangsan = 123456
2)html xml文件
<!__stu__>
<stu>
wangwu=123456
lisi=123456
</stu>
<!__teac__>
<teac>
zhangsan=123456
</teac>
7、系统默认支持的最大文件描述符
stdin 标准输入
stdout 标准输出
stderr 标准错误输出
最大文件描述符的个数
默认情况下是1024个
系统能够支持的最大文件描述符的个数是
cat /proc/sys/fs/file_max
三、系统文件IO
1、文件类型
ls -l
- 普通文件
d 目录文件
c 字符设备文件
b 块设备文件
s socket文件
p 管道文件
l link链接文件
2、链接文件
1)软链接:ln -s oldfile newfile
软链接相当于是快捷方式,软链接和源文件是2个不同的inode索引值 修改都修改
2)硬链接:ln oldfile newfile
硬链接不但但是源文件的拷贝,而且源文件和硬链接文件有一个修改,则另一个相应修改,修改都修改的过程,只有把源文件和硬链接文件都删除,才算把硬链接文件删除;源文件和硬链接文件使用的是同一个inode索引编号,所以说源文件和链接文件是同一个文件的不同表现形式
3)使用ls -li查看链接文件的inode索引编号
3、文件描述符
有2种文件描述符:标准文件描述符和系统文件描述符
标准文件描述符是FILE *fp;
系统文件描述符是int fd;
stdin 0 STDIN_FILENO
stdout 1 STDOUT_FILENO
stderr 2 STDERR_FILENO
4、系统文件IO函数
1)open()
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
返回值:正确返回值是新生成的文件描述符,错误返回-1,并设置errno错误编码
pathname:文件名,可以是相对路径也可以是绝对路径
flags:
O_RDONLY:可读
O_WRONLY:可写
O_RDWR:可读写
O_CREAT:如果文件不存在则创建
O_TRUNC:每次写文件的时候都是重新写
O_APPEND:追加
mode:
111 111 111 777
110 100 100 644
写的时候一般写为0644,第一个0是粘着位
rw-r--r--(0644)
也就是说:
用户:可读可写
用户组: 可读
其他:可读
2)close()
#include <unistd.h>
int close(int fd)
返回值:成功返回0,错误返回-1,并设置错误码errno
3)read()
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
4)write()
#include <unistd.h>
sszie_t write(int fd, void *buf, size_t count);
5)lseek()
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
lseek对socket,管道文件描述符无效
5、errno错误编码
#include <errno.h>
char *str=strerror(errno);
perror("open");