linux学习之进程篇1
今天学习了看了下赵博那本书进程的一部分,搞懂了些东西,现总结如下: 1.进程的时间片 进程的时间片是由8053的时钟中断实现的,在内核初始化时将8053工作频率设置为100Hz,也就是说每隔10毫秒就发生一次时钟中断,然后由相应的时钟中断程序来实现,这个时钟中断程序名为_timer_interrupt(system_call.s),具体的实现函数是do_timer(),这个C函数在最后执行了sched.c中的schedule()函数。也就是说,每隔10ms执行一次任务切换函数。 2.fork()的实现 看完这个函数,刚才的程序问题也解决了。只可能打印一个This is header!而且是在父进程中实现的。当父进程执行到 fork()创建子进程时,父进程从fork()的下一条语句执行下去。子进程从fork()执行下去。父进程中的fork返回子进程ID,子进程中的fork返回0。 fork()是linux的系统调用。 执行流程如下: fork() //定义在unistd.h ->sys_fork() //sys.h ->system_call0(int,fork) //定义在main.c ->_system_call //system.s ->find_empty_process(),copy_process() //fork.c system_call0其中执行int $0x80,此语句将父进程的cs,eip入栈(这个不理解要去看汇编的int指令执行过程),后面它创建的子进程也是用的这个,这个就是为什么子进程也从fork执行了。_system_call是int $0x80的中断处理函数,这个是在sched_init()中的定义的。_system_call只执行两个函数find_empty_process(),copy_process()。第一个函数在task数组中查找一个空白项。找到后返回数组下标,也就是传说中的PID了。copy_process将这个空白任务数组分配内存,然后将父进程的cs,ip等进程上下文完全复制给它。再把这个新任务的状态设置为就绪态。最后返回这个PID。 这个就是创建进程的执行过程。 |
|