当前位置: 首页 > news >正文

Linux 进程(一)

1 操作系统

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

        内核(进程管理,内存管理,文件管理,驱动管理)
        其他程序(例如函数库,shell程序等等)

1.1 管理概念 

        在计算机开启后,第一个被加载的软件就是操作系统。根据上图可以看出操作系统与底层硬件之间还有着各种驱动,操作系统对驱动做管理,驱动再对底层硬件做管理(不包括特殊情况)。

        首先我们要谈的第一个问题就是管理,操作系统是如何管理下层的软硬件呢?

        我们类比校园中的校长和学生的关系,来解释操作系统和底层硬件的关系。

        校长在管理偌大的学校的时候,并不会和每一个学生见面,也并不会深入的了解到每一个学生,那么,学生中的,张三,李四 ... .... 挂科太多被校长开除了,这是为什么呢?因为校长拿到了他们各科成绩的数据!在这种情况下,校长就属于管理者,张三,李四 ... ....属于被管理者。

        此时我们能得出第一条信息,就是管理者和被管理者并不需要见面。管理者的核心工作是做决策,做决策是根据数据来做。

        那么校长又是如何拿到数据的,通过辅导员拿到数据。在开学的第一天你就要填写各种上交你的信息。

        面对这些庞大的数据,校长通过辅导员收集上来的来获取每个学生的信息,表格中的每一项属性都是学生说具有的,只是每个学生的数值是不一样的。

        学校中的学生成千上万,校长的工作也从管理学生,变成管理学生的信息

        此时校长恰好是程序员出身,用学生的属性定义为一个结构体,然后每个结构体里面都有一个指针,指向下一个结构体。校长需要c语言成绩最好的,谁跑步最快的,谁挂科最多,都可以在这张链表中查,当有田径会校长通过查链表就知道派谁去,当考试完成后校长通过查链表就知道,该让谁滚蛋(滚蛋后校长就把该同学的节点删除),这样通过管理数据管理链表,就能实现对学生的管理。校长的工作也就变成对链表的增删查改!

        从上面的分析,我们可以得出。管理者是根据数据做决策,管理者拿到数据通过次级管理者,管理者对人的管理转化成对数据管理。

        我们不妨可以将操作系统看作校长,驱动程序看做辅导员,底层硬件看作学生。操作系统对底层硬件的管理就变成对底层硬件的数据做管理,数据通过驱动程序得到。我们将所有硬件所具有的所有属性定义成为一个结构体,然后每个硬件所具有的独特的属性在他的节点内进行描述!!最后通过指针链接形成链表(简单理解为链表),最后将链表给到操作系统!

        以上操作系统的管理行为成为:先描述,在组织!

    1.2为什么要有操作系统 

        设计OS的目的:

        与硬件交互,管理所有的软硬件资源(对下),
        为用户程序(应用程序)提供一个良好的执行环境(对上)

        良好是指的稳定、安全、高效的。

        当我们再来看这张图的时候就会发现,从最顶端的用户开始,的箭头依次向下。那么能直接访问操作系统,或者程序驱动,或者底层硬件吗?

        不能!!!每个用户都是一个独立的个体!如果任由他们任意的访问操作系统内部!那么其他的用户数据的安全性如何保障!!! 并不是所有的用户和开发者都能够正确的访问驱动和底层硬件的(这些硬件也只有生产该硬件的厂商知道怎么用最好的方式去访问),所以用户和开发者访问就有了一定的成本。操作系统的出现统一了驱动的管理形式。降低了开发者的使用成本使开发变得更加高效同时也能使计算机变得更加稳定。

        对于用户来说操作系统也为其准备了系统调用接口,在系统调用之上,也有库函数、shell外壳之类的。更加便捷了用户的访问。

 2 进程

        概念:

        我们先给出概念:进程 = 内核数据结构 + 可执行程序。

                      或者说    进程 = 内核PCB对象 + 可执行程序。

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

        task_struct-PCB的一种

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

        存在着这样的一个事实,我们可以同时打开qq,微信,王者荣耀。这些程序都在运行着,根据冯诺依曼体系结构,程序需要先被加载到内存上,然后才能被cpu所运行。那么操作系统需不需要管理可执行程序呢?可能是需要的!!操作系统是怎么管理呢?根据我们以上所得出来的结论,是先描述,再组织的!!

        那么为什么可执行程序加载到内存后,变成进程,我们要给每一个进程形成一个PCB对象呢?

因为操作系统需要管理。

        从上面的结构体可以简单的看出PCB是怎么对进程描述以及组织的。

        如果把头节点给到cpu,那么进程就可以跑就起来了。

        

        这个标识符就是pid 那么我们怎么在Linux下看到pid呢。

通过下面两个指令:

 写一段死循环:

        写出来的死循环效果如下: 

       每个进程的创建都有对应的pid ,那么我们该如何看到pid呢?

        指令:

 while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1 ;done

        这一串指令就可以查看到当前运行程序的PID了: 

那么如何证明这个pid 就是当前进程的pid呢?

修改代码:

#include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 int main()5 {6 7   pid_t id = getpid();8   pid_t fid = getppid();9 10 11   while(1)12   {13     sleep(1);14     printf("i am a process,ppid:%d,pid:%d\n",fid,id);              15   }16   return 0 ;17 }

由此我们可以发现:这就是进程中的标示符:也就是我们要找的pid 

http://www.lryc.cn/news/248312.html

相关文章:

  • vue中的keep-alive详解与应用场景
  • 软件设计师——程序设计语言基础(一)
  • Apache简介与安装
  • set与map
  • 基于单片机智能液位水位监测控制系统
  • C#,《小白学程序》第十七课:随机数(Random)第四,移动平均值(Moving Average)的计算方法与代码
  • 行情分析——加密货币市场大盘走势(11.29)
  • C++——string的字符串比较,字符存取,插入和删除和子串
  • 字节10年经验之谈 —— 从0到1开发自动化测试框架!
  • Mysql(基本介绍+下载安装+服务器+基本使用+建库建表+navicat/mybitas工具+外键及实例)
  • Python+requests+Jenkins接口自动化测试实例
  • SpringBoot3核心原理
  • JS常用数据类型转换(数字型和字符串型之间转换)
  • 算法通关村第一关—青铜挑战—用Java基本实现各种链表操作
  • SparkRDD及算子-python版
  • 嵌入式设备与PC上位机通信协议设计的几点原则
  • Go 内置运算符
  • Table和HashBasedTable的使用案例
  • 【执行批处理后 executeBatch() 没反应,一个参数相信就能搞定】
  • 【LeetCode】每日一题 2023_11_25 二叉树中的伪回文路径(dfs,数组/位运算)
  • 什么是海外私人IP代理?是纯净独享的代理吗?
  • Vue组件库推荐:Element UI深度解析
  • Mysql 8.0主从复制模式安装(兼容Mysql 5.7)
  • 基于Django+Tensorflow卷积神经网络鸟类识别系统
  • 史上最全前端知识点+高频面试题合集,十二大专题,命中率高达95%
  • 我叫:基数排序【JAVA】
  • ArkUI开发进阶—@Builder函数@BuilderParam装饰器的妙用与场景应用【鸿蒙专栏-05】
  • 智慧城市内涝积水监测仪功能,提升城市预防功能
  • ISCTF2023 部分wp
  • springboot(ssm毕业生学历证明系统Java(codeLW)