理解进程

计算机系统中最著名的冯诺依曼体系包括输入输出设备、cpu、存储器。
1.cpu:cpu作为计算机的运算中心主要工作就是完成一些运算,在我们现在的生活中一台设备中会包含不止一个cpu,与此同时cpu也具有一定的存储功能,但是存储量很小,cpu中的寄存器就发挥着这样的作用,他们的特点是空间小、访问快。
2.存储器
①内存:
存储大小相对外存小,cpu可以直接访问、速度快、断电后数据不会被保存
②外存:
存储空间相对于内存大、cpu不能直接访问,必须要先加载到内存中才能访问、访问速度慢、断电后数据会被保存
比如说有一个可执行程序,那么实际上它是在外存中存放的,只有在执行它的时候才会被加载到内存,这个时候如果我们删除它是不会影响它的执行的。
那么什么又是操作系统呢?
我们讨论的Linux就是一个操作系统,简单来说就是一个管理硬件和软件资源的东西。我们可以用一张图来理解一下:

通过这张图我们可以将这些部分简单的分成三个部分:用户接口即用户部分、系统调用操作系统以及驱动程序代表的是系统软件部分、底层硬件即硬件部分,从这个图我们就可以看到操作系统是怎么将软硬件和用户部分管理起来的,它其实就是起着一个桥梁的作用。
同样我们也要理解系统调用和库函数的概念:
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
所以,计算机管理硬件就是通过描述加组织的方式



那么什么是进程呢?简单来说就是程序执行的实例,站在系统的角度进程就是分配系统资源的实体,我们一打开机器就会启动很多进程。我们在Windows中可以启动任务管理器来查看进程,在Linux中可以用指令ps(aux)或top查看进程,进程的管理也是通过描述(结构体)加组织(双向链表),我们下面详细讨论。

描述进程

在Linux中描述进程是将其信息放在一个结构体中(task_struct),我们通常叫它PCB,这个结构体内的内容有:

  • 进程标识符(进程号)
  • 内存指针:包括程序代码和进程数据的指针,告诉进程代码/数据在内存中的位置
  • 状态:进程的状态
  • 上下文信息:进程执行时处理器的寄存器中的数据
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序即将被执行的下一条指令的地址
  • 记账信息:进程在cpu上执行了多久的时间统计

我们详细讨论一下这些信息:
1.进程号唯一标识一个进程,就像人的身份证号码,进程号与进程一一对应。可以在代码中通过getpid()/getppid()这两个函数获取自身进程号和其父进程号。
2.进程状态有
①:R(就绪状态)
在就绪状态队列中,不一定是在运行
②:S(睡眠状态)
进程在等待事件完成,代码中可以使用sleep来模拟出这个状态
③:D(深度睡眠状态)
也可以叫磁盘休眠状态,这个时候通常是进行大规模IO操作时
④:T(停止状态)
⑤:t(跟踪状态)
在调试时会是这个状态
⑥:Z(僵尸状态)
a.产生原因
当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态,比如可以在让父进程休眠而让子进程什么都不做直接退出,此时的子进程就是僵尸进程。
b.解决方式:
而僵尸进程是无法用kill指令杀掉的,只有让其父进程退出(回收掉子进程的资源)子进程才会退出,但这是种非常暴力的做法,我们通常是在父进程使用wait函数来等待子进程退出再执行父进程后续的逻辑,这样就很好的的避免了僵尸进程。
c.僵尸进程的危害
想象一下一个父进程创建出很多子进程而不去回收,这个子进程会开辟空间占用内存,就会导致内存的浪费,进而导致内存泄露。
进程状态大致就这么多吗,但有一种特殊的进程叫做孤儿进程,如果父进程提前退出而子进程还在运行,此时的子进程就被叫做孤儿进程,那么回收它的将不是它的父进程,而是由一号进程(init)领养回收。

3.进程优先级
进程在运行时分为并行式和并发式两种,并行指的多个进程在多个CPU下分别,同时进行运行;并发指的时一个cpu执同时行多个进程(一会儿执行这个,一会儿执行那个),显然并发式的执行方式更加普遍,毕竟一个进程配置一个cpu的话造价贵嘛,所以程序优先级记录的就是进程执行的先后顺序,比如某一进程执行时间长而某一进程执行时间段,不如将时间段的这个进程优先级提高,毕竟它也要想用资源嘛。
使用ps -l这个命令可以显示进程的信息,PRI所对应的就是这个进程的优先级,值越小代表优先级越高,NI对应的值代表修正值,真实优先级就是PRI+NI 后的值。



环境变量
什么是环境变量呢?我们可以将环境变量理解为系统的视线范围,当程序配置进环境变量时就进入了系统的视线范围。
环境变量可以通过env命令去查看,也可以通过echo $去查看具体某个环境变量的值,每个程序都有一张环境变量表,这个环境表是资格字符指针数组,以NULL 结尾,里面保存的就是环境变量的信息(以键值对保存)。
虚拟地址空间是通过页表这样的结构映射到对应的物理存储空间,物理地址用户一般看不到,由系统进行管理。

原文地址:https://blog.51cto.com/14239789/2466099

时间: 2024-10-02 07:35:03

理解进程的相关文章

深入理解进程和线程

