进程详解(一)
admin
2024-05-06 18:14:07
0

冯诺依曼体系

输入设备、存储器(指的是内存)、运算器、控制器、输出设备

注意:外设包括输入设备和输出设备,外设是相对于内存和CPU说的。所有设备都只能直接和内存访问,CPU能且只能对内存进行读写(在不考虑缓存的情况下),不能访问外设(输入或输出设备)。体系结构规定CPU只能从内存中读取。所以程序运行必须加载到内存中。(为了提高计算效率)

请描述,从你登录上QQ开始和某位朋友聊天开始,数据的流动过程。

打开登录QQ程序,实际上是把QQ程序加载到内存中,CPU在执行QQ程序的代码

键盘–内存–CPU–网卡及 显示器-----网络-----网卡–内存–CPU–显示器

如果是发文件呢?

磁盘–内存–CPU–网卡及 显示器-----网络-----网卡–内存–CPU–显示器及磁盘

操作系统(Operator System)

简称OS,是一个进行软硬件管理的软件。通过合理的软硬件资源管理为用户提供良好的执行环境。

硬件管理:计算机底层的硬件是以冯诺依曼体系结构互相连接的。

软件管理:进程管理、文件系统、内存管理、驱动管理等。

课程主要讲进程管理和文件系统,讲一点点内存管理(这个很难),驱动管理(网卡驱动、磁盘驱动、显示器驱动等)不讲。

操作系统是通过被管理对象的数据进行管理,和底层硬件接触拿到对应的数据,执行用户命令。管理者(OS),执行者(驱动),被管理者(硬件)。

OS的方法就是先描述,再组织。先用面向对象的思路描述所有被管理对象,再用数组结构把它们组织在一起。会提供操作系统接口

linux操作系统是用c语言写的,所以操作系统接口就是C式接口。

用户进行指令操作或者编程操作,通过shell外壳、C/C++lib、界面等操作接口,来完成系统接口的调用。

进程

一个运行起来的(加载到内存)的程序是进程。

先描述:PCB(Process Control Block),进程控制块。

struct task_struct{某进程的所有属性,比如进程ID、优先级、状态、调度;...某进程对应的代码和属性地址;struct task_struct* next;
};

再组织:链表数据结构。

所谓的进程管理,其实就是对PCB进行相关的管理(修改状态、优先级等),不是直接操作进程。就相当于对链表进行增删查等操作。

struct task_struct是内核结构体,用来创建内核对象,操作系统把内核对象和程序、数据关联起来。故进程=内核数据结构+进程对应的磁盘代码。

查看进程

ps ajx | head -1 #能把进程的标题行显示出来
[yyq@VM-8-13-centos 2022_12_08_Process]$ ps ajx | head -1PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMANDps ajx | grep "name" #精确查找某程序的进程
[yyq@VM-8-13-centos 2022_12_08_Process]$ ps ajx | grep "test"25852  2395  2395 25852 pts/0     2395 S+    1001   0:00 ./test2508  3797  3796  2508 pts/1     3796 S+    1001   0:00 grep --color=auto testps ajx | head -1 && ps ajx | grep 'test' #组合使用带标题的某程序进程栏
[yyq@VM-8-13-centos 2022_12_08_Process]$ ps ajx | head -1 && ps ajx | grep 'test'25852  2395  2395 25852 pts/0     2395 S+    1001   0:00 ./test2508  3797  3796  2508 pts/1     3796 S+    1001   0:00 grep --color=auto test

结束进程

kill -9 进程ID/PID #结束进程,PID是进程的编号
[yyq@VM-8-13-centos 2022_12_08_Process]$ kill -9 2395
我是一个进程
我是一个进程
我是一个进程
我是一个进程
Killed

进程再调度运行的时候,进程就具有动态属性!

getpid()是与进程有关的系统调用函数,在2号手册。

进程每次被加载到内存中,都会有一个新的ID。

根目录下的proc

