Linux内核在2.2版本中引入了线程机制。Linux提供了fork,这是具有传统进程复制功能的系统调用。Linux还提供了系统调用clone,其功能类似于创建一个线程。clone与fork的行为类似,它不是创建调用进程的复制,而是创建一个独立进程以共享原来调用进程的地址空间。通过共享父进程的地址空间,clone任务能像独立线程一样工作。
由于Linux 内核进程的特定表示方式,所以允许共享地址空间。系统内的每个进程都有一个唯一的内核数据结构。不过,该数据结构并不保存该数据结构中进程本身的数据,而是保存了此数据保存出的数据结构的指针。例如每个进程的数据结构都包括其他数据结构(如表示打开文件列表、信号处理信息和虚拟内存等)的指针。当调用fork时,就创建了新进程,它具有父进程的所有相关数据结构的拷贝。当调用clone时,也创建了新进程。但是,新进程并不是复制所有数据结构,而是指向了父进程的数据结构,从而允许子进程共享父进程的内存和其他进程资源。作为系统调用clone 的参数,可传递一些标记的集合,这个标记集用来指出父进程有多少内容被子进程共享了。如果没有设置标记,那么就没有共享且clone与fork一样动作。如果设置了所有五个标记,那么子进程与父进程就共享了一切。其他不同标记的组成形成了这两极之间的不同程度的共享。
有趣的是,Linux并不区分进程和线程。事实上,Linux在讨论程序内的控制流时,通常称之为任务而不是 进程或线程。除了克隆进程外,Linux并不支持多线程、独立数据结构或内核子程序。不过,各种Pthread实现可以用于用户多线程编程。
操作系统--Linux线程
最新推荐文章于 2024-08-22 16:05:15 发布