一,进程的概念
1.冯*诺依曼体系结构
二,操作系统
1.概念:任何计算机都包含一个基本的程序集合,叫做操作系统
2.设计OS的目的:1)实现软硬件交互,管理所有的软硬件资源。2)为用户提供一个良好的执行环境
3.定位:搞管理的的软件
4.描述进程——PCB
程序是一个文件。
进程是:《 进程比程序多了一个PCB结构体 》 一个PCB结构体
1.task_struct-PCB
在Linux中描述进程的结构体叫做task_struct。
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
//看到PCB4-4-1 还没有看完
了解操作系统的话,一定要在站在数据结构的层面来进行了解。
一,查看进程:
**1.当对一个程序运行之后,那就是起了一个进程,可以使用 PS 命令**
ps aux | grep 'test'(运行的程序名字)
2.**拿出头属性 --ps aux | head -1**
ps aux | head -1 && ps aux | grep 'test'(运行的程序名字)
3.top也可以查看进程 //相当于windows下的任务管理器
杀死一个进程,不一定需要ctrl +c ,也可以是 kill + 9 + 3420(PID)
二,getpid - 获取当前系统的pid
相关文件:
getpid - 获取当前系统的pid
getppid - 获取当前系统的父进程的pid
三通过系统调用查看进程–fork
参考代码如下:
1 #include<iostream>
2 #include<stdio.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 using namespace std;
6
7 int main()
8 {
9 fork();
10 while(1){
11 cout << " getpid... "<< getpid()<< " getppid... " << getppid() << endl;;
12 sleep(1);
13
14 }
15 return 0 ;
16 }
这里可以看出,创建fork()进程,里面有两个进程
创建父子进程的代码如下:
1 #include<iostream>
2 #include<stdio.h>
3 #include<unistd.h>
4 #include<sys/types.h>
5 using namespace std;
6
7 int main()
8 {
9 // fork();
10 // while(1){
11 // cout << " getpid... "<< getpid()<< " getppid... " << getppid() << endl;;
12 int ret = fork();
13 if(ret < 0){
14
15 perror("fork");
16 return 1;
17 }
18 else if(ret == 0){ //child
19 printf("I am child : %d!, ret: %d\n", getpid(), ret);
20 }else{ //father
21 printf("I am father : %d!, ret: %d\n", getpid(), ret);
22 }
23
24
25 sleep(1);
26 return 0 ;
27 }
四,进程状态
R运行状态(running): 并不意味着进程一定运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
1.僵尸进程:
**概念:**当一个子进程运行完了之后,并不会直接被释放,而是先被维护起来,在维持一段时间【并且父进程没有读取到子进程的状态,子进程进入 Z (死亡进程)状态】。《 一个进程长时间处在僵尸状态吧,不被释放回收,就就会导致内存泄漏问题 》
(1)僵尸进程的危害:
1.不及时回收的话,一直在占内存,就是我们常说的内存泄漏
2.孤儿进程:
概念:父进程先退出,子进程就叫做孤儿进程,但是一旦产生孤儿进程,那么就要立即被领养,被最大的有实力的领养,那么就是操作系统领养。
看父进程的命令:ps axj | head -n1
我们可以看到当父进程退出之后,子进程就会变成1,被系统回收了
五,进程的优先级
权限:是有没有这个权限,看是否能做。
优先级:能做,就是看谁先做
查看优先级:ps -l
PRI:优先级
我们主要看NI–叫做NICE值,
如果PRI = 80,NI= -10,那么我的优先级为70
如果PRI = 80,NI= 10,那么我的优先级为90
所以: 我们真正可以调教优先级值的是NICE值,所以我们吧NICE值叫做Linux下的修正数据,
修改优先级:
我们可以使用 top 命令,然后再按一个 r,记住这是root用户下面,普通用户不能修改,然后我们还可以试一下:优先级最大为99,最小为60,NI的最大范围为0—19,最小范围为-20—0,
六,其他概念:
竞争性 系统进程数量太多但是CPU数量只有少数,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
七,环境变量
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
查看环境变量命令:
echo:$PATH
exprot【也可以创建环境变量,导入到系统的环境变量中】:导出环境变量 export PATH =
P
A
T
H
(
把
老
的
保
存
起
来
,
要
不
容
易
覆
盖
了
)
:
+
添
加
自
己
路
径
(
p
w
d
查
看
自
己
的
路
径
)
∗
∗
e
x
p
o
r
t
P
A
T
H
=
PATH(把老的保存起来,要不容易覆盖了):+添加自己路径(pwd查看自己的路径) **export PATH=
PATH(把老的保存起来,要不容易覆盖了):+添加自己路径(pwd查看自己的路径)∗∗exportPATH=PATH:+添加自己路径**
添加这个路径之后,那么在这个路径下面运行什么程序,都是可以运行的呢
echo: $HOME
当Linux再开启时,为用户打开其默认的工作目录下。
env:查看系统中的大部分环境变量
环境变量:是系统本身定义的环境变量,他有着特殊的用途
八,程序的地址空间
地址空间的描述:
通过上面这张图,我们据可以了解,两个进程在运行时,是相互独立的 ,是通过页表将虚拟地址映射到物理内存上面的,将数据存放再不同的物理内存上面的。
所以: 他们的虚拟地址是相同的,但是物理地址是不同的