Linux操作系统——第一章 进程

news2024/12/27 13:12:06

 

目录

基本概念

描述进程-PCB

task_struct-PCB的一种

task_ struct内容分类

组织进程

查看进程

通过系统调用获取进程标示符

通过系统调用创建进程-fork初识

进程状态

进程状态查看

 Z(zombie)-僵尸进程

 僵尸进程危害

孤儿进程

进程优先级

基本概念

查看系统进程

PRI and NI

PRI vs NI

查看进程优先级的命令

其他概念

环境变量

基本概念 

常见环境变量

查看环境变量方法

测试PATH

测试HOME

和环境变量相关的命令

环境变量的组织方式

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

命令行第三个参数

通过第三方变量environ获取

通过系统调用获取或设置环境变量

环境变量通常是具有全局属性的 

 进程地址空间


 

 


基本概念




课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。


描述进程-PCB



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


task_struct-PCB的一种


在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。


task_ struct内容分类



标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据: 进程执行时处理器的寄存器中的数据。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息



组织进程



可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里



查看进程


1.进程的信息可以通过 /proc 系统文件夹查看

ls  /proc/


如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹

2.top和ps

 查看指定进程pid(sshd)
ps aux | grep sshd



通过系统调用获取进程标示符




进程id(PID)
父进程id(PPID)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    printf("pid: %d\n", getpid());
    printf("ppid: %d\n", getppid());
return 0;
}


通过系统调用创建进程-fork初识



 运行:

 

 


fork有两个返回值
父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

 
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    int ret = fork();
    printf("hello proc : %d!, ret: %d\n", getpid(), ret);
    sleep(1);
    return 0;
}

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    int ret = fork();
    if(ret < 0){
        perror("fork");
        return 1;
    }
    else if(ret == 0){ //child
        printf("I am child : %d!, ret: %d\n", getpid(), ret);
    }
    else{ //father
        printf("I am father : %d!, ret: %d\n", getpid(), ret);
    }
    sleep(1);
return 0;

fork返回值:失败:<0;成功:给父进程返回子进程的pid;给子进程返回0。

两个返回值:return时,父子开始共享,返回值是数据,两个数据不一样,发生了写时拷贝。  

代码共享,只有一份,不被修改。数据共享,会被修改。进程是独立的 ,写时拷贝。



进程状态



R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。 



进程状态查看



ps aux / ps axj 命令


 

 Z(zombie)-僵尸进程



僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态


 

 僵尸进程危害



进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z.

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护
那一个父进程创建了很多子进程,不回收,就会造成内存资源的浪费。因为数据结构对象本身就要占用内存,内存泄漏

fork后,父子谁先运行不确定,由调度器控制  
进程状态信息在task_struct(PCB)。进程状态意义:方便OS快速判断进程,完成特定功能,比如调度,本质是分类  


孤儿进程



父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”
孤儿进程被1号init进程领养,当然要有init进程回收 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if(id < 0){
        perror("fork");
        return 1;
    }
    else if(id == 0){//child
        printf("I am child, pid : %d\n", getpid());
        sleep(10);
    }else{//parent
        printf("I am parent, pid: %d\n", getpid());
        sleep(3);
        exit(0);
    }
return 0;



进程优先级




基本概念



cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。



查看系统进程



在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容 

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值 

PRI and NI



PRI即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
NI就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别。



PRI vs NI



需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
可以理解nice值是进程优先级的修正数据



查看进程优先级的命令



用top命令更改已存在进程的nice:


top
进入top后按“r”–>输入进程PID–>输入nice值




其他概念




竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。不一定同时




环境变量




基本概念 


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



常见环境变量



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



查看环境变量方法



echo $NAME //NAME:环境变量名称



测试PATH



1. 创建hello.c文件

#include <stdio.h>
int main()
{
        printf("hello world!\n");
return 0;
}


2. 对比./hello执行和之间hello执行
3. 为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?
4. 将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:hello程序所在路径
5. 对比测试
6. 还有什么方法可以不用带路径,直接就可以运行呢?



测试HOME



1. 用root和普通用户,分别执行 echo $HOME ,对比差异
. 执行 cd ~; pwd ,对应 ~ 和 HOME 的关系



和环境变量相关的命令



1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量



4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量



环境变量的组织方式


每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串


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


命令行第三个参数

