进程详解(一)

冯诺依曼体系

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

注意:外设包括输入设备和输出设备,外设是相对于内存和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 -1
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND

ps 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 ./test
 2508  3797  3796  2508 pts/1     3796 S+    1001   0:00 grep --color=auto test

ps 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 ./test
 2508  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,linux,操作系统)