【linux】 进程概念一 【图文+代码】

3 篇文章 0 订阅
2 篇文章 0 订阅


前言

进程是操作系统的概念,每当执行一个程序时,对于操作系统来讲就创建了一个进程。进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。在这个过程中伴随着资源的分配和释放。


提示:以下是本篇文章正文内容,下面案例可供参考

一、冯诺依曼体系

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

体系的构成 :运算器,存储器(RAM 和 ROM),控制器,输入设备,输出设备
才能开始播出在这里插入图片描述红线代表: 控制信号
黑线代表: 数据信号
存储器:进行中间数据的缓冲
运算器:进行数据运算 运算器+控制器=CPU
控制器: 进行设备控制
注意:

所有的设备都是围绕储存器工作的。
cpu不会直接从输入设备获取数据进行处理,而是先把数据放到存储器中,cpu从存储器中获取数据处理,cpu不会直接将数据交给输出设备进行输出,而是先把数据报道存储器中,控制输出设备从存储器中获取数据输出

关于冯诺依曼,必须要注意几点
_
1.这里的存储器指的是内存
2.不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
3.外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
4.一句话,所有设备都只能直接和内存打交道。_

二、操作系统

1.操作系统是什么?

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell程序等等)

简单的说 :操作系统就是一个搞管理的软件 专门负责管理计算机上的软硬件资源。

2.如何管理

操作系统管理软硬件资源的方式:
  管理 = 描述 + 组织
 描述 :struct task_struct 用结构体来进行抽象的描述
 组织 :操作系统是用双向链表来组织进程的PCB

操作系统会向外提供访问内核的接口–每个接口完成的功能都是固定–系统调用接口
库函数与系统调用接口的关系:库函数封装了系统调用接口

具体如何描述 管理在下面进程里

三、进程

1.进程概念

1.进程就是运行起来的程序,程序运行起来需要被加载到内存中。
2.进程和程序的区别:
  程序是一个文本文件,是静态的 ;而进程是程序执行起来的一个实体(要创建一个task_struct结构体)
  
  
  在这里插入图片描述
操作系统中的进程都是同时运行的。

2.进程如何做到同时运行及管理

cpu的分时机制:实现系统同时运行多个程序的技术

cpu进行程序运行处理的时候,并不会一次性将一个程序运行完毕才会运行下一个,而是每个程序都只运行一段很短的时间(给一个程序分配的一个时间片) ,时间片运行完毕则由操作进行调度,让另一个程序的代码数据在cpu上进行处理)

要注意的是:

CPU只负责执行给他的指令,处理数据,但是处理那个数据CPU并不关心
那么问题来了 CPU下来怎么知道要执行哪一个程序呢?

这里就引入到了PCB

           pcb就像一个指针 指向运行中的程序,并且记录每个程序的信息
           (运行到哪里,下一次运行什么时间,程序的位置......)
           这就是上面提到的描述:就是一个程序运行过程的动态描述。
           而通过这个描述(pcb) 操作系统才能实现程序的管理和调度

既然有了描述,那么就有了组织管理

首先就会把这些描述用链表或其他高效的数据结构组织起来。(就像学生的档案柜一样,将描述好的学生档案,按班级1——~班 分别组织起来,在存到档案柜里管理起来)。
比如下次要运行的话,只需要提供特定的命令,系统就会给出特定的接口,通过接口去实现进程的管理。(就好像要知道某某同学的状况,只需给出几年级,几班,这样就会在档案柜里直接查到,做出相应的处理)

一句话:

对操作系统来说:管理程序的运行,就是将程序的运行过程描述起来,然后组织起来进行管理,描述的运行信息对操作系统来说就是运行中的进程。

