进程的创建:
创建一个子进程时,子进程的代码是父进程的拷贝,数据各自私有一份。
使用fork和vfork来创建一个进程。fork和vfork的返回值都是pid_t,当返回值为0时表示是父进程,当返回值大于0时,表示的是子进程,当返回值小于0时,进程创建失败
fork和vfork的区别:
fork创建的进程子进程和父进程的运行顺序是由操作系统决定的,vfork创建的进程子进程永远先运行。
进程的调度:
进程调度分为三个层次:
长程调度:创建一个新进程时,执行长程调度,他决定是否将该新建进程添加 到当前活跃或挂起的进程集合中。中程调度:中程调度时内存管理的一部分,他决定是否把一个进程的部分或者全部虚拟地址空间换入内存,或者把一个进程换出到磁盘上。
短程调度:短程调度决定把处理器分派给哪个进程,即在就绪进程队列中选择一个进程去执行。目前所说的调度算法也是针对短程调度的。
进程的调度算法:
执行短程调度的时机只有一个,那就是异常发生时(中断,系统调用,软硬故障)
调度算法:
根据决策模式可以将进程的调度算法分为:非抢占式和抢占式。
非抢占式:一旦运行,就一直执行直到终止,或者因为IO阻塞。也就是说这样的进程不能被抢占。
抢占式:正在运行的进程可能被其他进程抢占,并转移到就绪状态。
抢占发生的时机有:新进程到达时,时间片到期。
非抢占式算法有:FCFS,SPN(short process next最短进程优先)HRRN(Highest Response Ratio Next最高相应比优先)抢占式的算法有:轮转,SRT(Short Remaining Time最短剩余时间)反馈(没有各个进程的运行长度信息时才采用)对IO密集型的进程有利。
进程的状态:
linux进程主要有5个状态:
R(running):运行状态,他表面进程可能在运行队列里要么在运行中
S(sleeping):睡眠状态,进程在等待事件完成可以被中断。
D(disk sleep):磁盘休眠状态,当进程处于D状态时,他不可以被中断。
T(stopped):通过发送SIGSTOP信号来停止进程,被stop的进程可以用 kill SIGCONT继续运行。
X(dead)死亡状态:进程结束的状态。查看不到
Z(zombie)僵尸状态:子进程结束,但是父进程一直不回收,子进程就变成了僵尸(kill -9 pid)杀不掉
查看进程的状态:
ps 命令:
最常用的参数: a(其他用户创建的进程)
x:自己创建的进程
u:启动这个进程的用户和他启动的时间
ps -l pid:显示某个进程的信息
孤儿进程:父进程先与子进程退出,这样子进程就变成了孤儿进程,然后这个子进程会被1号init进程领养,他的ppid也就变成了1
孤儿进程代码模拟:
#include<stdio.h>
#include<sys/types.h>
int main() {
pid_t id = fork();
if(0 == id) {
//sleep()保证父进程先运行,让父进程先挂掉,然后子进程才挂。
sleep(2);
printf("child is running pid=%d, ppid=%d\n", getpid(), getppid());
printf("child become a orphan\n");
sleep(10);
} else if (id > 0) {
printf("father is running pid=%d, ppid=%d\n", getpid(), getppid());
sleep(10);
}
return 0;
}
通过查看进程的pid:
可以发现,当父进程挂掉之后,子进程的ppid变成了1。
僵尸进程:当子进程挂掉之后,父进程不回收,子进程就变成了僵尸进程。
#include<stdio.h>
#include<sys/types.h>
int main(){
pid_t id = fork();
if(id == 0) {
printf("child is running pid=%d, ppid=%d\n", getpid(), getppid());
}else if(id > 0) {
//父进程一直处于休眠状态,未回收子进程
sleep(10);
} else {
printf("error\n");
}
return 0;
}
通过查看进程的pid和ppid:
由于是子进程先运行,子进程退出之后,父进程一直未得到运行,处于休眠状态。子进程就变成了僵尸进程。
环境变量:centos下修改环境变量的方法:
查看PATH:echo $PATH
以添加mongodb server为列
修改方法一:
export PATH=/usr/local/mongodb/bin:$PATH
//配置完后可以通过echo $PATH查看配置结果。
生效方法:立即生效
有效期限:临时改变,只能在当前的终端窗口中有效,当前窗口关闭后就会恢复原有的path配置
用户局限:仅对当前用户
修改方法二:
通过修改.bashrc文件:
vim ~/.bashrc
//在最后一行添上:
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:(有以下两种)
1、关闭当前终端窗口,重新打开一个新终端窗口就能生效
2、输入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用户局限:仅对当前用户
修改方法三:
通过修改profile文件:
vim /etc/profile
/export PATH //找到设置PATH的行,添加
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户
修改方法四:
通过修改environment文件:
vim /etc/environment
在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/usr/local/mongodb/bin”
生效方法:系统重启
有效期限:永久有效
用户局限:对所有用户
VIM的路径:/usr/bin(以备不时之需)