1、进程的三种状态之间的关系:
2、并发和并行的区别
(1)并发:是指在一段时间内,多个进程一起执行
(2)并行:是特殊的并发,是指两个处理器在同一时间内执行
3、操作系统对作业处理处理方式:
(1)串行处理:由系统各个部件顺序地处理数据的计算机
(2)批处理:是计算机系统中能同时执行两个或多个处理的一种计算方法,主要目的是节省大型和复杂问题的解决时间(a,b,c执行,a遇到阻塞时,b,c不可执行)
(3)多道程序设计:是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。两个或两个以上程序在计算机系统中同处于开始到结束之间的状态。(a,b,c执行,a遇到阻塞时,b,c可以执行)
(4)分时系统:分时是指多个用户分享使用同一台计算机,多个程序分时共享硬件和软件资源。(分段处理a和b,在一个时间片上,所以感觉在同时执行)
(5)实时系统:在一定时间内,控制系统会给出回应
4、内存管理:
(1)简单分页:内存管理以页为单位,一页为4k
(2)虚拟地址:空间不够的情况下,在硬盘上划分一块内存当内存使用的
(3)逻辑地址:某一程序在内存中的实际地址
(4)物理地址:硬件上的地址
5、进程的创建:
(1)创建进程有两种方式:
一是由操作系统创建:操作系统创建的进程之间是平等的,一般不存在资源继承关系
二是由父进程创建:父子进程之间存在隶属关系,子进程又可以创建进程,形成一个进程家族
//系统调用fork是创建一个新进程的唯一方法,进程调用fork函数就创建了一个子进程。创建了一个子进程之后,父进程和子进程争夺CPU,抢到CPU者执行,另外一个挂起等待。若要父进程等待子进程执行完毕后再继续执行,可以在fork操作之后调用wait或waitpid。
//父子进程终止的先后顺序不同会产生不同的结果。
A:在子进程退出前父进程先退出,则系统会让init进程接管子进程。
B:当子进程先于父进程终止,而父进程又没有调用wait函数等待子进程结束,子进程进入僵尸状态,并且会一直保持下去除非系统重启。子进程处于僵尸状态时,内核只保存该进程的一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。如果子进程先于父进程终止,且父进程调用了wait或waitpid函数,则父进程会等待子进程结束。
C.在Linux下,可以简单地将SIGCHLD信号的操作设为SIG_IGN,这样当子进程结束时就不会称为僵尸进程。
(2)使用父进程创建:首先,通过fork()函数拷贝当前进程创建一个子进程,exec()函数负责读取可执行文件并将其载入地址空间开始运行;
(3)fork():复制进程(首先复制PCB属性,再复制进程的实体)==》以页为单位
A.复制进程的方式属于写时拷贝:(优点:提高了fork的效率以及减少了内存的使用)
写时拷贝属于一种可以推迟或者免于拷贝数据的技术,内核此时不会复制整个地址空间,而是让父子进程共享同一个拷贝,只有在需要写入的时候,数据才会被复制,也就是资源只有在需要写入的时候才进行,在此之前,数据只是以读方式共享。
使地址空间上的页的拷贝推迟到了实际发生写入的时候;
例如:在页根本不会写入的时候u,fork()后立即调用了exec(),它们就无需复制了,fork()的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。
B:fork()一次只会产生一个子进程,子进程的执行是从fork()之后开始执行,复制后进程的逻辑地址相同,但物理地址不同;
父进程的返回值是子进程的PID > 1;
子进程的返回值是0;
B:复制进程后父子进程共享的和独立拥有的:
C:僵死进程的产生和解决:
产生:子进程先于父进程结束,父进程没有获得子进程的状态信息/退出码,从而出现了僵死状态;//子进程的退出码存放在PCB中;
子进程一旦没有父进程会被系统init收养,而init也一定会调用wait()
将子进程解决;
解决:父进程调用wait()函数从而接受子进程的退出码
int val = 0;
int wait(&val);
函数返回值是子进程的id,val是用来为返回的退出码申请一块内存空间
WIFEXITED(val) :判断子进程是否结束
WEXITSTATUS(val):返回值是退出码
D:fork函数的作用:
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
E:fork出错可能有两种原因:
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。2)系统内存不足,这时errno的值被设置为ENOMEM。 创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。
(4)exec()系列函数:将子进程替换成新进程的映像//不改变PCB,只改变进程内容
用途:将当前进程替换成一个新进程,且新进程与原进程有相同的PID;
(任何一个进程都会有一个副进程,逻辑关系都存在父子关系)
先将bash复制一分相同的子进程,再用bash的子进程替换ps
execl("/bin/ps","ps","-f",(char*)0);
execlp("ps","ps","-f",(char*)0);//第一个参数不需要给路径
execle("/bin/ps","ps","-f",(char*)0,envp);//多一个环境变量
char *myargv[]={“ps”,”-f”,(char*)0);
execv("/bin/ps",myargv)//将除了第一个参数以外的参数放在数组中,只需要传数组
execvp:类似exclp
execve:类似excle
函数成功则不返回值,失败则返回
#include
Perror(“ ”)://打印错误信息(使用这个函数可以给出错误信息);
替换进程的例子:
6、内存泄漏:
是指在程序运行期间申请的内存空间使用完但没有释放掉,系统既没有回收,此内存也不可被访问,从而在运行期间产生了内存泄漏。//但当进程结束后,系统会自动回收,从而没有内存泄漏现象
7、虚拟内存:
(1)申请1g内存是否成功((1):剩余物理内存给够用(2)剩余物理内存不够(a.有开启虚拟内存,并且虚拟内存够用b.没有开启虚拟内存))
(2)定义:当所进行的进程,系统没有多余的空间来进行,从而可以利用虚拟内存来执行程序//父进程申请的空间子进程也可以用