描述进程 :
  标识符: 与进程相关的唯一标识符,用来区别正在执行的进程和其他进程。
  状态: 描述进程的状态,因为进程有就绪,阻塞,运行等好几个状态,所以都有个标识符来记录进程的执行状态。
  优先级: 如果有好几个进程正在执行,就涉及到进程被执行的先后顺序的问题,这和进程优先级这个标识符有关。
  程序计数器: 保存程序执行的下一条指令。
  内存指针: 该指针指向程序地址空间 ( mm_struct )
  上下文信息: 进程执行时处理器的寄存器中的数据。
  I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等。
  记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
cpu密集程序 :程序大量时间都在使用CPU进行计算(逻辑计算和算术计算)
IO密集程序 :程序大量时间都在和磁盘打交道,进行IO
进程的执行方式 : 抢占式执行
并行 : 在同一时间,多个进程,每一个进程都拥有一个CPU进行运算
  并发 : 多个进程,只拥有少量CPU,每个进程只能独占CPU一小会,就会让出CPU供其他进程运算。

四、进程状态:

查看进程信息: ps -ef | grep
ps -aux
前台进程: 当前占据了终端的进程
进程状态: 进程状态用于描述操作系统应该如何去处理进程,描述了-一个进程什么时候能够干什么,是否能够被调度处理
状态的种类: 运行,就绪,阻塞


1.linux下对进程状态进行了细分:

运行-R: 包含正在运行以及就绪,运行态就是一个进程拿到时间片就能进行数据处理的状态
可中断休眠- S: 指的是休眠既可以唤醒条件自然满足后唤醒,也可以中间打断,被中断后置为运行态
休眠: 暂时不需要cpu调度运行,让出cpu资源,休眠也有唤醒条件,操作系统调度程序运行的时候,会查看状态,如果是休眠,就会看唤醒条件是否满足,如果满足,则置为运行状态,进行处理,如果不满足则切换下一个进程
不可中断休眠-D: 必须等到唤醒条件自然满足之后才能置为运行态(不能被中间打断)
停止-T: 停止与休眠不- -样(休眠操作系统会去查看进程唤醒条件是否满足,而停止是只能手动唤醒)
僵尸状态Z: 描述的是一一个进程退出了,但是进程资源没有完全被释放,等待处理的一种状态

2.特殊进程:

僵尸进程: 处于僵尸状态进程,退出了但是资源没有完全被释放的进程。
**危害:**资源泄露(可能会导致正常进程起不来)
产生: -个进程先于父进程退出,父进程没有关注子进程退出状态,导致子进程资源无法完全被释放,进入僵尸状态
孤儿进程: 父进程先于子进程退出,子进程就会成为孤儿进程;
特性: 让出终端,进入系统后台运行,并且父进程成为1号进程

#include<stdio.h>
#include<unistd.h>
int main (int argc, char *argv[]) 
{
    pid_ t pid = fork();//创建子进程
//因为子进程复制了父进程,因此子进程与父进程运行的代码以及运行的位置都是一样的
//从代码运行的角度来看,就都是从fork函数之后开始运行的
//因为父子进程运行的代码数据都一样,因此无法直接分辨,只能通过返回值判断
//对于父进程fork返回值>0;对 于子进程返回值==0
//虽然父子进程代码相同,但是因为返回值不同,因此会各自进入不同的判断执行体
     if(pid>0)
    {
        //this is parents
        printf("this is parents:%d\n" ,getpid());
    }
    else if (pid == 0) 
    {
        //this is child
        printf("this is child:%d\n", getpid());//getpid() 获取调用         的标识符-pid-进程ID[
    }
    else 
    {
        //error
        printf("error\n");
    }
     return 0;
}

为什么要创建子进程的原因:
子进程干的事情与父进程一样,当然使用返回值分流后可以有所不同
有任务了,创建一个子进程,让子进程去完成任务,出问题了崩溃的就是子进程,父进程就不会崩溃了(保护父进程-分摊压力)


五、环境变量:

1.基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

2.常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

3.相关命令

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

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

1.命令行第三个参数

#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;
}

2.通过第三方变量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;
}

环境变量通常具有全局属性,可以被子进程继承下去

以上是我关于进程和一些相关知识的了解和总结,如有错误,欢迎大家指正。
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值