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

Linux--操作系统/进程

ok,我们今天学习linux中的操作系统和进程

1. 冯诺依曼体系

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

内存是CPU和外设之间的一个巨大的缓存!

截⾄⽬前,我们所认识的计算机,都是由⼀个个的硬件组件组成

  • 输⼊单元:包括键盘,⿏标,扫描仪,写板等
  • 中央处理器(CPU):含有运算器和控制器等 
  • 输出单元:显⽰器,打印机等

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

  • 这⾥的存储器指的是内存
  • 不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备)
  • 外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。
  • ⼀句话,所有设备都只能直接和内存打交道

对冯诺依曼的理解,不能停留在概念上,要深⼊到对软件数据流理解上,请解释,从你登录 上qq开始和某位朋友聊天开始,数据的流动过程。从你打开窗⼝,开始给他发消息,到他的 到消息之后的数据流动过程。如果是在qq上发送⽂件呢?

当数据在计算机内部设备流转的时候,本质是在不同的设备间进行拷贝!设备的拷贝效率本质就是计算机的效率

2. 操作系统(OperatorSystem)

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

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

OS的目的

  • 对下,与硬件交互,管理所有的软硬件资源
  • 对上,为⽤⼾程序(应⽤程序)提供⼀个良好的执⾏环境

核心功能

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

面向对象语言

先描述    再组织

面向对象 标准库(STL)

3. 进程

3-1 基本概念与基本操作

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

进程 = 内核数据结构(task_struct) + 程序的代码和数据

对进程的管理就成了对数据的增删查改

3-1-2 描述进程-PCB 基本概念

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

task_struct-PCB的⼀种

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

3-1-3 task_ struct

  • 内容分类
  • 标示符:描述本进程的唯⼀标⽰符,⽤来区别其他进程。
  • 状态:任务状态,退出代码,退出信号等。
  • 优先级:相对于其他进程的优先级。
  • 程序计数器:程序中即将被执⾏的下⼀条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下⽂数据:进程执⾏时处理器的寄存器中的数据[休学例⼦,要加图CPU,寄存器]。
  • I / O状态信息:包括显⽰的I/O请求,分配给进程的I/ O设备和被进程使⽤的⽂件列表。
  • 记账信息:可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
  • 其他信息 • 具体详细信息后续会介绍

组织进程

查看进程

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

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

2. ⼤多数进程信息同样可以使⽤top和ps这些⽤⼾级⼯具来获取

 #include <stdio.h>
 #include <sys/types.h>
 #include <unistd.h>
 int main()
 {
 while(1){
 sleep(1);
 }
 return 0;
 }

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

  • 进程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;
 }

getpid 获得进程的标识符

pid_t id = getpid(); 获得pid

/proc目录/文件夹   Linux中的进程目录

/proc不是磁盘级别的文件,不需要存储任何信息,而是进程文件信息。

.exe

Windows中,执行一个程序,双击.exe文件,本质上就是启动一个进程(两种情况:1执行完就退出 2. 一直不退,直到用户退出----常驻进程(杀毒安全软件))

cwd (current work dir)

当前工作目录,默认创建进程会在当前工作目录

chdir更改进程的目录 

父进程id ppid

在Linux系统中,启动之后,新建任何进程的时候,都是由自己的父进程创建的!

命令行中,执行命令/执行程序, 本质是bash的进程,创建的子进程,由子进程执行我们的代码!

每登陆一次,就会创建一个bash

使用系统调用,创建进程

fork函数

  • 运行 man fork 认识fork
  • fork有两个返回值
  • 父子进程代码共享,数据鸽子开辟空间,私有一份(采用写时拷贝)

fork给父进程返回子进程的pid,给子进程返回0

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

Linux中,所有进程都是树型结构

fork之后通常要用 if  进行分流

#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为什么会有两个返回值?

父进程和子进程代码时共享的,但是数据时各自私有一份的

两个返回值给父子如何返回?

fork给父进程返回子进程的pid,给子进程返回0

少年没有乌托邦,心向远方自明朗!

如果这个博客对你有帮助,给博主一个免费的点赞就是最大的帮助
欢迎各位点赞,收藏关注
如果有疑问或有不同见解,欢迎在评论区留言
后续会继续更新大连理工大学相关课程和有关Linux的内容和示例
点赞加关注,学习不迷路,好,本次的学习就到这里啦!!!

ok,我们下次再见!


http://www.kler.cn/a/585417.html

相关文章:

  • golang算法二叉搜索树
  • 游戏引擎学习第158天
  • 图像分割技术深度解析:语义、实例与全景分割,及FCN、U-Net、Mask R-CNN、UPSNet的应用
  • Pycharm实用技巧
  • 泛目录技术:智能缓存提升网站速度与稳定性
  • 【Qt】QWidget属性介绍
  • 便捷开启 PDF 功能之旅,绿色软件随心用
  • CUDA编程之内存零拷贝技术
  • 保姆级离线TiDB V8+解释
  • C语言练习四(vscode)循环语句专练
  • linux中yum和wget指令的区别
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置
  • 上下左右移动的悬浮框/气泡
  • 基础知识《Redis解析》
  • Linux常用命令速查手册
  • MATLAB中edit函数用法
  • qt style-sheet样式不起作用问答
  • 什么是 Redis
  • HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型
  • 【6】拓扑排序学习笔记