关于进程和线程,大家总是说的一句话是“进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元”.这句话理论上没问题,我们来看看什么是所谓的“资源”呢. 什么是计算机资源 经典的冯诺依曼结构把计算机系统抽象成 CPU + 存储器 + IO,那么计算机资源无非就两种: 1. 计算资源 2. 存储资源 CPU是计算单元,单纯从CPU的角度来说它是一个黑盒,它只对输入的指令和数据进行计算,然后输出结果,它不负责管理计算哪些”指令和数据“. 换句话说CPU只提供了计算能力,但是不负责分配计算资源.

计算机底层知识拾遗(二)深入理解进程和线程

关于进程和线程,大家总是说的一句话是"进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元".这句话理论上没问题,我们来看看什么是所谓的"资源"呢. 什么是计算机资源 经典的冯诺依曼结构把计算机系统抽象成 CPU + 存储器 + IO,那么计算机资源无非就两种: 1. 计算资源 2. 存储资源 CPU是计算单元,单纯从CPU的角度来说它是一个黑盒,它只对输入的指令和数据进行计算,然后输出结果,它不负责管理计算哪些"指令和数据". 换句话

一文理解进程与线程 ---操作系统

进程与线程 进程: 百度百科的定义:   进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 个人理解: 进程是可并发程序执行的时候的一个实例.从内核的观点看,进程的目的就是分配系统资源(CPU时间,内存等)和调度的基本单位 线程: 百度百科的定义:  

初次理解进程和程序

通过学习<深入理解计算机系统>后自己理解的进程和程序. 专业一点就是:1.程序的一个执行实例. 2.能分配处理器并由处理器执行的实体. 3.担当分配系统资源(CPU时间,内存)的实体. 通俗的来说  :1.进程就是正在执行的程序. 2.进程是动态的,程序是静态的.(也是实质的区别) 下来说下一个进程的过程(内存方面).

通过一个可执行文件被执行的过程理解进程的深刻性

不知大家在平时想过没有,我们放在磁盘(之前我一直认为Windows的C盘是主存,DEF盘是磁盘,哈哈,应该没有像我这样无知的人吧)上的一个可执行文件(或者应用程序)是如何得到执行的,而且为什么我们在写程序的时候怎么感觉程序中的一些变量的地址好像在各个不同的程序中都差不多,同时这个地址到底真正对应的是什么?是我们可执行文件对应所在位置的磁盘地址吗?下面我就以Linux为平台(Windows也一样,只是将命令方式变为图形方式了)为大家详细讲解一下一个可执行文件是如何得到执行的. 在Linux中当我们

如何更直观理解进程、线程、事务的概念

开门见山:我对进程.线程.事务的理解是,它们都是一个执行者.虽然在java的api里面定义了Executor类,不过我们现在谈论的执行者的概念与java语言没有关系,注意区分不要混淆. 在现代操作系统中,进程的概念特别重要,各种操作系统教材都会花不少笔墨来讲解这个概念,然而书中的定义往往很不直观甚至冗长,它们时常给出这样的描述,“操作系统资源调度的基本单位”,我不是说这样的描述有错,而是说这样的描述不直观,如果我们这样来描述:“进程是一个执行者,它负责执行被代码定义了的过程”,或者更简洁的表述为

CSAPP Lab:Shell Lab——理解进程控制的秘密

本次实验目的是完成一个简单的shell程序,解析命令行参数,理解并使用(fork,execve,waitpid)常见的多进程函数,了解linux进程组,以及前台进程和后台进程的相关概念,理解linux的信号机制(包括发送信号,接受信号,阻塞信号等).实验提示以及详情请阅读CMU的实验指导:http://csapp.cs.cmu.edu/public/labs.html . 我们要完成的shell并不是从0开始,实验本身已经帮你完成了一部分内容,并且提供一些工具函数,我们要做的是实现一下这几个核心

【多线程】的简单理解&amp;进程 and【你的电脑是几核的?】

相信大家会经常听到线程或者进程两个概念,我们先来看看进程 什么是进程?进程,顾名思义就是正在进行中的程序,也可以说是正在运行的程序. ctrl+alt+delete三个键一起按,看windows任务管理器(其实某个程序死机时常通过这种方式关闭程序)我们可以看到下图: 你可以发现你的电脑同时运行多个进程.以前单核的计算机来说,同一时刻cpu只能响应一个服务. 那为什么可以同时运行多个进程呢?同时播放音乐,同时编写程序,同时后台运行代码... 上图cpu的使用记录看出,图中标示的1,2,3,4是指电

《Linux内核分析》MOOC课程之从迷你Linux内核角度理解进程时间轮片调度(未完)

代码分析 mypcb.h mymain.c 上面这段代码主要完成了对0号进程的初始化,即pid置为0,状态state置为0(即runnable状态),进程入口及当前进程的线程的ip指向my_process,线程的sp指向当前进程的进程堆栈,由于目前只有0号进程,所以next指针指向自己形成一个单PCB链表. 上面这段代码主要是扩充循环链表,使用memcpy()复制0号进程的状态给创建的从1号到MAX_TASK_NUM-1号进程,并与0号进程一起构成一个循环PCB链表. 上面这段代码功能是从循环P