#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声明


通过系统调用获取或设置环境变量


常用getenv和putenv函数来访问特定的环境变量。 

 


环境变量通常是具有全局属性的 


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



 进程地址空间



 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。
OS必须负责将 虚拟地址 转化成 物理地址 。

 同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址


 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RestAPI】优秀Rest API设计规范

一、API 设计原则 将 REST 映射到 DDD 模式 实体、聚合和值对象等模式旨在对领域模型中的对象施加特定的约束。 在 DDD 的许多介绍文章中&#xff0c;模式是使用构造函数或属性 getter 和 setter 等面向对象的 (OO) 语言概念建模的。 设计 API 时&#xff0c;请考虑这些 API…

前后端分离的前端部署渲染方案总结

前后端分离主要是为了区分后端和前端&#xff0c;以前前端代码是直接将HTML和静态文件丢给后端&#xff0c;由后端完成数据动态交互&#xff0c;所以后端既要写后端逻辑&#xff0c;又要写前端的数据交互逻辑。 前后端分离后后端只需要提供接口&#xff0c;前端则必须要完成对…

安装lora+启动lora+训练一个model

一、安装步骤 conda create -n kohya_ss python3.10.8 cd code git clone https://github.com/bmaltais/kohya_ss.git cd kohya_ss 然后修改了setup.sh里面的xformers里面的下载地址&#xff08;因为自带的那个地址&#xff0c;拉取需要1个小时&#xff0c;太慢了&#xff09;…

chatgpt赋能python:Python基础词汇解析

Python基础词汇解析 作为一门流行且易学的编程语言&#xff0c;Python在很多场合得到了广泛的应用。在学习Python编程的过程中&#xff0c;掌握各类基础词汇是非常关键的。本文将介绍Python编程中一些常见且重要的基础词汇&#xff0c;帮助大家更好地了解和掌握Python编程。 …

chatgpt赋能python:Python多级雷达图绘制解析

Python多级雷达图绘制解析 雷达图&#xff08;Radar Chart&#xff09;是一种可视化工具&#xff0c;常用于多个指标的对比展示。与其他图形不同&#xff0c;雷达图中&#xff0c;数据不是放在X、Y轴上&#xff0c;而是以多边形的形式展现。利用Python语言&#xff0c;可以绘制…

chatgpt赋能python:Python声音检测:如何用Python实现声音检测

Python声音检测&#xff1a;如何用Python实现声音检测 声音检测是近年来越来越受到关注的技术&#xff0c;它可以应用在很多场合&#xff0c;如语音识别、安防监控等。Python作为一种强大的编程语言&#xff0c;也可以实现声音检测功能。本文将介绍Python声音检测的原理、实现…

chatgpt赋能python:Python多选:提升代码效率的必备工具

Python 多选&#xff1a;提升代码效率的必备工具 如果你是一个有多年 Python 编程经验的工程师&#xff0c;那么你肯定会知道 Python 多选是一个非常实用的工具。它可以帮助你提高代码的效率&#xff0c;减少编程的时间和工作量。在本文中&#xff0c;我们将介绍 Python 多选的…

模拟实现 Spring IOC(详解)

文章目录 前言Spring IoCSpring IoC 概述Spring IoC 技术难点Spring IoC 框架思考需求分析 Spring IoC 技术难点实现Spring IoC 模拟实现Bean工厂模式实现Bean注解的循环依赖基础建立 前言 Spring是一种 Java 开发框架&#xff0c;其主要功能有两个&#xff1a;IoC(DI)和AOP。…

什么是高并发?

目录 什么是高井发系统 1.1 什么是高井发 1.2 高井发系统有哪些关键指标 1.2.1 响应时间 1.2.2 吞吐量 1.2.3 每秒请求数(QPS) 1.2.4 每秒事务数 (TPS) 1.2.5 访问量 (PV) 1.2.6 独立访客 (UV) 1.2.7 网络流量 1.3 为什么学习高并发系统 1.32在面试中脱颖而出 什么…

Android:Selector + Layer-lists + Shape 实现 “缺右下角Button“

UI需求&#xff1a;实现"缺右下角的渐变Button"效果 实现方式有两种&#xff1a; 一.UI绘制.9背景图&#xff0c;Selector直接实现 二.使用Shape与Selector、Layer-lists实现 UI给的设计稿里没有Button背景图&#xff0c;我用Shape做完了他告诉我他有做背景图&…