[yyq@VM-8-13-centos 2022_12_08_Process]$ ls /proc/
1      1464   21    25832  3196   647   acpi         fs          meminfo       swaps
10     14795  211   25851  32147  648   buddyinfo    interrupts  misc          sys
108    14921  2125  25852  35     649   bus          iomem       modules       sysrq-trigger
11     14949  22    259    36     65    cgroups      ioports     mounts        sysvipc
11001  14998  23    26     37     654   cmdline      irq         mtrr          timer_list
11239  1535   2332  267    38     657   consoles     kallsyms    net           timer_stats
12     1541   2395  268    387    658   cpuinfo      kcore       pagetypeinfo  tty
13     1542   24    27     4      7     crypto       keys        partitions    uptime
1323   16     25    270    46     8     devices      key-users   sched_debug   version
1324   18     2505  28     48     898   diskstats    kmsg        schedstat     vmallocinfo
1369   18168  2507  283    49     9     dma          kpagecount  scsi          vmstat
14     19     2508  29     50     924   driver       kpageflags  self          xpmem
14107  2      252   292    51     989   execdomains  loadavg     slabinfo      zoneinfo
1443   20     256   293    6      992   fb           locks       softirqs
14569  2068   257   30998  622    9972  filesystems  mdstat      stat[yyq@VM-8-13-centos 2022_12_08_Process]$ ls /proc/2395
attr        coredump_filter  gid_map    mountinfo   oom_score      sched      statm
autogroup   cpuset           io         mounts      oom_score_adj  schedstat  status
auxv        cwd              limits     mountstats  pagemap        sessionid  syscall
cgroup      environ          loginuid   net         patch_state    setgroups  task
clear_refs  exe              map_files  ns          personality    smaps      timers
cmdline     fd               maps       numa_maps   projid_map     stack      uid_map
comm        fdinfo           mem        oom_adj     root           stat       wchan
#当2395号进程被kill,这个目录就进不去了
[yyq@VM-8-13-centos 2022_12_08_Process]$ ll /proc/4228/
total 0
dr-xr-xr-x 2 yyq yyq 0 Dec  9 08:55 attr
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 autogroup
-r-------- 1 yyq yyq 0 Dec  9 08:55 auxv
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 cgroup
--w------- 1 yyq yyq 0 Dec  9 08:55 clear_refs
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 cmdline
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 comm
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 coredump_filter
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 cpuset
lrwxrwxrwx 1 yyq yyq 0 Dec  9 08:55 cwd -> /home/yyq/linux-class/2022_12_08_Process
-r-------- 1 yyq yyq 0 Dec  9 08:55 environ
lrwxrwxrwx 1 yyq yyq 0 Dec  9 08:55 exe -> /home/yyq/linux-class/2022_12_08_Process/test #注意这里指示了源文件的路径
dr-x------ 2 yyq yyq 0 Dec  9 08:55 fd
dr-x------ 2 yyq yyq 0 Dec  9 08:55 fdinfo
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 gid_map
-r-------- 1 yyq yyq 0 Dec  9 08:55 io
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 limits
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 loginuid
dr-x------ 2 yyq yyq 0 Dec  9 08:55 map_files
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 maps
-rw------- 1 yyq yyq 0 Dec  9 08:55 mem
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 mountinfo
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 mounts
-r-------- 1 yyq yyq 0 Dec  9 08:55 mountstats
dr-xr-xr-x 5 yyq yyq 0 Dec  9 08:55 net
dr-x--x--x 2 yyq yyq 0 Dec  9 08:55 ns
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 numa_maps
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 oom_adj
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 oom_score
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 oom_score_adj
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 pagemap
-r-------- 1 yyq yyq 0 Dec  9 08:55 patch_state
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 personality
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 projid_map
lrwxrwxrwx 1 yyq yyq 0 Dec  9 08:55 root -> /
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 sched
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 schedstat
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 sessionid
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 setgroups
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 smaps
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 stack
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 stat
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 statm
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 status
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 syscall
dr-xr-xr-x 3 yyq yyq 0 Dec  9 08:55 task
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 timers
-rw-r--r-- 1 yyq yyq 0 Dec  9 08:55 uid_map
-r--r--r-- 1 yyq yyq 0 Dec  9 08:55 wchan

如果一个程序已经运行起来了(已经被加载到内存中了),一个exe指向的源文件被删除(rm -f /home/yyq/linux-class/2022_12_08_Process/test),某些进程无需依赖其他的进程仍能运行,大部分进程可能会崩溃不能运行。

进程的常见调用

#include 
#include getpid() #获得进程ID
getppid() #获得父进程ID
fork() #创建子进程,函数执行前只有一个父进程,执行后是父进程+子进程,fork后的代码会被父进程和子进程共享函数会返回0给子进程,返回子进程ID给父进程,创建失败则返回-1,故使用fork通常会加上if判断

父进程ID不变,因为父进程是bash。在命令行启动的进程,没有特殊情况下,一般该进程的父进程都是bash。

[yyq@VM-8-13-centos 2022_12_08_Process]$ ll /proc/2508
total 0
lrwxrwxrwx 1 yyq yyq 0 Dec  9 08:46 exe -> /usr/bin/bash

通过fork可以完成并发式编程。多进程多线程很常见!

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...