一、进程和程序以及CPU的相关
1.程序是死的,只占用磁盘空间,不占用系统资源
liyiheng@liyiheng-PC:~/lx$ ls
t
t就是一个程序
运行程序就是一个进程,占用内存,CPU等系统资源(活的)
2.并发
在操作系统中,一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态,但任意时刻点上只有一个进程在运行。
例如:我们可以边聊天边听音乐边看电视,这就是因为并发
3.单道程序设计
所有进程排队一个一个进行,若A阻塞,B排队等待,及时CPU处于空闲状态。而在人机交互时阻塞的出现是必然的,所以这种模型在系统资源利用上及其不合理。
4.多道程序设计
在计算机内存中同时存放几道相互独立的程序,它们在管理程序之下,相互穿插的运行,多道程序设计必须有硬件基础作为保证。
二、虚拟内存和物理内存映射关系
1.CPU和MMU
一个寄存器大小为4字节,MMU:4KB
2.映射
0~3G:user区(u)
3G~4G:内核区(ker)(32位机) 4G=2^32
0~4G:可用范围
内核:操作系统,内核通过MMC映射到物理内存是同一块区域
PCB:进程描述符,本质为struct结构体
user区映射在MMU分开,内核区在一起
3.PCB进程控制块
作用:
①保存ID
代码:
liyiheng@liyiheng-PC:/usr/src/linux-headers-4.15.0-30deepin/include/linux$ cat sched.h
每个进程都有自己的ID:
liyiheng@liyiheng-PC:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 204856 7296 ? Ss 17:00 0:03 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 17:00 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? I< 17:00 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? I< 17:00 0:00 [mm_percpu_wq]
②进程状态
③进程切换时需要保存和恢复的一些CPU寄存器
④描述虚拟地址空间的信息
⑤描述控制终端的信息
⑥当前目录工作位置
⑦umask掩码
⑧文件描述符表
⑨信号相关资源信息
⑩用户ID和组ID
三、环境变量
PATH
SHELL
TERM
LANG
HOME
四、fork函数
1.函数原型:pid_t fork(void)
2.功能:创建一个子进程
3.返回值:
父进程执行,一直到fork()函数,在执行fork()时,生成子进程;在子进程中,fork()函数以上的代码将不会执行,只执行fork()以下的代码,同时返回0,意思是告诉父进程创建子进程成功;在父进程中,fork()之下代码的同样执行,并且返回子进程的pid,因此fork()返回两个值。失败返回-1,返回到父进程。
五、进程共享
遵循读时共享,写时复制的原
六、exec函数族
1.execlp
2.execl
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
int main(int argc,char * argv[])
{
pid_t pid=fork();
if(pid == -1)
{
perror("creat fail\n");
}
else if(pid == 0)
{
//execlp("ls","ls","-l","-h",NULL);
//execlp("date","date",NULL);
execl("./b.out","b.out",NULL);
perror("execlp error\n");
exit(1);
}
else if(pid > 0)
{
sleep(1);
printf("-------parent succeed,my child is %d\n ",pid);
}
return 0;
}
七、回收子进程
1、孤儿进程
父进程先于子进程结束,子进程成为孤儿进程,子进程的父进程成为init进程,称为init进程领养孤儿进程
2.僵尸进程
进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸进程
八、回收子进程资源的函数(每次只能回收一个子进程)
1.wait()函数
功能:
①阻塞等待子进程退出
②回收子进程残留资源
③获取子进程结束状态(退出原因)
2.waitpid(pid_ pid,int *status,int optains)函数
①返回值:
>0:成功回收的子进程的pid
=0:函数调用时,参3指定了WNOHANG,并且没有子进程结束
<0:失败
WNOHANG:非阻塞属性
wpid == waitpid(-1,NULL,WNOHANG);//回收任意子进程;没有结束的子进程,父进程直接返回0
wpid == waitpid(pid,NULL,0);//回收特定pid子进程
waitpid(pid_ pid,int *status,int optains)
pid>0:待回收的子进程pid
pid = -1:任意子进程
pid=0:同组子进程
九、守护进程
1.Linux系统后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件,一般采用以d结尾的名字,脱离控制终端,一般不与用户直接交互,不受用户登录注销影响
2.创建守护进程模型
①创建子进程,父进程退出
②在子进程中创建新会话(setsid函数)
③改变当前目录位置(chdir函数)
④重设文件权限掩码(umask函数)
⑤关闭或重定向文件描述符
⑥守护进程业务逻辑(while())