操作系统简介
操作系统作用
为什么要有操作系统呢?再回答这个问题之前,我们应该想一下没有操作系统,一个程序会怎么样,当我需要将一个数据通过键盘输入然后经过软件处理之后通过网卡传给另外一个电脑上的程序,我们的软件需要实现输入设备的驱动代码,网卡驱动代码,等等很多底层的操作,同时cpu和内存一直被这个程序所占用着,只有等这个程序执行完成之后,我才能执行下一个程序。同时如果代码有bug,很可能会损坏硬件。
知道了没有操作系统的缺点之后,就可以知道操作系统的功能就是解决上面这些问题的。操作系统可以理解为是一个虚拟机,他将硬件资源抽象出来,提供给运行在操作系统上的软件使用。他将cpu,内存,硬盘等资源虚拟化了。我们运行的软件比如浏览器,QQ等都是访问的操作系统提供的虚拟资源,然后操作系统通过他自身的操作将数据映射到真实的物理资源。
虚拟化cpu
我们计算机上可以同时运行多个程序,可以一边听歌,一边用微信聊天,还能同时看视频,那么为什么电脑可以同时处理这么多任务呢?就是因为操作系统将cpu虚拟化了,他将cpu每次执行都划分了一个个时间片,每个时间片由操作系统来调度分配给不同的进程使用。
接下来看一段代码
cpu.go
package main
import (
"fmt"
"os"
"time"
)
func main() {
for{
fmt.Println(os.Args[1])
time.Sleep(1*time.Second)
}
}
将代码编译
go build cpu.go
./cpu a & ; ./cpu b & ; ./cpu c & ; ./cpu d &
在单核处理器上执行上面的程序,会发现,a,b,c,d 是交替输出的。这就是操作系统将cpu 虚拟化了,让程序以为自己单独拥有一个cpu ,单事实上,只是操作系统将一个cpu执行的时间划分了很多时间片,然后将这个时间片分给每个程序使用,由于cpu运行很快,且时间片很短,所以看着像同时在运行的感觉
虚拟化内存
内存也是我们的物理资源,一般我们的个人电脑的内存大小事8g或者16g左右。每个程序运行都要读写内存,如果很多程序同时执行,就需要保证不同程序之间读写的内存是隔离的,A程序不应该能够访问到B程序的内存。操作系统就是实现了这个功能,操作系统维护了一个虚拟内存空间,所有程序访问的内存地址都是操作系统提供的虚拟内存空间上的地址,当程序A 读写内存的时候,其实是访问的操作系统提供的一段虚拟内存地址,当操作系统发现程序A要读写内存,他就会将程序A访问的虚拟地址和真实的物理地址给映射起来,同时去真实的物理地址上读写数据。
持久性
操作系统管理磁盘的软件通常称为文件系统。因为硬盘上的文件不像内存中的信息一样是需要被保护的,相反他是会经常被不同程序访问的,比如一个文本文件,可以被不同的编辑器打开然后操作。为了方便用户对磁盘上的文件进行管理,操作系统将磁盘抽象出来一个虚拟文件系统。
下面是用c代码调用操作系统的借口来再/tmp 文件夹下创建一个file 文件
#include <unistd.h>
#include <stdio.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/types.h>
int main(int argc, char *argv[]){
// 调用open 系统函数,打开文件并创建 | 以只写方式打开文件| 文件不存在则创建 | 将打开的文件清0,00700 权限
int fd = open("/tmp/file",O_WRONLY | O_CREAT | O_TRUNC ,S_IRWXU);
assert(fd>-1);
// 对文件写入hello world,文件缓冲区的大小事13,就是可以写入文件13个字符
int rc = write(fd,"hello world\n",13);
assert(rc=13);
// 关闭文件
close(fd);
return 0;
}
文件系统做了以下工作:
- 确定新数据要存储再磁盘的哪个位置
- 然后再文件系统中对其进行记录
- 向底层存储设备发出 I/O 请求(调用驱动程序)
总结
所以操作系统其实就是取得CPU,内存或磁盘等物理资源,并对他们进行虚拟化。