文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux——进程概念(上)

2023-09-17 16:43

关注

文章目录

1. 冯诺依曼体系结构

在这里插入图片描述

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成

关于冯诺依曼,必须强调几点:

  1. CPU读取数据(数据+代码)都是要从内存中读取的。站在数据的角度,我们认为CPU不和外设直接交互
  2. CPU要处理数据,需要先将外设中的数据加载到内存。站在数据的角度,外设直接和内存打交道

 
 

2. 操作系统(Operator System)

2.1 概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。

笼统的理解,操作系统包括:

 

2.2 设计OS的目的

在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件

2.3 如何理解 “管理”

管理是对被管理对象的数据管理
管理理念:先描述,再组织
例如:先对被管理对象进行描述,再根据描述类型,定义对象,可以把对象组织成数组——>对学生的管理工作就变成了对数组的增删查改
Linux内核是用C语言写的struct
OS:内部,一定存在大量的数据结构和算法

2.4 总结

计算机管理硬件:

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他高效的数据结构

 

2.5 系统调用和库函数概念

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
     
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

 
 

3. 进程

我们自己启动一个软件,本质其实就是启动了一个进程
在linux下,运行一条命令,其实就是在系统层面创建了一个进程
linux是可以同时加载多个程序的,linux是肯同时存在大量的进程在系统中(OS,内存)所以必须管理进程

先描述,再组织
进程 = 对应的代码和数据 + 进程对应的PCB结构体

3.1 描述进程-PCB

PCB process control block
本质是一个结构体struct
不同的操作系统中,PCB的名字不一样
Linux:struct task_struct

.exe可执行程序其实本质就是文件:代码+数据

人认识世界,是通过属性来认识的
属性也是数据
文件 = 内容+属性

PCB包含了所有进程属性(struct)
对进程的管理,变成了对进程PCB结构图链表的增删查改
PCB是新增的

3.2 task_ struct内容分类

3.3 组织进程

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

 

3.4 查看进程

ps
ps axj
ps axj | greap ‘myproc’
ps axj | head -1 && ps axj | greap ‘myproc’

top

ls /proc 里面的文件是动态的
在这里插入图片描述
cwd是当前进程的工作目录,一般都是默认打开当前路径

 
 

3.5 杀掉进程

kill -9 id

 
 

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

#include #include #include int main(){        while(1)        {                pid_t id = getpid();//获取的是自己的进程PID                printf("hello world,pid:%d,ppid:%d\n",id,getppid());                sleep(1);        }}

 
 

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

5.1 pid_t fork()

返回值

 

5.2 fork的基本用法

fork之后,代码是父子共享的

先写出程序对应的Makefile
在这里插入图片描述
一下代码的执行情况是打印了两次you can see me !
在这里插入图片描述
 

fork之后有两个不同的执行流

int main(){    pid_t id = fork();    if(id < 0)    {        //创建失败        perror ("fork");        return 1;                }    else if(id == 0)    {        //child process(task)        while(1)        {            printf("I am child,pid: %d,ppid: %d\n",getpid(),getppid());            sleep(1);              }        }    else    {        //parent process        while(1)        {            printf("I am father,pid: %d,ppid: %d\n",getpid(),getppid());            sleep(1);                }        }    return 0;}

 
以下有几个关于frok的问题:

  1. 为什么给子进程返回0,给父进程返回子进程的pid?
    比例,父进程:子进程=1:n
    所以父进程唯一,子进程可以有许多个,为了区分所以需要返回子进程的pid

  2. 为什么有两个返回值?
    因为fork内部父子会各自执行自己的return语句
    返回两次并不意味着保留两次

3 创建进程的时候,OS要做什么?
要先新建一个task_struct

  1. 当我们以及准备return了,我们的核心代码执行完了吗?
    已经完成了
    操作系统和CPU运行某一个进程,本质是从task_struct形成的队列中挑选一个task_struct,来执行它的代码
    进程调度就变成了task_struct的队列中选择一个进程的过程
    只要想到进程,优先想到进程对应的task_struct

  2. 父子进程被创建出来,哪一个会先被执行呢?
    不一定
    是由操作系统的调度器决定的

 

6. linux操作系统的进程状态

6.1 理论状态

在这里插入图片描述
 

进程可以分为前台进程和后台进程(&
./myproc
./myproc &

 

6.2 具体状态:

 
 

6.3 进程状态查看

ps aux / ps axj 命令

 
 

7. Z(zombie)-僵尸进程

一个进程已经退出,但是还不允许被OS释放,处于一个被检测的状态
维持该状态是为了让父进程和OS来回收

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

 

7.1僵尸进程危害

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

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说, Z状态一直不退出, PCB就一直都要维护

一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费。
因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
也会发生内存泄漏

创建一个维持30s的僵尸进程:

#include #include int main(){pid_t id = fork();if(id < 0){perror("fork");return 1;}else if(id > 0){ //parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);}else{printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;}

 
 

8. 孤儿进程

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

为什么要被领养?
未来子进程退出的时候,父进程早已不在,需要领养进程来进行回收

写一个孤儿程序:

#include #include int main(){pid_t id = fork();if(id == 0){//childwhile(1){printf("hello wowo!\n");sleep(1);}}else{//fatherint cnt = 5;while(cnt){printf("I am father: %d\n",cnt--);sleep(1);}}return 0;}

运行程序之后,屏幕上打印五行I am father: cnt–(5,4,3,2,1)
之后就一直在打印hello wowo!
在这里插入图片描述
这里使用ctrl+c也无法终止程序
所以需要杀掉程序的命令 kill -9 id
先使用ps命令查看ID
ps ajx I head -1
ps ajx | head -1 && ps axj | grep myproc
ps ajx | head -1 && ps axj | grep myproc | grep -v grep
while :; do ps ajx | head -1 && ps axj | grep myproc | grep -v grep; sleep 1; echo "**********************************"; done
如上图所示,输入命令 kill -9 69657 就可以杀掉(回收)程序了

 
 

9.进程优先级

为什么要有优先级?
本质原因就是因为CPU是有限的,而进程太多,所以需要通过某种方式竞争资源。

什么是优先级?
确认是谁应该先获得某种资源,谁后获得
(我们是可以用一些数据来表明优先级的)

调度性
优先级——调度指标

9.1 基本概念

9.2 查看系统进程

linux具体的优先级做法:
1优先级 = 老的优先级 + nice值
老的优先级都是80,每次设置优先级,都要从进程最开始的优先级开始设置

在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:
在这里插入图片描述

 

9.3 PRI and NI

PRI,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
NI,就是nice值,其表示进程可被执行的优先级的修正数值

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行

调整进程优先级,在Linux下,就是调整进程nice值
nice其取值范围是-20至19,一共40个级别

 
 

9.4 PRI vs NI

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

9.5 查看进程优先级的命令

while :; do ps -al | head -1 && ps -la | greap myproc; sleep 1; done

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

 
 

10. 其他概念

CPU调度代码
时间片
抢占与出让

切换:
CPU会存在大量的寄存器
如果进程A正在运行,CPU内的寄存器里面,一定保存的是进程A的临时数据
寄存器中的临时数据叫做A的上下文
上下文的数据可以被丢弃吗?绝对不可以!!

当进程A暂时被切下来的时候,需要进程A顺便带走自己的上下文数据
带走暂时保存的目的:就是为了下次回来的时候,能恢复上去,就能按照之前的逻辑继续向后运行,就如同没有中断过一样。

cpu内的寄存器只有一份,但是上下文可以有多份,分别对应不同的进程

来源地址:https://blog.csdn.net/Ll_R_lL/article/details/126364917

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