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

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\n");
 }
 else if(pid > 0)
 {
     printf("parent\n");
 }
 else
 {
     perror("fork");
  }
 return 0;
}


4.父子进程对文件的操作

分为两种:在fork之前open的文件,在fork之后父子进程各自open文件。

在fork之前open的文件:之后父子对文件的操作是一起操作,类似于使用一个文件指针。

在fork之后父子进程各自open文件:父子使用各自的文件指针对文件进行操作。




猜你喜欢

转载自blog.csdn.net/blank2019/article/details/79646144