Linux——进程概念

冯诺依曼体系结构

五大硬件单元:输入设备,存储器,运算器,控制器,输出设备
内存特性:

易失性介质——断电丢失
数据的存储使用硬盘,数据的中间缓冲用内存

需要注意几点
这里的存储器指的是内存;不考虑缓存情况,这里的CPU只能堆内存进行读写操作,不能访问外设;外设要输入或输出数据,也只能写入内存或从内存中读取;即所有的设备都只能直接和内存打交道。

操作系统(OS)

概念:OS是计算机硬件上的第一层软件,负责管理计算机上的软硬件资源

设计OS的目的:

与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境

定位:让计算机更加好用

计算机是如何管理这些软硬件资源的?

管理者需要将被管理者描述起来,通过描述信息对管理者进行管理

管理:描述被管理对象(用struct结构体)+组织被管理对象(链表或其他高级数据结构)
系统调用:操作系统向用户提供的用于访问内核的接口
库函数:针对典型功能的封装接口
库函数与系统调用的关系:库函数封装了系统调用接口
在这里插入图片描述

进程概念

进程:在用户的角度是运行中程序,但是在操作系统的角度,是程序运行的动态描述-PCB(进程控制块),其中包含程序运行的各项信息,实现操作系统对于运行中程序管理
**进程特征:**进程和程序是两个截然不同的概念,除了进程具有程序所没有的PCB结构之外还有下面的一些特征。

动态性:进程的实质是进程实体的执行过程,因此,动态性就是进程的最基本的特征。动态性还表现在:“他又创建而产生,由调度而执行,由撤销而消亡”,可见,进程实体有一定的生命期,而程序则只是一组有序指令的集合,并存放于某种介质上,其本身并不具有活动的含义,因而是静态的。
并发性:是指多个进程实体同存在于内存中,且能在一段时间内同时运行。引入进程的目的也正是为了使其进程实体能和其他进程实体并发执行。
独立性:在传统的OS中,独立性是指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行。
异步性:是指进程是按异步方式运行的,即按各自独立的,不可预知的速度向前推进。正是源于此因,才导致了传统意义上的程序若参与并发执行,会产生其结果不可在现性。为使进程在并发运行时虽具有异步性,但仍能保证进程并发执行的结果是可在现的,在OS中引进了进程的概念,并且配置相应的进程同步机制。

程序:软件-就是程序员所写的代码,程序本质上都存储在硬盘。基于冯诺依曼体系,程序运行,首先要将程序从硬盘加载到内存中
CPU分时机制:让每个程序的运行在CPU上只占有很短的一段时间(时间片),切换运行
描述进程-PCB:

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

PCB描述信息:标识符-PID,内存指针,程序计数器,上下文数据,进程状态(描述了当前进程如何被调度),进程优先级,IO信息,记账信息

task_ struct内容分类

标示符: 描述本进程的唯一标示符,用来区别其他进程。

状态: 任务状态,退出代码,退出信号等。

优先级: 相对于其他进程的优先级。

程序计数器: 程序中即将被执行的下一条指令的地址。

内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

其他信息

进程状态

描述进程当前处于什么状态应该如何被操作系统调度管理
进程的基本状态:就绪,运行,阻塞

Linux分类:

运行态-R:正在运行的,以及拿到时间片就能运行的

可中断休眠态-S:可以被打断的阻塞状态

不可中断休眠态-D:不可被打断的阻塞状态

停止态-T:停止运行

僵尸态-Z:程序推出后的中间等待处理状态

僵尸进程:僵尸态的进程,退出后资源没有完全被释放的程序

产生原因:子进程先于父进程退出,为了保存自己的退出返回值,因此没有完全释放资源,等待父进程处理。

避免:进程等待

处理:退出父进程

危害:资源泄漏(内存+进程数量)

孤儿进程
父进程先于子进程退出,子进程成为孤儿进程
特性:运行在后台,父进程成为1号进程;孤儿进程退出不会成为僵尸进程

守护进程-精灵进程:是一个特殊的孤儿进程,运行在后台,与终端脱离关系。(daemon)

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

父进程先退出,子进程就称之为“孤儿进程”

孤儿进程被1号init进程领养,当然要有init进程回收喽

环境变量

保存程序运行环境的变量 环境变量具有进程传递特征,可以通过环境变量给进程传递一些数据
环境变量相关指令:

env:查看所有的环境变量

set:查看环境中所有的变量

echo:打印某个指令变量的数据

export:用于声明环境变量

unset:删除变量

基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见环境变量

PATH : 指定命令的搜索路径 [重点]

HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

SHELL : 当前Shell,它的值通常是/bin/bash。

环境变量的特性:具有进程之间的传递性(父子进程之间,由父进程传递给子进程)

和环境变量相关的命令

  1. echo: 显示某个环境变量值[重点]
  2. export: 设置一个新的环境变量[重点]
  3. env: 显示所有环境变量[重点]
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

通过代码如何获取环境变量

命令行第三个参数[重点]

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
	int i = 0;
	for(; env[i]; i++){
		printf("%s\n", env[i]);
	}
	return 0;
}

通过第三方变量environ获取

#include <stdio.h>
int main(int argc, char *argv[])
{
	extern char **environ;
	int i = 0;
	for(; environ[i]; i++){
		printf("%s\n", environ[i]);
	}
	return 0;
}

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

程序地址空间

程序地址空间:进程地址空间每个进程都有一份(以32位操作系统为例)
在这里插入图片描述
操作系统给每个进程虚拟一个独立的完整的虚拟地址空间,让每个进程都可以访问自己独立的连续的虚拟地址,但是实际的数据存储可以经过映射之后,可以存储到物理内存的任意位置不用连续,实现数据在物理内存上的离散式分布。 离散式存储提高了内存利用率

虚拟地址空间——实际上就是一个地址空间的描述

struct mm_struct

程序地址空间,本质上是操作系统为进程通过 mm_struct 描述的虚拟地址空间,让每个进程都能访问一个独立的完整的连续的虚拟地址,经过映射之后,(作用:)实现物理内存上的离散存储,提高内存利用率,提高了内存访问控制。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
	pid_t id = fork();
	if(id < 0){
		perror("fork");
		return 0;
	}
	else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
		g_val=100;
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}else{ //parent
		sleep(3);
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}	

上面代码父子进程,输出地址是一致的,但是变量内容不一样。所以得出结论:

变量内容不一样,所以父子进程输出的变量绝对不是同一个变量但地址值是一样的,说明,该地址绝对不是物理地址!

在Linux地址下,这种地址叫做虚拟地址

我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

OS必须负责将 虚拟地址 转化成 物理地址 。

进程地址空间

分页&虚拟地址空间 图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯火不熄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值