背景
很早就看了《MODERN OPERATING SYSTEMS》和《Operating System Concepts》这两本书本书,当时也做了很多笔记。为了方便自己能更好的温故知新,也为了防止自己的笔记丢失,遂搬到云上(手动狗头)。这是操作系统学习笔记的一个系列,这是第一篇笔记,主要是讲个操作系统的大概,以及它是个什么东西,能做什么,我们平时做开发是怎么和它打交道。
做开发要不要了解OS
答案肯定是要的。其实这个问题和写程序要不要学算法一个道理。如果觉得没用,只能说明你写的程序可能还停留在CRUD阶段(不要打我,没有贬低的意思)。我们都知道,但凡做的稍微深一点,必然涉及到操作系统的知识,比如当Java应用程序假死的时候需要分析线程调用栈,线程的状态其实就是内核线程的映射;又比如CPU占用高时要分析问题在哪儿,你可能要先找到占用cpu的进程或线程,多的就不扯了。
操作系统是什么
我觉得操作系统是用户软件的容器,是用户和硬件的桥梁,如果让每个用户直接操作硬件,用户软件开发是个成本及其高的事,也是不显示的事,因为如果各个软件都可以直接控制硬件,那么也是一件非常危险的事。操作系统提供给软件一个栖身之所,也加快软件开发,因为软件开发只需要调用操作系统提供的接口,而任何的资源访问和调度都有操作系统统一调度,同时也给用户提供一个统一的交互系统。大概就是下面这样
计算机模型
计算机运行模型
计算机组成
硬件
cpu
磁盘
I/O设备(网卡、显示器、键盘、鼠标…)
内存
buses(总线,连接各个硬件设备,使其能相互通信)
…
操作系统(PC主流)
- unix
- linux
- win
软件(各种运行在操作系统之上的程序)
操作系统
操作系统历史
- 第一时代(1945-55):真空管手工时代
- 第二时代(1955-65):晶体管批处理时代,批处理要执行下一个任务必须等待上一个任务执行完成,不能中途切换。
- 第三时代(1965-80):集成电路多道程序系统时代,多道程序系统可以并发执行多个任务
- 第四时代(1980-至今):个人电脑时代,个人电脑的系统强调的是实时交互,因此是抢占式系统,并且提供用户友好的GUI
- 第五时代(1990-至今):移动计算时代
操作系统大观园
- 大型机操作系统:主要提供三类服务,批处理,事务处理,分时系统。典型代表OS/390,逐渐被Linux取代
- 服务器操作系统:为若干个用户提供服务,用户可以共享硬件和软件资源。提供打印服务、文件服务、web服务,这类系统代表Solaris、FreeBSD、Linux和Windows server
- 多处理器操作系统:一种联合多个cpu来获得联合计算能力,现在的个人计算机也有多核cpu,通常windows和linux都可以运行在多核上
- 个人计算机系统:FreeBSD、Linux和Windows和mac OS
- 移动计算机系统:移动设备,手机、平板等,主要是Android和iOS
- 嵌入式计算机系统:这类系统是用来控制设备,通常不允许用户安装软件,像DVD之类的。主要是Embedded Linux, QNX和VxWorks
- 传感器操作系统:通常这类系统是基于事件驱动或者基于内部时钟周期性测量,系统小。代表是TinyOS
- 实时操作系统:这类系统时间是关键参数,比如流水线对时间要求非常严格,实时系统多用于工业。代表是eCos
- 智能卡操作系统:微小的操作系统,运行在智能卡上,有严格的运行能耗和存储空间限制,有些智能卡是面向Java的,其ROM上有JVM
操作系统概念
进程:本质是一个正在执行的程序,它被分配了一个地址空间,可以对该地址空间进行读写。详细的介绍在之后的笔记中
地址空间:早期主存小,程序运行时独占主存,当正在运行A程序时,要运行B程序,则要将A移除,置换B进主存,后期可以多个程序共享主存,后来又发展了虚拟内存技术来解决程序运行需要的内存比主存大的问题。详细介绍在内存管理中介绍
文件:即文件系统,封装了底层复杂的硬件操作,提供给开发人员简单的接口。在文件系统中详细介绍
Input/Ouput:I/O
保护:系统安全性
shell:操作系统的命令解释器
系统调用
操作系统就是封装了硬件的接口而为开发人员提供简单的接口调用,在上边的计算机运行模型图中可以看到,软件是运行在用户态的,而要真正执行硬件控制时是运行在内核态的,因为只要产生系统调用就会从用户态切换到内核态,也就是所说的陷入内核。一个read操作如下图所示
进程管理系统调用
文件管理系统调用
目录管理和文件系统系统调用
其他各种系统调用
总结
操作系统是一个复杂的系统,其主要作用是建立一道用户通向硬件之间的桥梁。一方面管理和调度硬件资源,一方面提供给用户以友好的访问接口。