在了解进程之前先要知道操作系统的基本原理。

操作系统

操作系统是管理计算机硬件与软件资源的计算机程序,是计算机系统的内核与基石。简单理解就是,操作系统包括内核与其他程序两部分。

  • 内核包括:进程管理、内存管理、文件管理等。
  • 其他程序:库函数、shell程序等。

设计操作系统就是方便用户与硬件进行交互,帮助用户管理软硬件资源。那么怎么管理呢?
例如:学生、班长、班主任,学生被班长管理,班长又受班主任管理,层层递进。
总的来说,操作系统管理软硬件资源,就是先对其进行描述,再对其进行组织管理。

  • 描述起来是用struct结构体。
  • 组织是通过一些数据结构。
    由于操作系统内核中包括进程管理,所以操作系统对进程的管理方式也是,先描述,再组织(将多个进程组织起来)。

进程

概念

进程是一个运行中的程序,但是操作系统将运行中的程序描述起来,通过描述来实现对程序的运行调度,这个描述信息就是操作系统调度一个程序运行的实体。

  • 用户角度:一个运行中的程序。
  • 操作系统角度:运行中程序的描述信息,通过一个task_struct结构体来描述,统称为pcb(也称为进程控制块)。

task_struct中包含的内容(pcb中的内容)

  • 进程标识符
  • 内存指针
  • 上下文数据
  • 程序计数器
  • 优先级
  • 记账信息
  • I/O状态信息
  • 其他信息

操作系统组织进程的方式:通过链表的形式将task_struct结构体存在内核中。

cpu的分时机制(时间片轮转)
cpu对每一个进程的处理时间都非常的短,处理完后,切换下一个进程,不停的进行轮询处理。

进程的查看

  • ps -ef / -aux


    ps -aux查看的信息,比ps -ef多。

进程创建
fork函数,它从存在中的进程创建一个新进程,该新进程称为子进程,原进程称为父进程。

#include <stdio.h>
#include <unistd.h>
int res = fork();

fork返回值:

  • 子进程: == 0
  • 父进程:> 0返回子进程的pid ,< 0 创建子进程失败。

fork创建子进程之后,通常要用if分流

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{//创建一个子进程int ret = fork();if(ret<0){perror("创建失败“);return -1;}else if(ret == 0){printf("子进程 进程ID = %d ret = %d",getpid(),ret);}else{printf("父进程 进程ID = %d ret = %d",getpid(),ret);}return  0;
}

使用fork创建子进程,新的进程(子进程)会复制父进程(代码共享,数据独有),用fork创建出来的子进程,只是拷贝fork函数后面的数据,之前的不会拷贝。

进程状态
进程的状态有:就绪态,运行态、阻塞态。
Linux下进程的状态:

  • R运行态,并不意味着进程一定在运行,有可能进程处于运行队列中。
  • S休眠态,意味着进程在等待某一事件的完成,可以被打断。
  • D磁盘休眠态:不可中断,在该状态下进程一般等待IO操作结束。
  • T停止状态
  • X死亡状态

进程状态查看的方法:ps -aux/-axj

孤儿进程

产生原因:父进程提前退出,子进程就被称为“孤儿进程”,子进程成为后台进程,并且子进程被1号进程所收养,其父进程变为1号进程。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{//创建一个子进程int ret = fork();if(ret<0){perror("创建失败“);return -1;}else if(ret == 0){printf("子进程 进程ID = %d",getpid());sleep(10);}else{printf("父进程 进程ID = %d",getpid());sleep(5);exit(0); //父进程退出}return  0;
}

僵尸进程

子进程退出后,资源没有释放,处于僵死状态。
产生原因:子进程优先于父进程退出,父进程正在执行其他操作,没有关注子进程退出,这时候操作系统为了保护子进程退出的原因,不会释放子进程中的资源,子进程既没有运行,也没有退出,处于僵死状态,成为僵尸进程。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{//创建一个子进程int ret = fork();if(ret<0){perror("创建失败“);return -1;}else if(ret == 0){printf("子进程 进程ID = %d",getpid());exit(0); //子进程退出}else{printf("父进程 进程ID = %d",getpid());sleep(10);}return  0;
}


僵尸进程的危害

  • 如果父进程一直不关注子进程退出,子进程将一直处于僵尸进程。
  • 因为子进程没有退出,所以pcb一直没有被释放。
  • 存在内存泄漏。

怎么避免产生僵尸进程

  • 关闭父进程,当父进程关闭以后,子进程将没有必要保存自己的退出信息。
  • 设置进程等待,等待子进程退出后,通知父进程。

环境变量

在操作系统中,用来指定操作系统的运行环境的参数。

常见的环境变量

  • HOME:家目录。
  • PATH:指定命令的搜索路径。
  • SHELL

查看环境变量

  • echo $name, 通过变量名称,查看指定变量。
  • env:查看所有环境变量
  • export:声明一个环境
  • unset:删除一个临时变量


