linux学习之进程篇1

来源:百度文库 编辑:神马文学网 时间:2024/04/28 18:56:43
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。
这个就是创建进程的执行过程。