字符串搜索算法:暴力搜索,KMP

目录 前言废话暴力搜索KMP算法 前言废话 最近脑子有点昏昏沉沉&#xff0c;喝点那种红枣泡的白酒居然神奇的好了一些&#xff0c;感觉很舒服。看来喝少量的酒可以让人更清醒&#xff0c;长期喝可能有养生的效果&#xff1f; 写道这里去百度了下&#xff0c;发现红枣还真有养生效…

js中this关键字的作用和如何改变其上下文

一、this 关键字的作用 JavaScript 中的 this 关键字引用了所在函数正在被调用时的对象。在不同的上下文中&#xff0c;this 的指向会发生变化。 在全局上下文中&#xff0c;this 指向全局对象&#xff08;在浏览器中是 window 对象&#xff0c;在 Node.js 中是 global 对象&…

CV | Emotionally Enhanced Talking Face Generation论文详解及代码实现

本博客主要讲解了Emotionally Enhanced Talking Face Generation&#xff08;情感增强的谈话人脸生成&#xff09;论文概括与项目实现&#xff0c;以及代码理解。 Emotionally Enhanced Talking Face Generation Paper :https://arxiv.org/pdf/2303.11548.pdf Code: GitHub - s…

ROS:服务数据(srv)的定义与使用

目录 一、服务模型二、创建功能包三、自定义服务数据3.1定义srv文件3.2在package.xml中添加功能包依赖3.3在CMakeLists.txt中添加编译选项3.4编译生成语言相关文件 四、创建代码并编译运行&#xff08;C&#xff09;4.1创建代码4.2编译4.3运行 一、服务模型 Client发布显示某个…

价值8800元SEO自动化养权重流量站课程分享(升级版)!

本来想做培训收8800&#xff0c;但是我怕大伙骂我&#xff08;说我割韭菜&#xff09;&#xff0c;所以我决定免费把这套自动化批量养站的技术和流程详细给大家分享出来。有些朋友可能是手动养&#xff0c;我觉得这种思路是没错的&#xff0c;但是有点鸡肋&#xff0c;先说下缺…

电子科技大学计算机系统结构复习笔记(三):流水线技术

目录 前言 重点一览 流水线定义 基本概念 流水线分类 流水线特点 流水线时空图 流水线性能分析 流水线特点 经典5段流水线RISC处理器 流水线的三种冒险 冒险分类 停顿流水线 结构冒险 数据冒险 控制冒险 流水线处理机的指令系统 流水线指令系统与格式 流水…

nvm安装并配置环境变量使用nvm安装、切换nodejs

目录 第一章 准备工作 1.1 卸载nodejs 1.2 安装nvm 第二章 nvm环境配置 第三章 nodejs安装以及环境配置 3.1 会用nvm常用命令 3.2 nodejs安装 3.3 node环境配置 3.4 遇到的问题 第一章 准备工作 1.1 卸载nodejs 找到自己对应的nodejs文件所在路径 where node 通过控…

Python 异常类型捕获( try ... except 用法浅析)——Don‘t bare except (不要让 except 裸奔)

不要让 except 裸奔&#xff01;裸奔很爽&#xff0c;但有隐忧。 (本笔记适合学完 Python 五大基本数据类型&#xff0c;有了些 Python 基础的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程…

大模型时代的来临:AI如何改变人类生活和经济?

大模型时代的来临&#xff1a;AI如何改变人类生活和经济&#xff1f; 第三次AI浪潮之下&#xff0c;人类面临着前所未有的机遇和挑战。随着人工智能的快速发展&#xff0c;我们开始高度重视其可能带来的负面影响。 最近&#xff0c;AI领域再次引起了全球范围内的关注&#xff0…

机器视觉_HALCON_图像采集接口编程手册_1.第一章节介绍

文章目录 一、前言二、图像采集接口编程第一章2.1 HALCON的通用图像采集接口2.2 图像采集基础2.3 同步抓取 vs. 异步抓取⭐2.4 缓冲策略⭐2.5 A/D转换和多路复用2.6 HALCON图像采集算子⭐2.6.1 open_framgrabber2.6.2 close_framegrabber2.6.3 info_framegrabber2.6.4 grab_ima…