操作系统、进程和线程

144 阅读5分钟

操作系统

应用软件不能直接操作硬件,所有的应用程序对计算机硬件的操作都需要通过操作系统,操作系统可以看作应用程序和硬件之间的一层软件。操作系统有两个基本功能:

1.png

操作系统示意图

1. 防止硬件被失控的应用程序滥用; 2. 向应用程序提供简单一致的机制来操作复杂而大不相同的硬件设备。

操作系统通过进程、虚拟内存和文件来实现这两个功能。文件是对I/O设备的抽象,虚拟内存是对主存和磁盘I/O设备的抽象,进程则是对处理器、主存和I\O设备的抽象表示。

进程

进程是计算机系统对一个正在运行的程序的一种抽象,一个系统上可以同时运行多个进程。大多数系统中,需要运行的进程多于CPU的数量,并发运行则是说一个进程的指令和另一个进程的指令交错执行。CPU通过处理器在进程间切换来并发运行多个进程,这种交错执行的机制被称为上下文切换。

操作系统能够跟踪进程运行所需要的状态信息即上下文,如PC和寄存器文件的当前值、以及主存的内容。因为单核CPU在某一时刻只能运行一个进程的代码。所以当进程切换时,操作系统会把控制权从当前进程转移到某个新进程,即上下文切换,保存当前进程的上下文,恢复新进程的上下文,将控制权移交给新进程,新进程就会从上次停止的地方进行执行。

在linux系统上运行hello程序时的进程变化,首先是Shell进程等待命令输出,输入指令之后系统保存shell进程的上下文信息并将控制权移交给hello进程开始执行hello进程,hello进程终止后,系统会恢复到shell进程的上下文,将控制权交给shell进程。

进程的切换是由操作系统的内核管理的,内核是操作系统代码常驻主存的部分,内核不是一个独立的进程,而是系统管理所有进程所用代码和数据结构的集合。当应用程序需要计算机系统执行读写文件时,应用程序就会执行一条系统调用的指令,将控制权交给内核,内核执行读写操作并返回应用程序。

上下文切换.png

进程的上下文切换

# 线程 在现代系统中,一个进程由多个被称为线程的执行单元组成,每个线程都运行在进程的上下文中,并享有同样的代码和数据。线程比进程更高效,因此多线程比多进程更容易分享数据。 ## 虚拟内存 虚拟内存是一个抽象概念,即每个进程都独立使用主存,每个进程使用的主存都是一样的,称为虚拟地址空间。

虚拟内存.png

进程的虚拟内存地址空间

从图中可以看出,地址空间最上面的区域是保留给i操作系统中的代码和数据的,底部区域保留的是用户进程定义的代码和数据。每个进程的虚拟地址有大量准确定义的区构成,每个区都有准确的功能。

程序代码和数据:对所有进程来说,代码是从同一固定地址开始的,紧接着是和C全局变量相对应的数据位置。代码和数据区是直接按照可执行目标文件的内容初始化的。

:代码和数据区后紧随着运行时堆。代码和数据区在进程一开始运行时被制定了大小。当调用malloc和free这样的C标准函数库时,堆可以在运行时动态地扩展和收缩。

共享库:在地址空间的中间部分,用来存放像C标准库和数学库这样的共享库的代码和数据的区域。

:位于用户虚拟地址空间顶部为用户栈,编译器用它来实现函数调用。和堆一样,用户栈在程序执行时可以动态地扩展和收缩。每次调用一个函数的时候,栈就会增长,从一个函数返回时,栈就会收缩。

内核虚拟内存:地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容和直接调用内核代码定义的函数。而应用程序需要调用内核来执行读写等操作。

虚拟内存的运作需要硬件和操作系统之间进行交互,包括对处理器生成的每个地址进行硬件翻译。其基本思想是把一个进程虚拟内存的内存存储在磁盘上,然后用主存作为磁盘的高速缓存。

文件:文件为字节序列。系统中所有的输入和输出都是通过以小组被称为Unix I/O的系统函数调用读写文件来实现。