操作系统-课堂笔记-进程概述(南航)

这篇博客主要介绍了进程的概念及其在操作系统中的作用,强调了进程作为内存管理的基本单位。文章通过引言中的问题引入进程的必要性,并详细解释了进程如何解决CPU混淆数据与指令、程序自我修改等问题。接着,深入探讨了进程的内存抽象,包括代码段、数据段、堆和栈的划分,以及分段保护机制,通过示例展示了在不同操作系统中尝试修改代码段的后果。此外,还讨论了进程的状态转换和进程控制块(PCB)的重要性。最后,提到了进程创建、终止以及进程切换的概念,引发读者思考进程管理的优化方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程概述

1.引言

首先引入问题,进程是怎么产生的,为什么需要进程?

  1. 我们先回到古老的裸机编程时代,即没有操作系统的时代,我们写的代码(汇编)直接跑在硬件之上。
  2. 裸机编程自由度很大,即内存可以供我们随意使用
  3. 自由使用内存带来一个问题:CPU可能会混淆数据与指令,如果产生混淆会产生无法预料的结果
  4. 自由使用内存带来的另外一个问题:我们的程序可以修改自身,比如修改内存中某一位置的数据,那么可能就将自身代码改变了。
  5. 事实上,Linux内核引导程序部分频繁涉及了修改自身代码。

引入了以上问题以后,我们开始学习进程,进程可以帮助我们解决上述问题。学习过程中注意体会进程是如何帮我们解决上述问题的。

2.进程的概念

  1. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,也可以理解成其是对内存的抽象。
  2. 我们从其定义可以看出,其存在的目的是为了管理资源。想想我们引言中提出的问题,上述问题是不是和资源管理有关联?
  3. 那么我们再思考一个问题,所谓分配资源是分配的哪里的资源?再看看引言中的问题,上述问题是因为内存访问引起的,所以进程涉及的资源分配和管理大多都是针对内存的。
  4. 那么有了进程的概念以后,内存是怎么管理的呢?带着这个问题继续看。

2.1进程的内存抽象

先看一个比较熟悉的结构:
在这里插入图片描述

  • 所谓进程为内存提供了一层抽象,其实就是上述结构,将内存严格划分成各个段。
  • 想想划分成各个段以后,怎么解决我们引言中提到的CPU混淆数据和指令的问题?
  • 根据之前的基础应该能将一些知识串起来:CPU执行的时候在代码段取指令,划分了数据段和代码段CPU就不会混淆数据和指令了,然后再分别对各个段做限制,比如限定代码段是只读的,那么程序就不能修改自身代码了。

各个段的含义:

  • 代码段text:存放代码(指令)
  • 数据段data:存放全局变量,静态变量
  • 堆heap:new,malloc时从堆中申请空间
  • 栈stack:存放局部变量,子函数返回地址

课外充电站

Linux0.11(1991年)版本内核只能管理16M内存,其中0-1M是内核使用的,然后还要划分缓冲区,虚拟盘,其余才是用户使用

在这里插入图片描述

在Linux内核源码中,前几个程序(bootsect.s, setup.s, head.s)是用汇编写的,频繁涉及改动自身代码(移动自身代码的位置)

考题补充:

int a;
void main(){
	int x;
	x=f(1,2);
	printf("%d",x);
}

int f(int b, int c){
	static int d;
	d+=b*c;
	return d;
}

提问:

  1. int a 存在哪个段? — 数据段data
  2. int x,b,c 存在哪个段? — 栈stack
  3. static int d; 存在哪个段? — 数据段data
  4. 这些代码存在哪个段? — 代码段text

2.2分段保护

2.2.1例一

引言中提到,裸机编程中 我们可以用代码修改我们的代码,那么我们在Win10上试试能不能修改自身代码呢?
复制下面代码到devc++中(任何包含C编译器的开发环境均可)

#include<stdio.h>
void f() {
	int i=3;
}

int main() {
	//函数名f不仅仅是函数名,还是函数的入口地址 
	*(int*)f=9;
	printf("after modify");
	return 0;
}

先讲解下程序的含义:f可不仅仅是函数名,它是函数的入口地址,那么*(地址)=xxx就将某个地址的内容修改了。
运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值