进程(2)——进程的创建

2019-07-14 08:37发布

1.
我们知道OS的存在是为了多进程的运行。
而OS实现多进程运行的方法就是进程调度。
进程调度时,OS通过PID来识别进程,通过调整PID的顺序来确定进程执行的顺序,
可见,一个程序如果想有被执行的可能,必须先要有PID,
而PID则是PCB的一个元素,
可见,一个进程执行前的必要条件是先有PCB,
PCB是一个复制的结构体,直接创建一个PCB是很麻烦的,
所以Linux中,一个新进程PCB的创建是由老进程PCB直接复制的,复制完后,再修改新进程PCB中需要修改的元素,一般来说,两个进程的PCB元素内容的重复度是比较高的。
2. 调度表就是一个队列
p0 p1 p2 p3 p4 p5 ...
OS从p0开始依次调度,如果新增了进程,就在队列末尾加一个新的,
虽然每个进程在调度表中只出现一次,但是每个进程的执行时间可能不同,
有些重要的进程分配到的时间会长一些。
3.我们知道了创建一个进程就是创建进程的PCB,而创建PCB的方法就是复制现有PCB,并在此基础上做修改。实际编程中我们使用fork()来创建新的进程。pid_t fork(void);fork返回pid类型,在子进程中返回0,父进程中返回子进程的pid。所以实际编程中可以通过fork的返回值来判断当前进程是子进程还是父进程。int main(int argc, char **argv) { pid_t pid = fork(); if(0 == pid) { printf("child "); } else if(pid > 0) { printf("parent "); } else { perror("fork"); } return 0; }
4.父子进程对文件的操作分为两种:在fork之前open的文件,在fork之后父子进程各自open文件。在fork之前open的文件:之后父子对文件的操作是一起操作,类似于使用一个文件指针。在fork之后父子进程各自open文件:父子使用各自的文件指针对文件进行操作。