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

Linux系统编程-DAY04

一、进线程
    1..进程:正在运行的程序(从运行开始到结束)
    pcb 块是一个结构体, process control block,pcb中放了个文件fds相关的,还放了信号signal相关的
    PID是进程标识符
    当前工作路径:chdir(只做了解)
    umask   0002  (只做了解)
    进程打开的文件列表, 文件IO中有提到,每开一个文件,pcb块都会有记录
    用户id,组id
    进程资源的上限
    命令:ulimit -a 显示进程的资源限制

2.进程和程序的区别
    程序是静态的。存储在硬盘中代码,数据的集合
    进程是动态的。程序执行的过程,包括进程打的创建、调度、消亡    .c   ---->  a.out --- > process(pid)
    没走起来的叫程序,走起来的叫进程
1)程序是永存的,进程是暂时的
2)进程有程序状态的变化,程序没有
3)进程可以并发,程序无并发
4)进程与进程会存在竞争计算机的资源
5)一个程序可以运行多次,变成多个进程
      一个进程可以运行一个多个程序

3.内存分布:
        ELF是a.out的可执行文件(windos中是exe)
            stack  8M  
            mpa/share  映射区和共享区    (kernal 中  libc.so需要用的时候会共享过来(只读))
               heap   堆区(动态内存空间)
            data    数据段(全局变量 、 static静态变量)    
            code   代码段(只读特性)
        内存开始的地址是0G,结束的地址是3G,内核是3G,结束的位置是4G
  MMU(内存管理单元):把物理地址转为虚拟地址    
    虚拟内存(1 透明, 2 隔离, 3 权限)
    进程的分类:1.交互进程  2. 批处理进程 shell 脚本  3.守护进程(程序走起来不需要输入)
      

4.进程的作用:并发

5.  进程的状态:就绪 -> 执行态 -> 阻塞(等待,睡眠)基本操作系统。
    linux中的状态,运行态,睡眠态,僵尸,暂停态 

6.进程的调度,进程上下文切换
    先来先服务、短任务优先、优先级(时间片)
    实时:rr(时间片轮转): 每个进程分配固定的时间片、 fifo
    分时:other、batch、idle
宏观并行,微观串行

7.查询进程相关命令
    ps.aux
    1)就绪态、运行态 R
    2)睡眠态、等待态
       可唤醒等待态S
        不可唤醒等待态  D
    3)停止态  T
    4)僵尸态 Z
    5)结束态

8.top  根据CPU占用率查看进程相关信息

9. kill 和 killall发送一个信号
    kill -9 PID
    killall  -9  code

10.fork()
1)pid_t fork();  叉子
      ./a.out就是一个进程,再用fork就是子进程
    调用一次会返回俩次
    操作系统可能让父进程先走或子进程先走,顺序不确定。
    变量不共享
    子进程复制父进程的0到3G空间和父进程内核中的PCB,但id号不同,一般子进程的id号大一些
    功能: 通过该函数可以从当前进程中克隆一个同名新进程,子进程从fork函数之后执行

11.父子进程的关系:
    子进程是父进程的副本,子进程获得父进程数据段,堆,栈,正文段共享
    在fork之后,一般情况哪个会先运行是不确定的。如果非要确定哪个先运行,需要IPC机制。
    
区别:  1)fork返回值 > 0 和 ==0
        2)pid不同
    写时复制:子进程数据段只有发生变化的值,才会定义,其他的共享父进程的。消亡的时候,也只需要销毁刚刚定义的一部分。

12.进程的终止:8种情况
主动退出:
    1)main 中 return
    2)exit() 不管你在任何位置,调用exit就会结束,清理函数
    3)_exit,_Exit会关闭所有的已经打开的文件,不执行清理函数。
    4)主线程退出
    5)主线程调用pthread_exie
异常终止:
    1)abort()  
    2)signal kill pid
    3)最后一个线程被pthread_cancle

二、例题
查看父子进程的pid和ppid的变化

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>int a = 20;int	main(int argc, char **argv)
{printf("start...\n");pid_t ret = fork();if(ret > 0){int i = 5;while(i--){printf("father  吃一口 pid:%d, ppid:%d,a:%d \n",getpid(), getppid(), a);sleep(1);} }else if (ret == 0){int i = 5;a = a + 50;while(i--){printf("son  打瓦pid:%d, ppid:%d,a:%d \n",getpid(), getppid(), a);sleep(1);} }else{perror("fork\n");return 1;}//system("pause");printf("a is %d pid:%d, ppid:%d\n",a, getpid(), getppid());return 0;
}


 

http://www.xdnf.cn/news/633745.html

相关文章:

  • 网络编程与axios技术
  • 在飞牛nas系统上部署gitlab
  • aws(学习笔记第四十二课) serverless-backend
  • 人工智能数学基础实验(二):奇异值分解(SVD)-图像处理
  • OpenGL Chan视频学习-6 How Shaders Work in OpenGL
  • git提交通用规范
  • 前端流行框架Vue3教程:27. 依赖注入
  • 基于OpenCV 的人体姿态估计
  • PCM音频数据的编解码
  • ArcGISpro中的空间统计分析(二)
  • CSS传统布局与定位详解与TDK三大标签SEO优化
  • 【二刷力扣】【力扣热题100】今天的题目是:283.移动零
  • 【排序算法】典型排序算法和python 实现
  • 如何使用HiveSQL实现2个字符串间的映射及排序
  • 【排序算法】典型排序算法 Java实现
  • 【排序算法】冒泡排序详解--附详细流程代码
  • CVE-2017-5645源码分析与漏洞复现(反序列化)
  • idea 快捷键大全
  • RabbitMQ核心机制——延迟队列
  • mysql:MVCC机制
  • 【Android】基于SurfaceControlViewHost实现跨进程渲染
  • 【GitHub Pages】部署指南
  • 微信小程序 --三剑客
  • 基于ICEEMDAN-SSA-BP的混合预测模型的完整实现过程
  • 人工智能数学基础实验(三):最小二乘法-数值计算
  • CSS布局(上):浮动基础
  • 使用Python,OpenCV,Tesseract-OCR对自己的运动数据图片进行识别及分析,并使用Matplotlib绘制配速图出来
  • Ubuntu 24.04部署安装Honeyd蜜罐
  • Go 语言基础 2 Func,流程控制
  • Kubernetes(k8s)全面解析:从入门到实践