目录
前言:
一、 并发
单轨道和多轨道程序设计
单轨道:
多轨道:
二、进程
1.概念:
2.进程状态:
状态转换图
3.进程特点:
4.PCB进程控制块
PCB 进程控制块和文件描述符表
三、虚拟地址空间
虚拟地址空间与进程的关系:
前言:
之前的几篇文章主要介绍了一下Linux的基础知识,本章开始,主要讲解的就是操作系统的知识了,如果学习这方面需要你有一定的编程知识,如果你是刚刚学习的话可以先从C语言开始学习,不然学习这些知识可能会很吃力。
一个正在运行的程序会做一件非常简单的事情:执行指令。处理器从内存中获取(fetch) 一条指令,对其进行解码),然后执行它。完成这条指令后, 处理器继续执行下一条指令,依此类推,直到程序最终完成。 这样,我们就描述了冯·诺依曼计算模型的基本概念。
听起来很简单对吧?但我们将了解到在一个程序运行的同时,还有很多其他事 情也在同步进行——主要是为了让系统易于使用。 实际上,有一类软件负责让程序运行变得容易(甚至允许你同时运行多个程序),允许 程序共享内存,让程序能够与设备交互,以及其他类似的有趣的工作。这些软件称为操作系统(Operating System,OS),因为它们负责确保系统既易于使用又正确高效地运行。
操作系统是管理计算机硬件和软件资源、控制计算机运行的系统软件,它是计算机系统中最基本、最重要的系统软件,它提供了一个让用户与系统进行交互的操作界面。
简单点来说,操作系统就是一堆软件代码,这些代码作为我们用户程序和电脑硬件的中间层,帮助我们更加简单、高效的利用计算机硬件。
一、 并发
例如我们平时用电脑,你可以一边浏览网页,一边听着音乐,一边进行其他操作,如果把这些功能看作是一个进程的话,那么他们怎么做到可以同时实现呢?因为并发
并发是指在同一时间段内,多个任务可以在同一个或多个处理器上同时运行,但不一定是同时开始和结束。
单轨道和多轨道程序设计
单轨道:
程序的执行流只有一条路径,不存在分支或循环结构
所有进程排队执行,假设A阻塞,B就只能等待,即时cpu是空闲状态
多轨道:
允许同时执行多个任务或流程,以提高系统的响应速度和处理能力(并发)
在多道程序设计模型中,多个进程轮流使用CPU(分时复用 CPU 资源)。而当下常见CPU 为纳秒级,1秒可以执行大约 10 亿条指令。由于人眼的反应速度是毫秒级,所以看似同时在运行。
实际上并发是宏观并行,微观串行 。
二、进程
1.概念:
进程是系统进行资源分配的基本单位,是操作系统的基础
其实进程就是一个正在执行中的程序,现在打开电脑的任务管理器,其实每一个正在运行的都是一个进程 。
进程的概念主要有两点:
- 进程是一个实体,每一个进程都有他自己的地址空间,包括文本区,数据区,堆区,栈区
- 进程是一个执行中的程序,程序是一个没有生命的实体,只有处理器赋予程序生命时,他才能成为一个活动的实体
2.进程状态:
- 运行(running):在运行状态下,进程正在处理器上运行。这意味着它正在执行指令。
- 就绪(ready):在就绪状态下,进程已准备好运行,但由于某种原因,操作系统选择不在此时运行。
- 阻塞(blocked):在阻塞状态下,一个进程执行了某种操作,直到发生其他事件时才会准备运行。一个常见的例子是,当进程向磁盘发起 I/O 请求时,它会被阻塞, 因此其他进程可以使用处理器
状态转换图
3.进程特点:
- 动态性:进程是程序的一次执行过程,具有动态性,可以在执行过程中产生新的进程。
- 并发性:多个进程可以同时存在,并且它们之间可以并发执行。
- 独立性:每个进程都拥有自己独立的内存空间和系统资源,不会相互干扰。
- 异步性:进程之间的执行顺序是不确定的,可以异步执行。
4.PCB进程控制块
操作系统负责管理和调度进程,包括进程的创建、终止、挂起、恢复、切换等操作。进程控制块(Process Control Block)是操作系统用来管理进程的数据结构,它记录了进程的状态、优先级、程序计数器、堆栈指针等信息。
PCB 进程控制块和文件描述符表
每个进程在内核中都有一个进程控制块,来维护进程的相关信息,Linux内核的进程控制块时 task_struct结构体。结构体的定义在usr/src/linux-headers-3.*/include/linux/sched.h 。
PCB通常包括以下信息:
- 进程ID(Process ID):唯一标识进程的编号。
- 进程状态:记录进程当前的状态,如新建、就绪、运行、阻塞等。
- 优先级:记录进程的优先级,用于进程调度。
- 程序计数器(Program Counter):记录进程当前执行的指令地址。
- 堆栈指针:指向进程堆栈的顶端,用于保存进程的局部变量和函数调用信息。
- 内存管理信息:记录进程所使用的内存空间和虚拟地址转换信息。
- I/O 状态信息:记录进程当前的 I/O 状态和请求。
- 进程控制信息:记录进程的父进程、子进程等信息。
- 文件描述符:通过文件描述符找到inode,通过 inode 找到磁盘数据块。
操作系统可以通过 PCB 来获取进程的状态信息,并在进程切换时更新 PCB 中的信息。PCB 在操作系统中占用内存空间,因此 PCB 的大小直接影响操作系统的性能和资源消耗。
内核区中很重要的一个就是进程管理,进程管理中有一个区域就是PCB(本质是个结构体):
PCB 中有文件描述符表,文件描述符表中存放着打开的文件描述符,涉及到文件的IO操作都会用到这个文件描述符.
三、虚拟地址空间
虚拟地址空间是计算机体系结构中的概念,用于表示进程在运行时可用于访问内存的地址范围。每个运行的进程都拥有自己的虚拟地址空间,该空间在逻辑上为进程提供了连续的地址范围。
虚拟地址空间一般被分为6个区域:
- 代码区(Text Segment):用于存储可执行程序的指令代码。
- 数据区(Data Segment):包含全局变量、静态变量和常量数据。
- 堆(Heap):用于动态分配内存。在堆中,通过调用像malloc()或new这样的函数来申请和释放内存。
- 栈(Stack):用于存储局部变量和函数调用的上下文信息。每当函数被调用时,栈会自动分配一部分内存用于存储函数的参数、局部变量和返回地址。
- 共享库区域(Shared Libraries):用于存储共享库(如动态链接库)的代码和数据。
- 内核区域(Kernel Space):用于操作系统内核的代码和数据,用户进程无法直接访问。
每个区域在虚拟地址空间中是连续分布的,但它们的物理内存位置可以是分散的。操作系统负责将虚拟地址转换为对应的物理地址,以便进程可以访问实际的内存。
虚拟地址空间与进程的关系:
- 虚拟地址空间既是独立于进程的概念,又是进程中的重要组成部分,为进程提供了独立的内存空间和访问机制。
- 进程的虚拟地址空间分为用户区和内核区,其中内核区是受保护的,用户是不能够对其进行读写操作的。
- 然而,在实际的操作系统中,虚拟地址空间是作为进程的一部分而存在的。每个运行的进程都有自己的虚拟地址空间,用于存储其代码、数据和堆栈等信息。操作系统通过虚拟内存管理机制将进程的虚拟地址转换为对应的物理地址,以便进程可以访问实际的内存。