🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
进程
编辑
进程怎么管理
task_struct 核心字段都有哪些
进程(任务)对应的标识符:
如何去查看一个进程的pid?
进程创建
linux中创建进程的方式
1.命令行中直接启动进程(手动启动)
2.通过代码来进程创建
在操作系统加载到内存时,其他进程并不是在操作系统这块内存上加载的。
父进程是什么
bash:命令行解释器
如何获取父进程的ID?
查看进程的第二种方式
工作目录
进程
引入:在内存上的程序就是进程,操作系统内可能会同时存在多个进程,操作系统就要管理所有的进程
进程怎么管理
类似创建结构体,将各个进程的属性放在对应的结构体中,连接所有的结构体,这样操作系统可以很好的管理
进程pcb:进程控制块
就是一个结构体,结构体里放着进程的各种属性(id、代码地址和数据地址、状态、优先级、链接字段等)
对进程的管理,被建模为对进程控制块链表的管理
总结:
什么是进程?
进程=可执行程序+内核数据结构(pcb、….)
内核数据结构:方便os对进程进行管理
task_struct 核心字段都有哪些
Linux中,进程pcb具体是struct task_struct,Linux中采用双链表的形式链接的pcb
进程(任务)对应的标识符:
pid(每一个正在运行的进程都有一个唯一的标识符)
如何去查看一个进程的pid?
1)通过ps(Linux中的"ps"指令用于查看系统中正在运行的进程信息)
//ps ajx是一种用于显示Linux系统进程信息的命令 [BCH@hcss-ecs-6176 9_23]$ ps ajx | head -1 && ps ajx | grep mycode//&& 可以同时执行两个命令 PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 2932 28593 28593 1485 pts/0 28593 S+ 1000 0:00 ./mycode 3906 28927 28926 2057 pts/2 28926 R+ 1000 0:00 grep --color=auto mycode//因为我们使用了grep这个指令,所以查询mycode进程时,也查询到grep的进程
2)通过系统调用的方法去查看pid
谁调用getpid()这个函数,就获取这个进程的pid,需要头文件#include<sys/types.h> #include<unistd.h>code.c文件 #include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() {int i=0;while(i<100){pid_t id=getpid();printf("我是一个进程...,我的pid%d\n",id);sleep(1);i++;}return 0; }[BCH@hcss-ecs-6176 9_23]$ make make: “mycode”是最新的。 [BCH@hcss-ecs-6176 9_23]$ ./mycode 我是一个进程...,我的pid12163//这个进程的pid就是12163 我是一个进程...,我的pid12163 我是一个进程...,我的pid12163 我是一个进程...,我的pid12163
我们可以用进程pid对进程进行控制
例如 kill -9 进程id//这样就可以杀死改id的进程
进程ppid:父进程id
命令行中父进程到底是谁呢?
命令行解释器bash
进程创建
linux中创建进程的方式
1.命令行中直接启动进程(手动启动)
1)在输入指令的时候,回车这样进程就启动了
2)在windows中双击图标的时候,进程就启动了
2.通过代码来进程创建
fork等函数,启动进程的时候,操作系统会创建对应的pcb,本质就是创建进程,一般是通过父进程创建的(父子关系)!
在操作系统加载到内存时,其他进程并不是在操作系统这块内存上加载的。
当操作系统启动后,它会为每个正在运行的进程分配独立的内存空间。操作系统会为每个进程创建一个称为进程控制块(Process Control Block,PCB)的数据结构来管理进程的状态和资源信息。
每个进程的 PCB 包含了进程的代码、数据和堆栈等信息,这些内容被加载到各自的内存空间中。操作系统负责调度不同进程之间的切换,并确保每个进程在其分配的内存空间中运行,从而实现进程间的隔离和保护。
因此,当操作系统加载到内存时,它会为其他进程分配独立的内存空间,并在这些内存空间中加载并运行各个进程的代码和数据。每个进程的内存空间都是相互独立的,彼此之间不会互相干扰。这种隔离和保护机制有助于确保操作系统和各个进程的稳定性和安全性。
父进程是什么
父进程是指在创建一个新进程时生成该新进程的现有进程。
bash:命令行解释器
我们命令行启动的进程,都是bash的子进程
如何获取父进程的ID?
通过getppid函数
#include<stdio.h> #include<sys/types.h> #include<unistd.h> int main() {int i=0;while(i<100){printf("I am a process: myid: %d,parent id: %d\n",getpid(),getppid());//获取父子进程sleep(1);i++;}return 0; }[BCH@hcss-ecs-6176 9_23]$ make gcc -o mycode code.c [BCH@hcss-ecs-6176 9_23]$ ./mycode//加载进程 I am a process: myid: 29912,parent id: 20426//子进程的pid是29912,父进程的pid20426 I am a process: myid: 29912,parent id: 20426 I am a process: myid: 29912,parent id: 20426
task_struct:其中肯定包含pid、ppid
查看进程的第二种方式
除了使用ps命令查看进程,Proc动态目录结构,存放所有存在的进程,目录的名称就是以这个id命名的
该目录下的文件:其中就包含了该进程的所有属性
[BCH@hcss-ecs-6176 9_23]$ ls /proc/25204 -l 总用量 0 dr-xr-xr-x 2 BCH BCH 0 9月 25 10:24 attr -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 autogroup -r-------- 1 BCH BCH 0 9月 25 10:24 auxv -r--r--r-- 1 BCH BCH 0 9月 25 10:24 cgroup --w------- 1 BCH BCH 0 9月 25 10:24 clear_refs -r--r--r-- 1 BCH BCH 0 9月 25 10:16 cmdline -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 comm -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 coredump_filter -r--r--r-- 1 BCH BCH 0 9月 25 10:24 cpuset lrwxrwxrwx 1 BCH BCH 0 9月 25 10:24 cwd -> /home/BCH/9_23//当前目录 -r-------- 1 BCH BCH 0 9月 25 10:16 environ lrwxrwxrwx 1 BCH BCH 0 9月 25 10:16 exe -> /usr/bin/bash//一个进程,能够找到自己的可执行程序 dr-x------ 2 BCH BCH 0 9月 25 10:16 fd dr-x------ 2 BCH BCH 0 9月 25 10:24 fdinfo -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 gid_map -r-------- 1 BCH BCH 0 9月 25 10:24 io -r--r--r-- 1 BCH BCH 0 9月 25 10:24 limits -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 loginuid dr-x------ 2 BCH BCH 0 9月 25 10:24 map_files -r--r--r-- 1 BCH BCH 0 9月 25 10:24 maps -rw------- 1 BCH BCH 0 9月 25 10:24 mem -r--r--r-- 1 BCH BCH 0 9月 25 10:24 mountinfo -r--r--r-- 1 BCH BCH 0 9月 25 10:24 mounts -r-------- 1 BCH BCH 0 9月 25 10:24 mountstats dr-xr-xr-x 5 BCH BCH 0 9月 25 10:24 net dr-x--x--x 2 BCH BCH 0 9月 25 10:24 ns -r--r--r-- 1 BCH BCH 0 9月 25 10:24 numa_maps -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 oom_adj -r--r--r-- 1 BCH BCH 0 9月 25 10:24 oom_score -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 oom_score_adj -r--r--r-- 1 BCH BCH 0 9月 25 10:24 pagemap -r-------- 1 BCH BCH 0 9月 25 10:24 patch_state -r--r--r-- 1 BCH BCH 0 9月 25 10:24 personality -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 projid_map lrwxrwxrwx 1 BCH BCH 0 9月 25 10:24 root -> / -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 sched -r--r--r-- 1 BCH BCH 0 9月 25 10:24 schedstat -r--r--r-- 1 BCH BCH 0 9月 25 10:24 sessionid -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 setgroups -r--r--r-- 1 BCH BCH 0 9月 25 10:24 smaps -r--r--r-- 1 BCH BCH 0 9月 25 10:24 stack -r--r--r-- 1 BCH BCH 0 9月 25 10:16 stat -r--r--r-- 1 BCH BCH 0 9月 25 10:16 statm -r--r--r-- 1 BCH BCH 0 9月 25 10:16 status -r--r--r-- 1 BCH BCH 0 9月 25 10:24 syscall dr-xr-xr-x 3 BCH BCH 0 9月 25 10:24 task -r--r--r-- 1 BCH BCH 0 9月 25 10:24 timers -rw-r--r-- 1 BCH BCH 0 9月 25 10:24 uid_map -r--r--r-- 1 BCH BCH 0 9月 25 10:24 wchan
我们一般查看进程,还是优先使用ps命令
工作目录
工作目录是指当前用户所处的目录,也称为当前工作目录或当前目录。当你在终端中打开一个新的命令行窗口或者执行一个命令时,你所处的目录就是工作目录。
你可以使用
pwd
命令(print working directory)来查看当前工作目录的绝对路径。你也可以使用cd
命令(change directory)来切换工作目录到其他目录。例如,如果你的当前工作目录是 /home/user,那么在终端中执行 pwd 命令会显示 /home/user,执行 cd Documents 命令会将工作目录 切换到 /home/user/Documents。
工作目录在 Linux 中非常重要,因为许多命令和操作都是基于当前工作目录进行的。
总结:
1)一个进程,能够找到自己的可执行程序
2)每一个进程,都有自己的工作目录
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