进程
线程
通信(本机,网络)
进程的属性和概念:
进程和程序之间的区别是什么:
1进程是动态的
2程序是静态的
readelf -a 名字 读取该程序的所有内容
file a.out 查看该文件的信息
mmu 内存管理单元 是在内核里面
MMU管理内存大小 一个文件,先映射到4个G虚拟内存里面,最后存到真实内存里面。
线程是程序执行和资源管理的最小单位
进程不仅包括程序的指令和数据,而且包括程序计数器值,CPU的所有寄存器以及存储。。。。
进程号PID。
交互进程: 该类进程是由SHELL控制和运行的,交互进程既可以在前台运行,也可以在后台运行。
ps -elf 看运行状态。
CPU在某一时刻,只能运行一个进程
时间片,将CPU的运行时间切成一份一份的,每一份就是一个进程执行的时间t1,时间到,则换一个进程执行。
CPU分为内核模式和用户模式
4个G空间,3G空间为用户空间,,1G空间为内核空间。
内核执行代码权限比较高。
内核模式:特权模式,内核模式的代码可以无限制的访问所有处理器指令集以及全部内存和空间。
用户模式:访问资源受限,部分代码不可以执行。
用户模式靠系统调用,来获得权限。
man手册很重要,一定要掌握怎么用
man 2 系统调用
用户模式的代码允许发生缺页,内核模式的代码则不允许。
int 0x80 系统中断。
ps -l 只显示跟当前终端信息。
pstree 树进程
pstree -p显示进程号
大括号括起来的是线程
top 动态显示系统中的进程
renice调整正在运行的程序优先级
renice -20 PID 将优先级调高 (-20~19)只能调整这么大,稍微调整,不能无限制调整优先级
nice -20 ./a.out 调整优先级
nice -n -20 ./process/basic/a.out
按用户指定的优先级运行进程
kill -l 所有信号。 kill结束进程
SIGALRM14 闹钟信号
9,19号信号,终止进程。。18号信号SIGCONT暂停信号
17信号SIGCHLD 子进程结束的时候会发这个给父进程
jobs 查看后台运行程序 直接输入jobs
./a.out & 放后台运行
bg把已暂停的进程恢复到后台运行
fg 将后台运行的进程放到前台。
进程创建 fork()
fork() 创建一个新的进程,复制一个调用进程,这个新的进程是一个子进程,
拷贝了父进程空间,如果成功,父进程会得到子进程的ID号,并且子进程会返回0
追踪 CTRL +]
反追中 CTRL +t
getpid()获取当前进程的id, getppid()获取父进程的id。
子进程可以获取父进程ID。
fork() .一次调用,两次返回,在父进程中返回子进程的编号,子进程中返回0
创建子进程之后,,子进程和父进程一样拥有CPU,先后运行顺序不确定。
fork()创建子进程之后,两个进程都会从FORK后面的第一条汇编代码执行
fork()执行后,执行赋值语句,然后执行判断语句。
AT定时命令。
{
at 15:34
at> ls ~/ >dev/pts/1
at> ls -l > /dev/pts/1
at> echo"hello at" >/dev/pts/1
atq查看当前任务
atrm 34取消任务
}
crontab定时任务
{
sudo vi /etc/crontab
在这里面输入。
{周期的执行任务
怎么取消任务。。
,可以进去注释掉。
}
当创建一个进程的时候,内核里面会创建一个结构体 task_struct{} //linux.2.6.35/include/linux.c 1100
这个结构体描述了进程的所有信息。
但子进程的代码不在这里,在4G空间里面 。进程return后 4G空间会删掉。。内核里面的结构体却不会没有释放掉。,但因为4G内存已经不存在了,所以这个结构体代表的进程就是僵尸进程。
当父进程结束的时候,子进程的僵尸进程也会释放掉。
写时复制技术。
4G虚拟内存全部映射了,,实际内存中只有改动了的数据才会拷贝。
vfork()
子进程一定先运行。进程结束后要加exit(0);
vfork()的子进程完完全全的共享父进程的物理空间。父进程创建子进程后,保证创建的子进程一定会先运行,运行结束,父进程再运行。子进程结束一定要调用_exit或者exec函数族。否则结果未知。
因为共享同一个物理空间,所以子进程修改的参数,就是父进程的参数,它俩用的是同一个参数。