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

操作系统内核与安全分析课程笔记【2】进程管理与调度

文章目录

  • 基本概念与关键数据结构
  • 进程管理
    • 进程生命周期
    • 进程的关系
      • 进程家族树
      • 线程组
      • 进程组与会话
    • 进程的创建与终止
  • Linux中的线程

基本概念与关键数据结构

进程:静态的,存储在磁盘上的代码与数据。
程序:动态的,执行程序的动态过程,资源分配的基本单位。
线程:调度的最小单位。

Linux内核把进程列表存放在叫作任务队列(task list)的双向循环链表中。这个双向循环链表重的每一项都为task_struct、称为进程描述符(process descriptor)的结构。该结构的定义在<linux/sched.h>中可以查看。一个task_struct在32位机器上大约为1.7KB,其中存储了一个进程状态,进程关系等关键信息。
请添加图片描述请添加图片描述

Linux内核进程描述符:task_struct存储了进程正常运行其功能所需要的信息,其中包括:

  1. 进程属性相关信息: state(状态),pid(进程标识符),flags,exit_code/exit_signal
  2. 进程间的关系:real_parent, children, sibling, group_leader
  3. 进程调度相关信息: prio, static_prio, normal_prio, rt_priority, sched_class, sc, rt, dl, polity, cpus_allowed
  4. 内存与管理相关信息: mm, fs(文件指针),files
  5. 信号相关信息
  6. 资源限制相关信息

进程管理

进程生命周期

在这里插入图片描述
进程有5种可能状态:(ps:可以写一个这5种状态互相转换的代码)

  1. TASK_RUNNING: 可运行态,正在运行或在就绪队列中
  2. TASK_INTERRUPTIBLE:可中断睡眠,被阻塞等待资源
  3. TASK_UNINTERRUPTABLE:不可中断睡眠,对信号没有反应
  4. _TASK_STOPPED:终止态
  5. EXIT_ZOMBIE:僵尸态,进程已消亡,但task_struct结构未释放

进程的关系

进程涉及的关系有3种:

  1. 进程家族树
  2. 线程组
  3. 进程组与会话

进程家族树

线程组

一个线程组中所有线程和该线程组主线程具有相同标识符,即其pid,它被存入task_struct数据结构的tgid字段。同一个线程组的线程通过进程间通信来共享数据。调用getpid()返回当前进程组的tgid,而非每个线程的pid。(ps:这意味着使用getpid()不会把所有线程都返回回来)。

进程组与会话

一个进程组由进程组的leader的pid唯一标识。同时,多个进程可以构成会话,该会话由领导进程的pid唯一标识。

proc1 | proc2 &
proc3 | proc4 | proc5 

在这里插入图片描述
这里proc1和proc2是一个后台进程组,proc3-proc5是一个前台进程组,它们同属一个会话,均在同一个终端运行。

进程的创建与终止

(ps: 这部分代码再多看看)

进程创建包括:fork()和execve()函数族。
进程终止包括:wait()、waitpid()、kill()、exit()函数族。

为了提升效率fork()又拓展为:vfork()和clone()。vfork() 通过保证子进程先运行避免复制浪费,从而提升fork的效率。

进程终止有2种方式:

  1. 主动调用函数终止
    • main函数返回链接程序会主动添加exit()系统调用
    • 主动调用exit()
  2. 被动接收终止信号或异常终止
    • 接收无法处理的信号
    • 产生异常
    • 收到SIGKILL等终止信号

Linux中的线程

linux中线程与进程都由task_struct实现,不同的是线程被视为一个与其他进程共享资源的轻量级进程。

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

相关文章:

  • 看完书上的栈不过瘾,为什么不动手试试呢?
  • AbstractQueuedSynchronizer从入门到踹门
  • 【项目实战】手把手教你Dubbo微服务架构中整合熔断限流组件Sentinel
  • 图像主题颜色提取(Median cut)
  • Python 分支结构
  • 【C++知识点】文件操作
  • VBA小模板,跨表统计的2种写法
  • 部署问题 | 百度LAC安装部署清单
  • 提高办公效率的免费网站有哪些
  • 前端开发者需要掌握的具体内容和步骤
  • 杨校老师课堂之基于File类的文件管理器
  • java面试算法汇总-数组
  • Docker-Mysql主从复制
  • (模拟)1241. 外卖店优先级
  • Linux进程学习【进程地址】
  • 系统调用——文件操作相关函数
  • 做互联网自媒体创业的月薪收入真的能过万吗?
  • Kubernetes (k8s) 污点(Taint)、容忍介绍、示例
  • 多团队协作构建可观测性
  • 100种思维模型之认知资源思维模型-030
  • c/cpp - 多线程/进程 基础
  • 第55章 头像图片的前端渲染显示
  • vue2 使用 cesium 【第二篇-相机视角移动+添加模型】
  • C/C++ 操作ini文件(SinpleIni 跨平台库)
  • Cadence Allegro 导出Design Rules Check(DRC)Report报告详解
  • Java的stream流
  • Mybatis_相关配置解析和ResultMap
  • Python量化入门:利用中长期RSI寻找趋势拐点,抓大放小,蹲一个大机会!
  • 案例14-代码结构逻辑混乱,页面设计不美观
  • 弱监督参考图像分割:Learning From Box Annotations for Referring Image Segmentation论文阅读笔记