每个程序都有一个环境表,环境表类似于一个指向数组的指针,在数组中存放一个个环境参数。

查看环境变量的方法:

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

#include <stdio.h>
#include <stdlib.h>
int main()
{char * env = getenv("MYENV"); //getenv访问特定环境变量的接口if(env){printf("%s\n", env);}return 0;
}

由于子进程会复制父进程的pcb,所以父进程的环境变量,子进程可以被继承。

Linux---进程的基本概念相关推荐

  1. linux进程管理基本概念

    linux进程管理基本概念 进程管理 进程树 什么是进程和程序 启动进程 前台启动进程 后台启动进程 创建进程 1 地址空间 2 进程元数据 3 如何创建进程 特殊进程 僵尸进程 孤儿进程 守护进程 ...

  2. linux 进程(一)---基本概念

    一.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 二.进程与程序的区别 程序 ...

  3. linux 进程的基本概念

    进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期. 父进程,子进程 进程都有父进程,父进程也有父进程. 父进程:自己调用fork()来创建一个或多个子进程的进程, ...

  4. Linux进程通信的试验

    1.实验目的 1.1了解Linux进程通信的概念. 1.2 掌握Linux进程通信的常用方法. 2.实验内容 创建admin用户,密码也是admin. 用admin登陆后,创建src目录,所有的源代码 ...

  5. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号

    首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...

  6. 【Linux进程概念】冯 诺依曼体系结构 操作系统 进程 fork 进程状态 优先级

    文章目录 [写在前面] 一.冯 ? 诺依曼体系结构 ?? 体系结构 ?? 数据流向 ?? 实例 二.操作系统 (Operator System) ?? 概念 ?? 计算机体系及操作系统定位 ?? 管理 ...

  7. < Linux >:Linux 进程概念 (1)

    目录 本章重点: 一.冯诺依曼体系结构 二.操作系统(Operator System) 2.1.概念 2.2.设计 OS 的目的 2.3.定位 2.4.系统调用和库函数的概念 三.进程 3.1.进程的 ...

  8. Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)

    日期 内核版本 架构 作者 GitHub CSDN 2016-07-01 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  9. 【Linux从青铜到王者】第五篇:Linux进程概念第一篇

    系列文章目录 文章目录 系列文章目录 前言 一.冯诺依曼体系结构 二.操作系统 1.操作系统的概念 2.操作系统的目的 3.操作系统的定位 4.如何理解管理 5.操作系统总结 6.系统调用和库函数概念 ...

  10. 深入理解Linux进程概念

    Linux进程概念 冯·诺依曼体系结构: 冯诺依曼体系结构作为现代计算机硬件体系结构,规定了现代计算机应该具有哪些硬件单元 输入设备  :键盘,鼠标,图像采集设备  ,声音采集设备 输出设备:显示器 ...

最新文章

  1. 2022-2028年中国IT外包市场投资分析及前景预测报告
  2. php curl hostname,php – 如何解决cURL错误(7):无法连接到主机?
  3. 使用CreateFile读写文件
  4. 三维数组设置索引_python3三维数据结构 —— panel
  5. Oracle的分区表
  6. Python-OpenCV训练一个人脸识别器
  7. github+hexo搭建博客(一)
  8. 工作两年前端经验分享
  9. easyui-filebox java上传附件,在EasyUI项目中使用FileBox控件实现文件上传处理
  10. C语言经典实例003:输出名言
  11. hash函数原理实现
  12. RSA-详解dp泄漏
  13. 【docker系列】docker API管理接口增加CA安全认证
  14. NTVDM CPU 遇到无效的指令的解决方法大全
  15. asdfasdfsd阿萨德发撒的发撒的发撒的发
  16. Qt实现小型的超市收银系统
  17. java计算机毕业设计安路友汽车租赁源码+数据库+系统+lw文档+部署
  18. it在计算机术语表示什么,File
  19. 工业互联网公司寄云科技完成近亿元B轮融资,达晨创投领投
  20. 电脑如何打印文件资料?电脑打印文件资料的教程

热门文章

  1. AIoT催使AI深度场景化,“AI赋能,智联万物——开发者沙龙·南京站”圆满落幕...
  2. 爬虫学习之-Python list 和 str 互转
  3. 《PHP和MySQL Web开发从新手到高手(第5版)》一一1.7 万事俱备,摩拳擦掌
  4. XJTUOJ wmq的队伍(树状数组求 K 元逆序对)
  5. runtime简单的使用解决实际问题(交换方法)
  6. Reading papers_6(Pattern Recognition And Machine Learning一书,ing...)
  7. Linux学习笔记:GDB常用命令
  8. django模型sqlserver_SQLServer数据库入门之django如何连接SQLServer
  9. echart 多柱图只显示部分数据标签_python|读取Excel生成pyecharts动态分析图
  10. 魔术师利用一副牌中的13张红桃c语言,魔术师的猜牌术(1) 魔术师利用一副牌中的13张黑桃 - 下载 - 搜珍网...