进程与线程

来源:互联网 发布:php 上传txt 编辑:程序博客网 时间:2024/05/20 08:42

一.进程

进程的概念:指在系统中能独立运行并作为系统分配资源的单位,由一组机器指令,数据和堆栈等组成,是程序执行的体现。

进程的组成:由进程控制块,程序段和数据段组成。

PCB:存放进程的管理和控制信息的称为进程控制块。每个进程都有一个PCB,PCB先创建后销毁

进程的存放:内核将进程存放在一个双向循环链表中,链表的每一项都是一个task_struct结构,称为进程描述符,linux通过slab分配器分配task_struct结构。
     在内核栈的栈底有一个struct thread_info的结构,他的task域存放指向task_struct结构的指针。
     内核通过唯一的PID来标识一个进程,类型pid_t,内核所能允许的pid最大为32768,也是系统能允许同时存在的进程的最大数

写时拷贝:是一种推迟拷贝甚至不拷贝的技术。
当fork()时,内核此时并不复制整个地址空间而是让父进程和子进程共享一个拷贝,只有在写入数据时才真正的去拷贝。

进程的创建:进程通过系统调用do_fork()产生,fork()调用一次返回两次;子进程返回0,父进程返回子进程的PID。
fork(),vfork()都需要去调用clone系统调用去创建子进程,然后clone去调用do_fork()调用copy_process()函数:

1. 创建内核栈,thread_infotask_struct这些值与当前进程的值相同

2. 检查有没有超过可创建进程的个数

3. 设置子进程的状态TASK_UNINTERRUPTIBLE,保证子进程不会投入运行

4. 更新flag,标明是否拥有超级用户权限,设置进程没有调用exec的标志

5. 调用get_pid()为新进程获取一个有效的PID

6. 根据clone的参数  拷贝各种资源

7. 让父进程和子进程共享剩余的时间片

8. 返回指向子进程的指针

再到do_fork。新创建的进程被唤醒并让其投入运行。

一般操作系统会让子进程先执行:防止父进程执行后进行了写入操作,就需要执行真正的拷贝。而让子进程先执

行,如果遇到exec就不需要再执行拷贝了,提高了效率。


vfork()

vforkfork的功能相同,除了不拷贝父进程的页表项。

1. 子进程作为父进程的一个单独线程在父进程的地址空间上运行

2. 父进程被阻塞,直到子进程结束或退出后才继续执行

3. 子进程不能向地址空间写入,只读的

二.线程

线程:线程是进程的一个实体,作为系统调度和分派的基本单位。linux下的线程可以看做轻量级进程,在linux下没
有真正意义上的线程,在内核中,都是进程,线程仅仅被视为和其他进程共享资源的进程(地址空间)。
内核线程:内核线程和普通线程的区别在于,内核线程没有独立的地址空间,他们在内核空间上运行,不会切换到用户空间上运行。可以被调度,抢占。
线程性质:
1.线程是进程内的一个相对独立的可执行单元。即进程的一条执行流。
2.进程在创建时至少为该进程创建一个线程,即进程拥有至少一个线程。
3.同一个进程内的多线程共享该进程的资源,线程本身不拥有资源,只是去使用。
4.线程间不存在父子关系,线程可以创建线程。
在32位操作系统下,系统默认给线程分配8M的空间。因为需要给线程分配空间,且进程的空间是有限的4G,所以一个进程创建的线程个数是有限的300多个。






     

原创粉丝点击